Discussione [Domanda]Demone BT Raspian-Raspberrypi

Stato
Discussione chiusa ad ulteriori risposte.

AwaKeDDD

Utente Silver
26 Febbraio 2010
143
11
8
81
Buon giorno a tutti,
sono nuovo dell'ambiente linux e avrei la necessità di creare un demone che sia avvii con l'accensione del mio mio raspberry.
Il demone in qeustione dovrebbe controllare ogni 100ms (possibile?) se la seriale rfcomm è in ascolto sulla seriale hci0, se lo è aspettare 100 ms per il nuovo controllo, mentre se non è in ascolto lanciare i seguenti tre comandi:
Codice:
- sudo /etc/init.d/bluetooth restart
- sdptool add sp
- sudo rfcomm listen hci0
 
Ultima modifica da un moderatore:
Per piacere posta i risultati di
Codice:
 hciconfig -a

quando hci0 è montato e quando non lo è?
Non utilizzo il bluethoot però vediamo se ne esce fuori qualcosa di buono
 
Per piacere posta i risultati di quando hci0 è montato e quando non lo è?

hci0 montato:
Codice:
pi@raspberrypi ~ $ hciconfig -a
hci0:    Type: BR/EDR  Bus: USB
    BD Address: 5C:F3:70:62:1A:70  ACL MTU: 1021:8  SCO MTU: 64:1
    UP RUNNING 
    RX bytes:8316 acl:69 sco:0 events:360 errors:0
    TX bytes:7177 acl:72 sco:0 commands:285 errors:0
    Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
    Link policy: RSWITCH SNIFF 
    Link mode: SLAVE ACCEPT 
    Name: 'raspberrypi-0'
    Class: 0x400100
    Service Classes: Telephony
    Device Class: Computer, Uncategorized
    HCI Version: 4.0 (0x6)  Revision: 0x1000
    LMP Version: 4.0 (0x6)  Subversion: 0x220e
    Manufacturer: Broadcom Corporation (15)

hci0 non montato non resituisce nulla.

Se serve posso spiegare dettagliamente da cosa è dovuta questa mia richiesta, magari esiste una soluzione più veloce
 
Ultima modifica da un moderatore:
hci0 montato:
Codice:
pi@raspberrypi ~ $ hciconfig -a
hci0:    Type: BR/EDR  Bus: USB
    BD Address: 5C:F3:70:62:1A:70  ACL MTU: 1021:8  SCO MTU: 64:1
    UP RUNNING 
    RX bytes:8316 acl:69 sco:0 events:360 errors:0
    TX bytes:7177 acl:72 sco:0 commands:285 errors:0
    Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
    Link policy: RSWITCH SNIFF 
    Link mode: SLAVE ACCEPT 
    Name: 'raspberrypi-0'
    Class: 0x400100
    Service Classes: Telephony
    Device Class: Computer, Uncategorized
    HCI Version: 4.0 (0x6)  Revision: 0x1000
    LMP Version: 4.0 (0x6)  Subversion: 0x220e
    Manufacturer: Broadcom Corporation (15)

hci0 non montato non resituisce nulla.

Se serve posso spiegare dettagliamente da cosa è dovuta questa mia richiesta, magari esiste una soluzione più veloce
Quindi suppongo che se crei un file con dentro questo
Codice:
#!/bin/bash
if [[  $(hciconfig -a |grep hci0) ]]; then
echo 1
else
echo 0
fi
exit 0
E lo esegui una volta quando hci0 è montato e una volta no, ipotizzo che quando è montato ti stampi 1, quando non lo è 0, confermi?

- - - Updated - - -

vabbè in caso di risposta positiva eccoti il codice completo
Codice:
#!/bin/bash
while true
do
if [[  $(hciconfig -a |grep hci0) ]]; then
        sleep 10
else
        sudo /etc/init.d/buetooth restart && sdptool add sp && sudo rfcomm listen hci0
fi
done

crea un hook in init.d che ti ripenda questo script e via (i comandi sono quelli che hai scritto te, io personalmente avrei fatto altro, comunque modificali come più ti pare)

Tu vuoi un daemon quindi ovviamente ricordati nohup altrimenti te lo tieni attaccato alla shell ;)
 
E lo esegui una volta quando hci0 è montato e una volta no, ipotizzo che quando è montato ti stampi 1, quando non lo è 0, confermi?

Tutto questo funziona correttamente, ma mi sa che mi sono espresso male..

