Sono a chiedervi un favore
In una mia app leggo dei tempi tramite seriale da un apparecchiatura e sterna e dopo n. letture (valore scelto dall'utente da 1 a 5) invio un sms con i dati letti.
Ho dei problemi a testare il codice in quanto:
1) il tablet che uso non ha il supporto alla SIM
2) sono all'estero e con i costi di roaming mi mangio tutto.
Se qualche anima buona con più esperienza di me può guardarmi il codice e darmi un parere ...
In pratica in una schermata imposto dei numeri di telefono abilitati alla trasmissione dei dati quindi:
Grazie
In una mia app leggo dei tempi tramite seriale da un apparecchiatura e sterna e dopo n. letture (valore scelto dall'utente da 1 a 5) invio un sms con i dati letti.
Ho dei problemi a testare il codice in quanto:
1) il tablet che uso non ha il supporto alla SIM
2) sono all'estero e con i costi di roaming mi mangio tutto.
Se qualche anima buona con più esperienza di me può guardarmi il codice e darmi un parere ...
B4X:
Sub SMSReceptor_MessageReceived (From As String, Body As String)
' in questa procedura analizzo l'sms e lo gestisco
ToastMessageShow(From, True)
If chk_attiva_sms_in.Checked = False Then Return ' se non è attiva la spunta esce dalla routine
Dim presente As Boolean
presente = False
' verifico che provenga da un numero abilitato
If chk_in_1.Checked =True Then
If txt_in_tel_1.Text.Length >4 Then
If From = txt_in_tel_1.Text Then presente=True
End If
End If
If chk_in_2.Checked =True Then
If txt_in_tel_2.Text.Length >4 Then
If From = txt_in_tel_2.Text Then presente=True
End If
End If
If chk_in_3.Checked =True Then
If txt_in_tel_3.Text.Length >4 Then
If From = txt_in_tel_3.Text Then presente=True
End If
End If
If chk_in_4.Checked =True Then
If txt_in_tel_4.Text.Length >4 Then
If From = txt_in_tel_4.Text Then presente=True
End If
End If
If chk_in_5.Checked =True Then
If txt_in_tel_5.Text.Length >4 Then
If From = txt_in_tel_5.Text Then presente=True
End If
End If
If chk_in_6.Checked =True Then
If txt_in_tel_6.Text.Length >4 Then
If From = txt_in_tel_6.Text Then presente=True
End If
End If
If presente=False Then Return ' termina la routine se il mittente non è un tablet
' decodifico il messaggio
'2#123#12#22#15#123#P§ ' messaggio singolo
'2#123#12#22#15#123#P§2#124#13#22#16#000#P
' dove
'2 id zona
'123 numero
' 12 ore
' 22 minuti
' 15 secondi
' 123 millesimi di secondo
' P posizione
'§ separatore blocco
'# separatore campo
Dim messaggi() As String
Dim parti_sms() As String
messaggi=Regex.Split ("§",Body)
If messaggi.Length -1 <0 OR messaggi.Length -1=0 Then Return ' se la coda è vuota esce
Dim delta As Int
Dim aggiunta,tempo,stringa,numero, linea,ps As String
For i=0 To messaggi.Length -1 'esegue il ciclo per ogni messaggio presente nel body
parti_sms=Regex.Split ("#",messaggi(i))
If chk_com.Checked =False Then Return ' se la porta com è chiusa termina la routine
If lst_protocollo.SelectedItem="Orologio" Then
' protocollo master
If parti_sms(2).Length < 2 Then
delta=2-parti_sms(2).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(2)=aggiunta & parti_sms(2)
End If
delta=0
aggiunta=""
If parti_sms(3).Length < 2 Then
delta=2-parti_sms(3).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(3)=aggiunta & parti_sms(3)
End If
delta=0
aggiunta=""
If parti_sms(4).Length < 2 Then
delta=2-parti_sms(4).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(4)=aggiunta & parti_sms(4)
End If
delta=0
aggiunta=""
If parti_sms(5).Length < 3 Then
delta=3-parti_sms(5).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(5)=aggiunta & parti_sms(5)
End If
delta=0
aggiunta=""
numero= parti_sms(1)
tempo=parti_sms(2) & parti_sms(3) & parti_sms(4) & parti_sms(5)
Select Case (parti_sms(6))
Case "P"
linea="A"
Case "I1"
linea="B"
Case "I2"
linea="C"
Case "A"
linea="C"
End Select
stringa="+K"& linea & numero &"=" & tempo
astreams1.Write(stringa.GetBytes("UTF8"))
lbl_log_seriale.Text = "Dati Seriale (OUT) <-- " & stringa
Sleep(250)
Else
' protocollo radioamatori
'00200999122211443 P partenza
'00200999122211443 A arrivo
'00200999122211443 T tempo
'pppnnnnnhhmmssdcm__L decodifica
'2#123#12#22#15#123#P§
If parti_sms(2).Length < 2 Then
delta=2-parti_sms(2).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(2)=aggiunta & parti_sms(2)
End If
delta=0
aggiunta=""
If parti_sms(3).Length < 2 Then
delta=2-parti_sms(3).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(3)=aggiunta & parti_sms(3)
End If
delta=0
aggiunta=""
If parti_sms(4).Length < 2 Then
delta=2-parti_sms(4).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(4)=aggiunta & parti_sms(4)
End If
delta=0
aggiunta=""
If parti_sms(5).Length < 3 Then
delta=3-parti_sms(5).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(5)=aggiunta & parti_sms(5)
End If
delta=0
aggiunta=""
'decodifica e tabba numero
If parti_sms(1).Length <5 Then
delta=5-parti_sms(1).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(1)=aggiunta & parti_sms(1)
End If
numero= parti_sms(1)
'decodifica e tabba ps
If parti_sms(0).Length <3 Then
delta=3-parti_sms(0).Length
For i=1 To delta
aggiunta=aggiunta & "0"
Next
parti_sms(0)=aggiunta & parti_sms(0)
End If
ps= parti_sms(0)
' compila stringa out
tempo=parti_sms(2) & parti_sms(3) & parti_sms(4) & parti_sms(5) 'ok
Select Case (parti_sms(6))
Case ("P")
linea=" P"
Case ("A")
linea=" A"
End Select
'pppnnnnnhhmmssdcm__L decodifica
stringa=ps & numero & tempo & linea
astreams1.Write(stringa.GetBytes("UTF8"))
lbl_log_seriale.Text = "Dati Seriale (OUT) <-- " & stringa
Sleep(250)
End If
Next
End Sub
In pratica in una schermata imposto dei numeri di telefono abilitati alla trasmissione dei dati quindi:
- alla ricezione del messaggio verifico che provenga da uno di questi numeri
- nel caso il numero sia "valido" e abilitato
- decodifico messaggio
- invio i dati su web server e/o su porta seriale
Grazie
Last edited: