[RPi3] [Bluez] Управляется подключением к устройству BLE, но не может перечислить атрибуты GATT. - PullRequest
0 голосов
/ 08 ноября 2018

Я делаю проект, в котором мне нужно создать связь между двумя Raspberry Pi 3 по растяжке (RPi) по беспроводной связи с помощью функций обратного вызова с использованием кода C ++. Первый должен отправлять данные второму. Я решил создать связь между этими двумя устройствами с помощью встроенных чипов Bluetooth.

Итак, сначала я решил скомпилировать Linux Bluetooth Stack: Bluez для обоих RPi из исходного кода, версия 5.50. После этого урока: https://learn.adafruit.com/install-bluez-on-the-raspberry-pi/installation на Adafruit. Мне удалось отправить сообщение от одного пи к другому, используя эти коды: https://people.csail.mit.edu/albert/bluez-intro/x502.html. Но чтобы прочитать сообщение, отправленное клиентом, мне нужно вызвать функцию «read (client, buf, sizeof (buf))» как показано в коде сервера, который немного ограничен. Я хочу получать уведомления при получении сообщения, чтобы можно было вызвать функцию обратного вызова. Я понял, что это можно сделать, включив уведомления о характеристиках ГАТТ, используемых для связи.

Этот уровень спецификации на самом деле не показан в кодах C ++, которые я получил от https://people.csail.mit.edu/albert/bluez-intro/x502.html. После того, как я улучшил свои знания по GATT с помощью: https://www.novelbits.io/bluetooth-gatt-services-characteristics/, я решил следовать учебному пособию Tony D по YouTube как использовать Bluez APi https://www.youtube.com/watch?v=5fQR2PHMDWE.

Чтобы сделать это проще, я решил оставить один RPi в стороне и попытался подключить аудиогарнитуру Bluetooth JBL T450BT, которая использует Bluetooth 4.0, поэтому предполагается, что он поддерживает Bluetooth Low Energy.

На bluetoothctl вот проблема, мне удается включить контроллер, включить сканирование и обнаружить гарнитуру. Я тогда доверяю, соединяю и соединяю. В меню GATT я ввожу команду: list-attribute [адрес dev]. Bluetoothctl не печатает никаких ошибок, но ничего не возвращает и готов принять другие командные строки.

sudo bluetoothctl
[bluetooth]# show
Controller XX:XX:XX:XX:XX:XX (public)
Name: VoitureRPi
Alias: VoitureRPi
Class: 0x004c0000
Powered: yes
Discoverable: no
Pairable: yes
UUID: Headset AG                (00001112-0000-1000-8000-00805f9b34fb)
UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
UUID: Handsfree Audio Gateway   (0000111f-0000-1000-8000-00805f9b34fb)
Modalias: usb:v1D6Bp0246d0532
Discovering: no
[bluetooth]# scan on
Device 78:44:05:BC:12:0C JBL T450BT
[bluetooth]# trust 78:44:05:BC:12:0C 
[CHG] Device 78:44:05:BC:12:0C Trusted: yes
Changing 78:44:05:BC:12:0C trust succeeded
[bluetooth]# pair 78:44:05:BC:12:0C 
Attempting to pair with 78:44:05:BC:12:0C
[CHG] Device 78:44:05:BC:12:0C Connected: yes
[CHG] Device 78:44:05:BC:12:0C UUIDs: 00001108-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device 78:44:05:BC:12:0C ServicesResolved: yes
[CHG] Device 78:44:05:BC:12:0C Paired: yes
Pairing successful
[CHG] Device 78:44:05:BC:12:0C ServicesResolved: no
[CHG] Device 78:44:05:BC:12:0C Connected: no
[bluetooth]# connect 78:44:05:BC:12:0C 
Attempting to connect to 78:44:05:BC:12:0C
[CHG] Device 78:44:05:BC:12:0C Connected: yes
Connection successful
[CHG] Device 78:44:05:BC:12:0C ServicesResolved: yes
[JBL T450BT]# menu gatt
[JBL T450BT]# list-attributes 78:44:05:BC:12:0C 
[JBL T450BT]# 

Оттуда я не получаю ответа от bluetoothctl, но также и ошибки, как я уже говорил. Я не могу обнаружить услуги / характеристики. На сайте YouTube, за которым я следовал, было сказано, что обнаружение сервисов и характеристик GATT было сделано во время соединения / первого соединения. Я предполагаю, что Пи намеревается сделать это, но терпит неудачу. Возможно, поэтому я получаю последовательность: подключено: да, ServicesResolved: да успешно соединено, а затем ServicesResolved: нет, подключено нет. Ничего похожего: [NEW] XXX Service или Characteristcs не отображается. Я не думаю, что проблема связана с гарнитурой, потому что она делает то же самое на других устройствах, к которым я подключаюсь. У меня на RPi установлены пакеты pulseaudio и bluealsa.

Как упоминалось в этом туто

Здесь статус Bluetooth:

systemctl status bluetooth
● bluetooth.service - Bluetooth service
Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-11-08 11:29:38 CET; 27min ago
Docs: man:bluetoothd(8)
Main PID: 2646 (bluetoothd)
Status: "Running"
CGroup: /system.slice/bluetooth.service
     └─2646 /usr/local/libexec/bluetooth/bluetoothd --experimental

Вот что дает hciconfig:

hciconfig -a
hci0:   Type: Primary  Bus: UART
BD Address: B8:27:EB:A8:0C:20  ACL MTU: 1021:8  SCO MTU: 64:1
UP RUNNING 
RX bytes:11205 acl:76 sco:0 events:520 errors:0
TX bytes:219869 acl:433 sco:0 commands:150 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: 'VoitureRPi'
Class: 0x4c0000
Service Classes: Rendering, Capturing, Telephony
Device Class: Miscellaneous, 
HCI Version: 4.1 (0x7)  Revision: 0x168
LMP Version: 4.1 (0x7)  Subversion: 0x2209
Manufacturer: Broadcom Corporation (15)

Вот также то, что возвращает инструмент самоанализа D-Bus:

busctl tree org.bluez
└─/org
  └─/org/bluez
     └─/org/bluez/hci0
        └─/org/bluez/hci0/dev_78_44_05_BC_12_0C
          ├─/org/bluez/hci0/dev_78_44_05_BC_12_0C/fd1
          └─/org/bluez/hci0/dev_78_44_05_BC_12_0C/player0

Для людей, у которых возникли проблемы с сопряжением и подключением, этот источник очень помог: https://www.sigmdel.ca/michel/ha/rpi/bluetooth_02_en.html

Во всяком случае, такова моя проблема. Я хочу получить доступ к характеристикам и их UUID, чтобы иметь возможность изменить их разрешение или создать новый сервис с собственными характеристиками, подходящими для моего проекта. На данный момент, я думаю, что это единственный способ реализовать уведомитель с обратным вызовом в связи Bluetooth. Может я не прав. У вас есть какие-либо подсказки? :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...