Italian [Risolto]Bluetooth

stefanoxjx

Active Member
Licensed User
Longtime User
Ciao a tutti ragazzi, è un pezzo che non scrivo in questo forum.
Avrei bisogno del vostro aiuto.
Ho già aperto una discussione sul forum in inglese, ma non ne vengo fuori, probabilmente anche a causa della mia carenza con l'inglese.
Avrei necessità di imbastire un'app veloce che invii un pacchetto dati ad un modulo BLE.
Purtroppo, sono anni che non metto mano a B4A (e non ricordo più nulla), in aggiunta c'è il modulo BLE di cui so ben poco.
Sono 3 giorni che ci giro attorno ma senza esiti positivi, quindi a questo punto sono costretti a chiedere aiuto.
Tramite l'app LighBlue riesco ad inviare dati sul modulo tramite questi servizi/caratteristiche/descrittori (non ho ancora capito bene come distinguere le 3 cose):
65333333-a115-11e2-9e9a-0800200ca101
2.png


Ho quindi provato ad adattare questa app https://www.b4x.com/android/forum/t...guration-descriptor-0x2902.81881/#post-559930 per avere un punto di partenza, ma alla riga dove dovrebbe inviare il dato mi da questo errore:

Si è verificato un errore in linea: 141 (BT_Service)
java.lang.reflect.InvocationTargetException
su java.lang.reflect.Method.invoke (metodo nativo)
su anywheresoftware.b4a.keywords.Common.CallSubDebug2 (Common.java:1055)
su rn4020. my_chat.main._btnsend_click (main.java:996)
at java.lang.reflect.Method.invoke (Native Method)
presso anywheresoftware.b4a.shell.Shell.runMethod (Shell.java:732)
presso anywheresoftware.b4a.shell. Shell.raiseEventImpl (Shell.java:348)
a anywheresoftware.b4a.shell.Shell.raiseEvent (Shell.java:255)
a java.lang.reflect.Method.invoke (Metodo nativo)
in anywheresoftware.b4a.ShellBA.raiseEvent2 ( ShellBA.java:144)
su anywheresoftware.b4a.BA.raiseEvent2 (BA.java:197)
su anywheresoftware.b4a.BA.raiseEvent (BA.java:193)
su anywheresoftware.b4a.objects.ViewWrapper $ 1.onClick (ViewWrapper.java:80)
su android .view.View.performFare clic su (View.java:6291)
su android.view.View $ PerformClick.run (View.java:24931)
su android.os.Handler.handleCallback (Handler.java:808)
su android.os. Handler.dispatchMessage (Handler.java:101)
su android.os.Looper.loop (Looper.java:166)
su android.app.ActivityThread.main (ActivityThread.java:7523)
su java.lang.reflect.Method.invoke (Metodo nativo)
su com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:245)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
Causato da: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
presso anywheresoftware.b4a.debug.Debug.CallSub4 (Debug.java: 336)
at anywheresoftware.b4a.debug.Debug.CallSubNew2 (Debug.java:285)
... Altri 21
causati da: java.lang.reflect.InvocationTargetException
su java.lang.reflect.Method.invoke (Native Method)
presso anywheresoftware .b4a.debug.Debug.CallSub4 (Debug.java:318)
... altri 22
causati da: java.lang.RuntimeException: servizio non trovato
su anywheresoftware.b4a.objects.BleManager2.getService (BleManager2.java:397)
a anywheresoftware.b4a.objects.BleManager2.WriteData (BleManager2.java:350)
a rn4020.my_chat.bt_service._writepkt (bt_service.java:535)
a rn4020.my_chat.bt_service._sendstr (bt_service.java:214)

La riga incriminata contiene: manager.WriteData("65333333-a115-11e2-9e9a-0800200ca101", "00002902-0000-1000-8000-00805f9b34fb", D)
Ho provato anche a cambiare questi id con altri nelle varie combinazioni, ma niente da fare.

