Equipo

Tengo dos sistemas, a los que me referiré como "computadora portátil" y "sistema integrado". Puedo volver a conectarme a la computadora portátil sin volver a vincularme. Mi problema es que no puedo hacerlo en el sistema integrado.

Estoy conectándome / reconectándome a un dispositivo sin protocolo SPP (protocolo de puerto serie), que asumo que es Bluetooth 2.0, pero no estoy seguro. Hay un botón que puedo presionar para ingresar al modo de emparejamiento, que destella rápidamente un LED azul para mostrar que está en modo de emparejamiento. El dispositivo no entra en modo de emparejamiento a menos que presione el botón.

Si corro sudo sdptool search --bdaddr XX:XX:XX:XX:XX:XX SP (He reemplazado la dirección del dispositivo Bluetooth con XX).

Searching for SP on XX:XX:XX:XX:XX:XX ...
Service Name: (redacted)-SPP
Service RecHandle: 0x10000
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1

Ordenador portátil

El portátil está ejecutando el estándar Ubuntu MATE 16.04, con MATE GUI, bluez 5.37, blueman-applet, bluetoothd y dbus corriendo, python, etc.

Puedo usar el applet de blueman "Configurar nuevo dispositivo ...", que inicia el "Asistente de configuración del dispositivo Bluetooth". Luego presiono el botón del dispositivo, se reconoce el dispositivo, elijo emparejarme, elijo conectarme al puerto serie. Me dan / dev / rfcomm0, que funciona para comunicarme con el dispositivo. Veo "Completamente" debajo del nombre del dispositivo en blueman-applet (No estoy seguro de qué significa "Completamente" en este contexto, pero parece indicar un buen estado).

Si luego apago la computadora portátil y el dispositivo, luego los enciendo nuevamente, el applet blueman aún muestra el dispositivo y puedo conectarlo al puerto serie. No se necesita emparejamiento.

Sistema Integrado

El sistema incorporado es un dispositivo ARM que ejecuta OpenWRT, con bluez 5.47 instalado. No hay GUI o blueman-applet. El sistema no ejecuta bluetoothd ni dbus (aunque ambos están disponibles) y no tiene instalado Python. Se me permite ejecutar bluetoothd y / o dbus, pero solo si son necesarios. No se me permite instalar python bajo ninguna circunstancia, por lo que si requiero una funcionalidad que solo proporcionan los scripts de python, tendré que transferirlo a C. Si resulta que es necesario, cualquier sugerencia sobre qué scripts necesitaré a puerto sería bienvenido.

En el sistema integrado pongo el dispositivo en modo de emparejamiento, luego emito estos comandos:

echo 1234 | sudo /usr/bin/btmgmt --index hci0 pair XX:XX:XX:XX:XX:XX
sudo /usr/bin/rfcomm -i hci0 bind 0 XX:XX:XX:XX:XX:XX 1

Entonces puedo conectarme a / dev / rfcomm0.

Si apago el dispositivo Bluetooth y emito estos comandos, puedo volver a conectarme:

sudo /usr/bin/rfcomm -i hci0 release 0
sudo /usr/bin/rfcomm -i hci0 connect 0 XX:XX:XX:XX:XX:XX 1

Sin embargo, si apago y enciendo el sistema integrado, obtengo:

Can't connect RFCOMM socket: Operation now in progress

Y si vuelvo a intentarlo:

Can't connect RFCOMM socket: Connection refused

Corriendo sudo hcidump -X da:

< HCI Command: Create Connection (0x01|0x0005) plen 13
    bdaddr XX:XX:XX:XX:XX:XX ptype 0xcc18 rswitch 0x01 clkoffset 0x0000
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 
> HCI Event: Command Status (0x0f) plen 4
    Create Connection (0x01|0x0005) status 0x00 ncmd 1
> HCI Event: Connect Complete (0x03) plen 11
    status 0x00 handle 11 bdaddr XX:XX:XX:XX:XX:XX type ACL encrypt 0x00
