Piattaforma PlatformIO - framework: Arduino - board: rpipicow - core: earlephilhower
S.O.: windows 10 - Scheda: Raspberry Pi Pico W
Ho già fatto altre domande sul bluetooth, ma trattavano argomenti diversi, seppur in parte collegati.
In pratica ho un Raspberry Pi Pico W che collego al PC tramite bluetooth classic: col protocollo HID emula una tastiera/mouse e joypad e contemporaneamente crea un canale di comunicazione seriale RFCOMM per dialogare col PC per trasmettere altri dati di controllo, che nulla hanno a che vedere con le interfacce HID. Il PC mi riconosce regolarmente il dispositivo con i due servizi HID e RFCOM a cui ci abbina una porta COM.
Il problema è che da PC non riesco ad aprire la porta COM creata per dialogare col micro, in quanto mi dice che è già occupata da un altra applicazione.
Se però connetto il micro solo col 'canale' RFCOM, ovvero senza la parte che gestisce HID, la porta COM me la fa aprire senza problemi e la comunicazione funziona.
Inoltre ho trovato un altra anomalia, ovvero che se sul micro eseguo prima il codice di configurazione per creare il canale RFCOM e poi quello per la HID, il PC mi riconosce il dispositivo, lo associa, ma lo disconnette subito, mentre facendo l'inverso, lo riconosce e lo connette senza problemi, ma non mi fa accedere alla porta COM creata per RFCOM.
Ho usato le librerie PicoBluethootHID e SerialST, un poco modificate all'avvio per evitare che mi chiamino due volte le funzioni di inizializzazione l2cap_init(); e sdp_init(); ed altre cose duplicate.
A qualcuno è già successa una cosa simile ? Sapete come risolvere ?
Ho cercato tanto su internet, ma non sono riuscito a trovare nulla di utile.
Grazie
Non conosco nel dettaglio l'hardware che stai usando, però il fatto che tu stia usando due librerie diverse e soprattutto che se cambi l'ordine di inizializzazione hai comportamenti diversi mi fa sospettare che le due librerie interferiscano tra loro.
Io proverei a creare i profili BLE di cui hai bisogno usando le API fornite dal core senza passare per librerie.
Sarà sicuramente più "complesso", ma hai il controllo completo del tuo firmware.
Dopo mille prove, debug ecc.ecc., penso di aver capito il problema, ovvero che windows mi riconosce il pico w come un unico dispositivo con due servizi (HID e RFCOMM) e connettendo subito il dispositivo HID, considera già connessa anche la porta RFCOMM, che pertanto non mi fa connette a nessuna app in quanto risulta già connessa.
A questo punto mi chiedo se è possibile fare in modo che windows mi riconosca non una singolo dispositivo con 2 servizi, ma due dispositivi diversi, ovvero uno col servizio HID e l'altro col solo servizio RFCOMM. Oppure se esiste un qualche modo per disassociare la connessione tra i due servizi. Se qualcuno riesce ad aiutarmi lo ringrazio, altrimenti passerò altri giorni e giorni a fare tentativi.
Questo è attualmente il codice che gestisce 'gap':
// Allow finding via inquiry
gap_discoverable_control(1);
// Use Limited Discoverable Mode; Peripheral; Keyboard as CoD
gap_set_class_of_device(hidClass);
// Set local name to be identified - zeroes will be replaced by actual BD ADDR
gap_set_local_name(localName);
// Allow for role switch in general and sniff mode
gap_set_default_link_policy_settings(LM_LINK_POLICY_ENABLE_ROLE_SWITCH | LM_LINK_POLICY_ENABLE_SNIFF_MODE);
// Allow for role switch on outgoing connections - this allow HID Host to become master when we re-connect to it
gap_set_allow_role_switch(true);