Per essere più chiaro ti faccio una piccola premessa della mia configurazione:
-Sto utilizzando un rpi con sopra raspian
-Sul pettine c'è montata una schedina creata da un mio amico che scrive sulla serial ttyAMA0
-Attaccato al rpi c'è un dongle bluetooth
-Sul mio telefono Android ho un app che si mette in ascolto sul bluetooth creando una seriale virtuale
-ho scritto un programma stupido che eseguito sul raspberry legge i dati che riceve dalla ttyAMA0, li codifica e li trasmette in bluetooth scrivendo sopra rfcomm che è in ascolto sul device hci0

(spero di non aver scritto cazzate fino ad ora)

Il tutto funziona però ho un problema, nel momento in cui cade la connessione BT, da parte del telefono che lo scollego oppure da parte del rpi, anche se ridò i comandi

Codice:
sdptool add sp
sudo rfcomm listen hci0

non riesco più a riconnettermi anche se da terminale sembra andare, per sembra andare intendo che come risultato a
Codice:
sudo rfcomm listen hci0
mi risponde
Codice:
 Waiting for connection on channel 1

Dopo questo codice nessun dispositivo riesce a connettersi al raspy, ho notato che facendo un restart del demone bluetooth e rimettendo in ascolto la seriale rfcomm sul device hci0 il tutto funziona.

leggendo la tua risposta e analizzando meglio il comportamento del rpi sono in crisi, poichè dopo che è avvenuta una disconnessione il comando hciconfig -a mi risponde come scritto precedentemente, e se provo a scrivere
Codice:
ls /dev/ |grep rfcomm
mi risponde
Codice:
rfcomm0
Quindi per me è come se tutto stia funzionando.
L'unica soluzione per me penso sia capire quando mi si disconnette (non so bene in che modo), riavviare il demone BT e rimettere in ascolto la seriale rfcomm sul dongle hci0.
Sono aperto ad ogni possibile soluzione.
Se ho scritto cazzate scusatemi ma sono un newbe in ambiente linux :C
 
Tutto questo funziona correttamente, ma mi sa che mi sono espresso male..

Per essere più chiaro ti faccio una piccola premessa della mia configurazione:
-Sto utilizzando un rpi con sopra raspian
-Sul pettine c'è montata una schedina creata da un mio amico che scrive sulla serial ttyAMA0
-Attaccato al rpi c'è un dongle bluetooth
-Sul mio telefono Android ho un app che si mette in ascolto sul bluetooth creando una seriale virtuale
-ho scritto un programma stupido che eseguito sul raspberry legge i dati che riceve dalla ttyAMA0, li codifica e li trasmette in bluetooth scrivendo sopra rfcomm che è in ascolto sul device hci0

(spero di non aver scritto cazzate fino ad ora)

Il tutto funziona però ho un problema, nel momento in cui cade la connessione BT, da parte del telefono che lo scollego oppure da parte del rpi, anche se ridò i comandi

Codice:
sdptool add sp
sudo rfcomm listen hci0

non riesco più a riconnettermi anche se da terminale sembra andare, per sembra andare intendo che come risultato a
Codice:
sudo rfcomm listen hci0
mi risponde
Codice:
 Waiting for connection on channel 1

Dopo questo codice nessun dispositivo riesce a connettersi al raspy, ho notato che facendo un restart del demone bluetooth e rimettendo in ascolto la seriale rfcomm sul device hci0 il tutto funziona.

leggendo la tua risposta e analizzando meglio il comportamento del rpi sono in crisi, poichè dopo che è avvenuta una disconnessione il comando hciconfig -a mi risponde come scritto precedentemente, e se provo a scrivere
Codice:
ls /dev/ |grep rfcomm
mi risponde
Codice:
rfcomm0
Quindi per me è come se tutto stia funzionando.
L'unica soluzione per me penso sia capire quando mi si disconnette (non so bene in che modo), riavviare il demone BT e rimettere in ascolto la seriale rfcomm sul dongle hci0.
Sono aperto ad ogni possibile soluzione.
Se ho scritto cazzate scusatemi ma sono un newbe in ambiente linux :C

Ok,.. vediamo un po'.. quando tutto funziona e dai questo comando cosa ti stampa?
Codice:
hciconfig -a |grep hci0

e cosa stampa quando invece sorge il problema che hai descritto?
 
Mi sembra la stessa cosa, torno a casa domani sera sul tardi, provo e ti faccio sapere nello specifico l'output
 