Qualche idea?
Grazie.
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Ciao a tutti ragazzi, è un pezzo che non scrivo in questo forum.
Avrei bisogno del vostro aiuto.
Ho già aperto una discussione sul forum in inglese, ma non ne vengo fuori, probabilmente anche a causa della mia carenza con l'inglese.
Avrei necessità di imbastire un'app veloce che invii un pacchetto dati ad un modulo BLE.
Purtroppo, sono anni che non metto mano a B4A (e non ricordo più nulla), in aggiunta c'è il modulo BLE di cui so ben poco.
Sono 3 giorni che ci giro attorno ma senza esiti positivi, quindi a questo punto sono costretti a chiedere aiuto.
Tramite l'app LighBlue riesco ad inviare dati sul modulo tramite questi servizi/caratteristiche/descrittori (non ho ancora capito bene come distinguere le 3 cose):
65333333-a115-11e2-9e9a-0800200ca101
View attachment 97833

Ho quindi provato ad adattare questa app https://www.b4x.com/android/forum/t...guration-descriptor-0x2902.81881/#post-559930 per avere un punto di partenza, ma alla riga dove dovrebbe inviare il dato mi da questo errore:



La riga incriminata contiene: manager.WriteData("65333333-a115-11e2-9e9a-0800200ca101", "00002902-0000-1000-8000-00805f9b34fb", D)
Ho provato anche a cambiare questi id con altri nelle varie combinazioni, ma niente da fare.

Qualche idea?
Grazie.
la variabile D come è dichiarata? metti un pezzetto di codice. Cosi non si capisce

l'uso è il seguente:
B4X:
Dim Data() as byte
manager.WriteData(ServiceName, CharatteristicName,Data)

Oppure
B4X:
manager.WriteData(ServiceName, CharatteristicName,Text.GetBytes(mEncoding))

Qui trovi un elenco di servizi e caratteristiche
 
Last edited:

stefanoxjx

Active Member
Licensed User
Longtime User
Ciao e grazie per la risposta.
Ti posto le definizioni globali degli uuid e la funzione incriminata:
B4X:
Sub Process_Globals
...
    Private BTSERVICE As String = "65333333-a115-11e2-9e9a-0800200ca101"
    'Private MLDP_PRIVATE_SERVICE As String = "00002902-0000-1000-8000-00805f9b34fb"
    Private MLDP_DATA_PRIVATE_CHAR As String = "65333333-a115-11e2-9e9a-0800200ca101"
End Sub

B4X:
Sub writePkt
' if the string to send is longer than 20 bytes (BLE limit) this breaks
' it down to multiple "packets" of 20 to complete the message.
    If msgLen = 0 Then  Return    'meer dan 19 bytes werkt niet
    
    If msgLen > 20 Then
        msgPkt = msgAll.SubString2(msgPtr,msgPtr+20)
        msgPtr = msgPtr+20
        msgLen = msgLen -20
    Else
        msgPkt = msgAll.SubString(msgPtr)
        msgLen = 0
    End If

    Dim D() As Byte = msgPkt.GetBytes("UTF8")
    delay(125)    '125 sending multiple back to back packets fails without this delay.
    
    manager.WriteData(BTSERVICE, MLDP_DATA_PRIVATE_CHAR, D)
    manager.SetNotify(MLDP_PRIVATE_SERVICE, MLDP_DATA_PRIVATE_CHAR, True)
End Sub

Se ti serve altro fammi sapere.
Grazie.
 

Star-Dust

Expert
Licensed User
Longtime User
Per verificare i servizi e le caratteristiche che supporta il dispositivo poi usare questo codice:
B4X:
Private Sub manager_Connected (Services As List)
    ' Lista servizi
    For Each s As String In Services
        manager.ReadData(s)
    Next
End Sub