< HCI Command: Read Remote Supported Features (0x01|0x001b) plen 2
    handle 11
> HCI Event: Command Status (0x0f) plen 4
    Read Remote Supported Features (0x01|0x001b) status 0x00 ncmd 1
> HCI Event: Read Remote Supported Features (0x0b) plen 11
    status 0x00 handle 11
    Features: 0xff 0xee 0x8d 0xfa 0x9b 0xef 0x79 0x83
< HCI Command: Read Remote Extended Features (0x01|0x001c) plen 3
    handle 11 page 1
> HCI Event: Command Status (0x0f) plen 4
    Read Remote Extended Features (0x01|0x001c) status 0x00 ncmd 1
> HCI Event: Read Remote Extended Features (0x23) plen 13
    status 0x00 handle 11 page 1 max 1
    Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
< HCI Command: Remote Name Request (0x01|0x0019) plen 10
    bdaddr XX:XX:XX:XX:XX:XX mode 2 clkoffset 0x0000
< ACL data: handle 11 flags 0x00 dlen 10
    L2CAP(s): Info req: type 2
> HCI Event: Command Status (0x0f) plen 4
    Remote Name Request (0x01|0x0019) status 0x00 ncmd 1
> HCI Event: Max Slots Change (0x1b) plen 3
    handle 11 slots 5
> ACL data: handle 11 flags 0x02 dlen 12
    L2CAP(s): Info rsp: type 2 result 1
      Not supported
< ACL data: handle 11 flags 0x00 dlen 12
    L2CAP(s): Connect req: psm 3 scid 0x0040
> HCI Event: Number of Completed Packets (0x13) plen 5
    handle 11 packets 2
> HCI Event: Remote Name Req Complete (0x07) plen 255
    status 0x00 bdaddr XX:XX:XX:XX:XX:XX name '(redacted)'
> ACL data: handle 11 flags 0x02 dlen 16
    L2CAP(s): Connect rsp: dcid 0x0041 scid 0x0040 result 3 status 0
      Connection refused - security block
> HCI Event: Disconn Complete (0x05) plen 4
    status 0x00 handle 11 reason 0x05
    Reason: Authentication Failure

Por supuesto, si luego presiono el botón de emparejamiento y comienzo de nuevo con btmgmt, etc., puedo conectarme. Sin embargo, no puedo usar eso como mi solución porque necesito poder emparejar el dispositivo una vez y luego conectarme automáticamente después de eso.

Desde la salida de hcidump, mi suposición es que la clave generada durante el proceso de emparejamiento inicial se ha perdido (o al menos no está cargada). He pasado unos días tratando de entender el código fuente de bluez, e incluso mirando el código fuente del módulo del kernel para tratar de entender lo que está pasando, pero el código es muy confuso para mí, creo que porque todo está pasando dbus, y luego a través de HCI ... o algo así, realmente tengo muy poca idea de lo que está pasando con la pila de Bluetooth. Hasta ahora no he podido averiguar dónde estaba ocurriendo la generación de claves de emparejamiento o dónde se estaban conservando las claves en el disco.

Pregunta

Sin ejecutar bluetoothd / dbus (y no tener python), ¿cómo puedo volver a conectarme a través de la consola a un dispositivo previamente emparejado después de apagar y encender el sistema?

Si eso no es posible, ¿cómo puedo volver a conectarme como se indica arriba si tengo bluetoothd / dbus en ejecución (pero aún no tengo Python)?

Si eso tampoco es posible, ¿en qué archivo de código fuente se encuentra el código de generación de la clave de emparejamiento (la función también sería útil), en qué archivo de código fuente / función se encuentra el código de persistencia de la clave y dónde se almacenan las claves de emparejamiento en el disco? ¿Alguna otra sugerencia sobre cómo piratearlo para hacer lo que quiero?

¡Muchas gracias!

calamari
fuente