Как получить данные с весов тела как CBPeripheral с помощью BLE (Bluetooth Low Energy) на iOS

Я только начал использовать Bluetooth и хочу считывать результаты измерения состава тела со шкалы (модель: adeVital Analysis BA 1401) через Bluetooth.

Когда я настроил свой iPhone как центральный и подключил его к весам (это CBPeripheral), я могу прочитать информацию о весах устройства, такую ​​как номер версии оборудования, производитель и т. Д. Я не могу получить фактические данные измерений.

Я перебрал все сервисы и характеристики и установил флаг уведомления.

[peripheral setNotifyValue:YES forCharacteristic:aCharacteristic]

для каждой характеристики. И метод делегата

- (void) peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {

вызывается без ошибок. Когда я проверяю обновленное периферийное устройство, я обнаруживаю следующее:

<CBCharacteristic: 0x1740949b0, UUID = 8A82, properties = 0x20, value = <a1014711 f3000000 00000000 00000000 00000000>, notifying = YES>

Все это происходит при включении весов (еще ничего не измерив). Теперь, когда я встаю на весы и измерение завершено, отображается значок Bluetooth, указывающий на передачу данных, однако приложение iOS не получает никаких уведомлений. Что мне не хватает?

Итак, вкратце: периферийное устройство подключается к центральному и обновляет характеристику до, которую оно измеряет, но после этого больше никаких уведомлений не появляется.

Может ли значение в обновленной характеристике CBC быть UUID для службы, на которую мне придется каким-то образом подписаться, чтобы получить фактические данные?

Надеюсь, кто-нибудь сможет мне помочь здесь

РЕДАКТИРОВАТЬ:

Поскольку это может быть актуально, вот услуги и характеристики, которые я получаю:

Services:
"<CBService: 0x17407dc40, isPrimary = YES, UUID = Device Information>",
"<CBService: 0x174070f80, isPrimary = YES, UUID = 7802>"

Characteristics
"<CBCharacteristic: 0x1740959a0, UUID = Serial Number String, properties = 0x2, value = (null), notifying = NO>",
"<CBCharacteristic: 0x174095900, UUID = Hardware Revision String, properties = 0x2, value = (null), notifying = NO>",
"<CBCharacteristic: 0x1740952c0, UUID = Firmware Revision String, properties = 0x2, value = (null), notifying = NO>",
"<CBCharacteristic: 0x1740958b0, UUID = Manufacturer Name String, properties = 0x2, value = (null), notifying = NO>",
"<CBCharacteristic: 0x174095860, UUID = Software Revision String, properties = 0x2, value = (null), notifying = NO>"

"<CBCharacteristic: 0x170095ea0, UUID = 8A21, properties = 0x20, value = (null), notifying = NO>",
"<CBCharacteristic: 0x170095e50, UUID = 8A22, properties = 0x20, value = (null), notifying = NO>",
"<CBCharacteristic: 0x1700952c0, UUID = 8A20, properties = 0x2, value = (null), notifying = NO>",
"<CBCharacteristic: 0x170095e00, UUID = 8A81, properties = 0x8, value = (null), notifying = NO>",
"<CBCharacteristic: 0x170095db0, UUID = 8A82, properties = 0x20, value = (null), notifying = NO>"

РЕДАКТИРОВАТЬ 2:

CBCharacteristics имеет следующие свойства:

8A20 = Read
8A21 = Indicate
8A22 = Indicate
8A81 = Write
8A82 = Indicate

все остальные свойства - BOOL NO

Когда я включаю уведомления для 8A21, 8A22 и 8A82, я получаю NSData от 8A82 в самом начале, когда шкала включена (так что это не может быть измерением в этой точке). Полагаю, актуальные данные измерений обновляются по характеристике 8А21. Однако он не уведомит моего делегата, и я не могу понять, почему.

Просматривая системный журнал, вы можете увидеть, что официальное приложение производителя выводит журнал следующим образом:

Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = receive push data(<a1018b3b 02000000 00000000 00000000 00000000>),with command(a1), from characteristic(8A82)
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = receive randomnumber (37456641)
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = next step is :operating_receive_random_number
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = next step is :operating_write_xor_results
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write command with data:<200eff57 c5>
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write command data((null)) to characteristic(8A81)
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write success with status - operating_write_xor_results
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = next step is :operating_write_utc_time
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write command with data:<02033b8b 0b>
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write command data((null)) to characteristic(8A81)
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write success with status - operating_write_utc_time
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = next step is :operating_write_disconnect
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write command with data:<22>
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write command data((null)) to characteristic(8A81)
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = write success with status - operating_write_disconnect
Feb 20 14:19:49 i6S lifesensehealth1_1[4163]: message = next step is :operating_uploaded_results_process

person stm    schedule 07.12.2014    source источник
comment
Хорошо известный UUID сервиса весов: 0x181d - developer.bluetooth.org/gatt/services/Pages/ вы видите эту службу на своем устройстве?   -  person Paulw11    schedule 07.12.2014
comment
Нет, ни 0x181B (состав тела), ни 0x181D (весы). Дополнительная информация: при использовании официального приложения производителя необходимо выполнить сопряжение (InApp) шкалы перед считыванием ее значений. Возможно ли / вероятно, что для связи с весами необходимо обменять privateKey, хотя связь BLE не помечена как зашифрованная?   -  person stm    schedule 07.12.2014
comment
Да, если он не использует хорошо известную службу, тогда он должен использовать проприетарную службу, а это означает, что вам нужно будет перепроектировать их протокол. Характеристика 0x8A81 предназначена только для записи, поэтому вам, вероятно, потребуется отправить на нее некоторые конкретные данные о вызове.   -  person Paulw11    schedule 07.12.2014
comment
На этом соединении нет шифрования. Как сказал Paulw11, вам нужно записать в него данные о вызове. См. Мой включенный ответ.   -  person Zimano    schedule 16.11.2015


Ответы (1)


Сначала вам нужно записать некоторые данные в определенную характеристику. В моем случае эта характеристика была 8A81. Я написал байтовый массив кода времени UTC, который я сгенерировал с помощью алгоритма, который я не могу здесь опубликовать. Попробуйте записать в него любой 5-байтовый массив / символ и посмотрите, что произойдет (например: [1,1,1,1,1])

person Zimano    schedule 16.11.2015
comment
Собственно, разобрался. В конце концов, это было не так уж сложно, поскольку всю информацию о том, как создать определенные данные, которые необходимо записать в характеристику, можно найти в системном журнале (приложение adeVital регистрирует их как отладочную информацию). - person stm; 26.03.2016