Ok,.. vediamo un po'.. quando tutto funziona e dai questo comando cosa ti stampa?
Codice:
hciconfig -a |grep hci0

e cosa stampa quando invece sorge il problema che hai descritto?

mi risponde sempre
Codice:
 hci0:   Type: BR/EDR  Bus: USB

Magari sono sbaglio io come approccio per rimettere in ascolto la seriale rfcomm sul dispositivo hci0
 
mi risponde sempre
Codice:
 hci0:   Type: BR/EDR  Bus: USB

Magari sono sbaglio io come approccio per rimettere in ascolto la seriale rfcomm sul dispositivo hci0

E se invece togli il controllo sulla rgex che ti risponde? (Sempre una volta quando è tutto apposto, una volta quando da il problema)
 
E se invece togli il controllo sulla rgex che ti risponde? (Sempre una volta quando è tutto apposto, una volta quando da il problema)

Mentre sta andando
Codice:
pi@raspberrypi ~ $ hciconfig -ahci0:   Type: BR/EDR  Bus: USB
        BD Address: 5C:F3:70:62:1A:70  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING
        RX bytes:4036 acl:38 sco:0 events:174 errors:0
        TX bytes:3747 acl:40 sco:0 commands:135 errors:0
        Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH SNIFF
        Link mode: SLAVE ACCEPT
        Name: 'raspberrypi-0'
        Class: 0x400100
        Service Classes: Telephony
        Device Class: Computer, Uncategorized
        HCI Version: 4.0 (0x6)  Revision: 0x1000
        LMP Version: 4.0 (0x6)  Subversion: 0x220e
        Manufacturer: Broadcom Corporation (15)

E lo stesso quando non va, ora non so se sto dicendo qualcosa di sbagliato, ma il dongle BT hci0 sembra andare correttamente.
Il problema sembra più orientato sulla seriale rfcomm in ascolto su di essa che dopo una prima connessione non si riesce a rimettere in ascolto

Non c'è modo di captare questo Disconnected?
Codice:
 pi@raspberrypi ~ $ sudo rfcomm listen hci0
Waiting for connection on channel 1
Connection from CC:FA:00:38:14:DF to /dev/rfcomm0
Press CTRL-C for hangup
^CDisconnected
quando mi scollego da pc o da telefono genera quel messaggio, se esiste qualche modo di captarlo sarebbe tutto risolto

- - - Updated - - -

Scrivo un secondo post e non faccio un aggiornamento per non fare troppi casini.

Ho notato che quando sono connesso con il BT se provo a dare da terminale

Codice:
ls /dev/ |grep rfcomm
Mi risponde
Codice:
rfcomm0
che sparisce nel momento in cui mi disconnetto
Tutto questo sarebbe perfetto se:
-questo comportamento lo avrebbe sembre, invece succede solo la prima volta. Dalla seconda in poi rfcomm rimane in /dev/ anche quando non funziona
-rfcomm giustamente non è presente in /dev/ finchè non mi ricollego e non posso versare un controllo su questo evento se no ogni volta che non sono collegato riavvio il demone bt e non lascio tempo di restare in ascolto sul device hci0
 
E se invece togli il controllo sulla rgex che ti risponde? (Sempre una volta quando è tutto apposto, una volta quando da il problema)

E se faccio partire i tre comandi direttamente dal demone? Almeno ho tutto quello che mi serve e non ricevo output dall'esterno. Solo che non ho le conoscenze per completarlo, la mia idea è qualcosa simile a questa

Codice:
[COLOR=#333333]#!/bin/bash
[/COLOR]sudo /etc/init.d/buetooth restart && sdptool add sp && sudo rfcomm listen hci0[COLOR=#333333]
[/COLOR]while true
do
if [[ <intercetto messaggio di disconnect oppure vedo se è in ascolto (nel secondo caso basterebbe invertire l'if)> ]]; then
        sleep 100
else
        sudo /etc/init.d/buetooth restart && sdptool add sp && sudo rfcomm listen hci0
fi
done
 
Ho risolto il problema! per me si può anche chiudere.. a chi interessa la soluzione
Codice:
aggiungere a /etc/rc.local
 
prima della riga exit 0
 
printf "Add serial port rfcomm0\n"
sdptool add sp; rfcomm watch hci0 > /dev/null 2>&1 &
 
Stato
Discussione chiusa ad ulteriori risposte.