Private Sub manager_DataAvailable (Service As String, Characteristics As Map)
    ' Lista servizi e caratteristiche
    For Each id As String In Characteristics.Keys
        Log(id & " - " & Characteristics.Get(id))
    Next
End Sub

Cosi con i log ti puoi assicurare che i servizi richiesti siano erogati dal dispositivo.


Nell'errore mi pare di aver capito che il servizio non è contenuto nel dispositivo:
causati da: java.lang.RuntimeException: servizio non trovato
su anywheresoftware.b4a.objects.BleManager2.getService (BleManager2.java:397)
a anywheresoftware.b4a.objects.BleManager2.WriteData (BleManager2.java:350)
a rn4020.my_chat.bt_service._writepkt (bt_service.java:535)
a rn4020.my_chat.bt_service._sendstr (bt_service.java:214)

Ultime riflessoni:
  1. ti sei assicurato che la connessione si andata a buon fine? è stato sollevato l'evento manager_Connected ?
  2. Hai richiesto i permessi di runtime?
  3. E i permessi nel manifest?
 

stefanoxjx

Active Member
Licensed User
Longtime User
Per verificare i servizi e le caratteristiche che supporta il dispositivo poi usare questo codice:
B4X:
Private Sub manager_Connected (Services As List)
    ' Lista servizi
    For Each s As String In Services
        manager.ReadData(s)
    Next
End Sub

Private Sub manager_DataAvailable (Service As String, Characteristics As Map)
    ' Lista servizi e caratteristiche
    For Each id As String In Characteristics.Keys
        Log(id & " - " & Characteristics.Get(id))
    Next
End Sub

Cosi con i log ti puoi assicurare che i servizi richiesti siano erogati dal dispositivo.
Ho inserito il codice che mi hai dato nelle rispettive chiamate.
Ti posto il log completo così magari puoi ricavare anche qualche altra informazione utile, ma le righe inerenti le modifiche introdotte
tramite il tuo codice iniziano con "STE: "
** Activity (main) Pause, UserClosed = false **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
*** Service (bt_service) Create ***
** Service (bt_service) Start **
BT State = Powered On
Scanning
Found: , 1D:30:69:2D:AD:46, RSSI = -61, (MyMap) {-1=[B@a5adccb, 0=[B@7f80ca8}
Found: , 38:F9:D3:20:DB:23, RSSI = -79, (MyMap) {1=[B@a68c3c1, -1=[B@2865766, 0=[B@b87aa7}
Found: , 69:2F:CA:0E:DE:D8, RSSI = -81, (MyMap) {1=[B@8154b54, -1=[B@4fcdafd, 0=[B@71083f2}
Found: , 70:3A:60:EB:9B:86, RSSI = -80, (MyMap) {1=[B@9681a43, 10=[B@c25c8c0, -1=[B@3c129f9, 0=[B@39eed3e}
scan stopped
Scanning
Found: TEST, DB:38:03:98:58:6D, RSSI = -61, (MyMap) {1=[B@f189f4a, 7=[B@b408ebb, -1=[B@59befd8, 9=[B@f891f31, 0=[B@5c96616}
TEST connected
Found: , 38:F9:D3:20:DB:23, RSSI = -85, (MyMap) {1=[B@edf5b97, -1=[B@cc3184, 0=[B@e1f7d6d}
Found: , 1D:30:69:2D:AD:46, RSSI = -59, (MyMap) {-1=[B@aedcda2, 0=[B@9341a33}
Found: , 69:2F:CA:0E:DE:D8, RSSI = -72, (MyMap) {1=[B@19ce1f0, -1=[B@c438369, 0=[B@6ff21ee}
Discovering services.
Manager-Connected-EVENT
00001800-0000-1000-8000-00805f9b34fb
00001801-0000-1000-8000-00805f9b34fb
65333333-a115-11e2-9e9a-0800200ca100
ae5d1e47-5c13-43a0-8635-82ad38a1381f
BT connected
DA
65333333-a115-11e2-9e9a-0800200ca100
(MyMap) {65333333-a115-11e2-9e9a-0800200ca101=[B@30c268f, 65333333-a115-11e2-9e9a-0800200ca102=[B@1862d1c, 65333333-a115-11e2-9e9a-0800200ca103=[B@787ed25}
STE: 65333333-a115-11e2-9e9a-0800200ca101 - [B@30c268f
STE: 65333333-a115-11e2-9e9a-0800200ca102 - [B@1862d1c
STE: 65333333-a115-11e2-9e9a-0800200ca103 - [B@787ed25
Main DA
ID=65333333-a115-11e2-9e9a-0800200ca101
BuildMessage 0
0
ID=65333333-a115-11e2-9e9a-0800200ca102
BuildMessage 0
0
ID=65333333-a115-11e2-9e9a-0800200ca103
BuildMessage 0
0
DA
00001800-0000-1000-8000-00805f9b34fb
(MyMap) {00002a00-0000-1000-8000-00805f9b34fb=[B@ebf6efa, 00002a01-0000-1000-8000-00805f9b34fb=[B@aae9cab, 00002a04-0000-1000-8000-00805f9b34fb=[B@756ff08}
STE: 00002a00-0000-1000-8000-00805f9b34fb - [B@ebf6efa
STE: 00002a01-0000-1000-8000-00805f9b34fb - [B@aae9cab
STE: 00002a04-0000-1000-8000-00805f9b34fb - [B@756ff08
Main DA
ID=00002a00-0000-1000-8000-00805f9b34fb
BuildMessage 7
7
ID=00002a01-0000-1000-8000-00805f9b34fb
BuildMessage 2
2
ID=00002a04-0000-1000-8000-00805f9b34fb
BuildMessage 10
10
DA
00001801-0000-1000-8000-00805f9b34fb
(MyMap) {00002a05-0000-1000-8000-00805f9b34fb=[B@9ef36a1}
STE: 00002a05-0000-1000-8000-00805f9b34fb - [B@9ef36a1
Main DA
ID=00002a05-0000-1000-8000-00805f9b34fb
BuildMessage 0
0
DA
ae5d1e47-5c13-43a0-8635-82ad38a1381f
(MyMap) {a47f7608-2e2d-47eb-913b-75d4edc4de4b=[B@f0580c6, a3dd50bf-f7a7-4e99-838e-570a086c661b=[B@1b85887, a2e86c7a-d961-4091-b74f-2409e72efe26=[B@5e103b4}
STE: a47f7608-2e2d-47eb-913b-75d4edc4de4b - [B@f0580c6
STE: a3dd50bf-f7a7-4e99-838e-570a086c661b - [B@1b85887
STE: a2e86c7a-d961-4091-b74f-2409e72efe26 - [B@5e103b4
Main DA
ID=a47f7608-2e2d-47eb-913b-75d4edc4de4b
BuildMessage 0
0
ID=a3dd50bf-f7a7-4e99-838e-570a086c661b
BuildMessage 0
0
ID=a2e86c7a-d961-4091-b74f-2409e72efe26
BuildMessage 0
0

Nell'errore mi pare di aver capito che il servizio non è contenuto nel dispositivo:
Potrebbe anche essere visto che non ho ancora capito la differenza tra service/characheristic/descriptor.
Magari sto usando un descriptor come servizio o simili.

Ultime riflessoni:
ti sei assicurato che la connessione si andata a buon fine? è stato sollevato l'evento manager_Connected
Sembrerebbe di si dal log

Hai richiesto i permessi di runtime?
E i permessi nel manifest?

Ho preso il codice di un'app esistente e funzionante, quindi deduco sia tutto ok.
Al primo avvio comunque mi è stato chiesto di dare i permessi e ovviamente ho cliccato su "Consenti"
 

Star-Dust

Expert
Licensed User
Longtime User
"65333333-a115-11e2-9e9a-0800200ca101" è il servizio GATT, e va messo come primo parametro. Dai log risulta che il servizio è corretto.
B4X:
manager.WriteData("65333333-a115-11e2-9e9a-0800200ca101", CharatteristicName,Data)

Invece sembra che questa caratteristica "00002902-0000-1000-8000-00805f9b34fb" non sia supportata.
Ma vedo queste altre:
00002a00-0000-1000-8000-00805f9b34fb​
00002a01-0000-1000-8000-00805f9b34fb​
00002a04-0000-1000-8000-00805f9b34fb​

Prova così
B4X:
 Private BTSERVICE As String = "65333333-a115-11e2-9e9a-0800200ca101"
'Private MLDP_PRIVATE_SERVICE As String = "00002902-0000-1000-8000-00805f9b34fb"
Private MLDP_DATA_PRIVATE_CHAR As String = "00002a1-0000-1000-8000-00805f9b34fb"
 

stefanoxjx

Active Member
Licensed User
Longtime User
Niente da fare, ho provato con tutti e 3 gli uuid:
B4X:
00002a01-0000-1000-8000-00805f9b34fb
00002a02-0000-1000-8000-00805f9b34fb
00002a04-0000-1000-8000-00805f9b34fb

ma ricevo sempre lo stesso errore.
 

Star-Dust

Expert
Licensed User
Longtime User
Che dispositivo tenti di collegare?
 

stefanoxjx

Active Member
Licensed User
Longtime User
Il dispositivo è un elettrodomestico.
Tieni presente che tramite LightBlue e altre app simili riesco ad inviargli dati, non riesco da B4A :(
 

Star-Dust

Expert
Licensed User
Longtime User
É strano, ci sarà qualche altro errore.

sendstr cos'è ?
 

stefanoxjx

Active Member
Licensed User
Longtime User
sendstr cos'è ?
B4X:
Public Sub SendStr(Data As String)  'CallSub2(BT_Service, "SendStr", "Chat test" & CR) 'identify app to RN4020.
                                    '    Public CR As String = Chr(13) & Chr(10)
    Log("Sending: " & Data)
    msgAll = Data
    msgAll = msgAll & CR_LF
    msgLen = msgAll.Length
    msgPtr=0
    
    writePkt
End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
Tieni presente che tramite LightBlue e altre app simili riesco ad inviargli dati, non riesco da B4A :(
l'Unica cosa che mi viene in mente e che non ti stai collegando alla stessa periferica.

Perché LightBlue ti colleghi con questo servizio/descrittore "65333333-a115-11e2-9e9a-0800200ca101" con queste caratteristiche "00002902-0000-1000-8000-00805f9b34fb" . Nella periferica che mi hai mostrato nei log non ha le stesse caratteristiche.
L'errore da quello che hai postato è generato da sendst/writepkt nell'istruzione WriteData di BleManager2, non trova il servizio in questione

B4X:
causati da: java.lang.RuntimeException: servizio non trovato
su anywheresoftware.b4a.objects.BleManager2.getService (BleManager2.java:397)
a anywheresoftware.b4a.objects.BleManager2.WriteData (BleManager2.java:350)
a rn4020.my_chat.bt_service._writepkt (bt_service.java:535)
a rn4020.my_chat.bt_service._sendstr (bt_service.java:214)

Oppure stai sbagliando servizio. i servizi supportati sembrano questi:
65333333-a115-11e2-9e9a-0800200ca100
65333333-a115-11e2-9e9a-0800200ca101
65333333-a115-11e2-9e9a-0800200ca102
65333333-a115-11e2-9e9a-0800200ca103
Prova gli altri servizi
 
Last edited:

stefanoxjx

Active Member
Licensed User
Longtime User
l'Unica cosa che mi viene in mente e che non ti stai collegando alla stessa periferica.
Riverifico, ma la periferica sono sicuro al 99,9% che è quella, anche perchè nell'app ho specificato che si colleghi solo alla periferica che ha quel nome specifico.

Perché LightBlue ti colleghi con questo servizio "65333333-a115-11e2-9e9a-0800200ca101" con queste caratteristiche "00002902-0000-1000-8000-00805f9b34fb" . Nella periferica che mi hai mostrato nei log non ha le stesse caratteristiche.
L'errore da quello che hai postato è generato da sendst/writepkt nell'istruzione WriteData di BleManager2, non trova il servizio in questione
Quella che inizia con 00002902 non ho ancora capito se è una caratteristica o un descrittore, ma lo trovo all'interno di una delle caratteristiche che finiscono con ca101 e ca102 (vedi in fondo all'immagine):
2.png


Oppure stai sbagliando servizio. i servizi supportati sembrano questi:

B4X:
65333333-a115-11e2-9e9a-0800200ca100
65333333-a115-11e2-9e9a-0800200ca101
65333333-a115-11e2-9e9a-0800200ca102
65333333-a115-11e2-9e9a-0800200ca103
Prova gli altri servizi

No aspetta, ora che pensavo di aver iniziato a capire qualcosa tra servizi e caratteristiche mi stai mettendo in confusione.
Pensavo che il servizio fosse "65333333-a115-11e2-9e9a-0800200ca100" e le caratteristiche quelle che finiscono con ca101, ca102, ca104!?!?!?
 

Star-Dust

Expert
Licensed User
Longtime User
Servizio "65333333-a115-11e2-9e9a-0800200ca101"
caratteristiche "00002902-0000-1000-8000-00805f9b34fb"

Ogni periferica, offre diversi servizi. Ogni servizio ha diverse caratteristiche.
1596122720168.png
 

stefanoxjx

Active Member
Licensed User
Longtime User
Ho fatto varie prove ma non ne vengo fuori.
L'unica cosa che mi viene da pensare è che con LightBlue, se voglio vedere dati arrivare al modulo BT devo cliccare sul pulsante "subscribe", altrimenti dice di aver inviato ma non ricevo nulla.
A parte che questo non dovrebbe (secondo me) far crashare il programma ma al massimo dovrebbe fare come LightBlue, ma a parte le mie opinioni, non è che ci sia una qualche sorta di istruzione di sottoscrizione?
 

stefanoxjx

Active Member
Licensed User
Longtime User
Forse ho fatto un piccolo passo avanti.
Ora mettendo come servizio il "ca100" e come caratteristica il "ca101" non crasha più, però non ricevo dati.
Tramite un'altra app che sichiama "BLE Scanner" ho visto che succede la stessa cosa a meno che io non attivi (tramite l'app) il flag "INDICATE".
Potreste dirmi a cosa serve e se c'è modo di settarlo da B4A?

Grazie.
 

Star-Dust

Expert
Licensed User
Longtime User
Last edited:

stefanoxjx

Active Member
Licensed User
Longtime User
Ho trovato la funzione "SetIndication", ma anche impostando quella non ricevo nulla.
Ora mi leggo i link che mi hai passato.
Non so più dove sbattere la testa :(
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Non so più dove sbattere la testa :(

mi sembra di capire che hai un programma che riesce a connettersi e a dialogare (al tuo post #13 hai messo uno screenshot), è così ??

una soluzione un po' brutale (ma a volte efficiente) è quella di prendere un PC con il BlueTooth (meglio se con Linux), usare il programma WireShark e analizzare il traffico che genera il programma che ti funziona e (cercare) di capire quali comandi invia.

https://wiki.wireshark.org/Bluetooth
 

stefanoxjx

Active Member
Licensed User
Longtime User
Alla fine ci sono riuscito.
Bisognava impostare l'indicator prima del dataWrite, mentre io l'avevo impostato dopo come succede per il notify.
A questo punto devo verificare se i dati in ricezione sono corretti, spero di si.
Grazie a tutti per l'aiuto.
 
Top