2016-03-17 8 views
2

Я экспериментирую с Bluetooth LE с GATT, и я столкнулся с проблемой, с которой мне нужна ваша помощь.Устройство BLE не может отправить несколько уведомлений GATT в строке

Я отправляю данные между клиентом (одно приложение для Android и одно приложение для iOS) и сервер (в настоящее время выполняется Bleno).

Я выбрал архитектуру с одной характеристикой (которая, как я думаю, является Socket), и я пишу Запросы от нее от Клиентов. Сервер отвечает на запрос уведомлением. Уведомления могут быть только 20 байтов, поэтому мне иногда приходится разделить ответ на несколько кусков и отправлять его в виде отдельных уведомлений.

Моя проблема заключается в том, что когда я разделяю ответ на 10 кусков или больше, они никогда не получаются на Клиентах. (Для 1..9 Chunks все работает так, как ожидалось).

Я использовал HCIDump (hcidump -i hci0 -X), чтобы проверять команды, отправленные через BLE, когда он терпит неудачу и когда он преуспевает.

Следующий вывод берется из HCIDump при отправке уведомлений успешно:

< ACL data: handle 69 flags 0x00 dlen 27 
ATT: Handle notify (0x1b) 
    handle 0x000c 
    value 0x06 0x09 0x46 0x46 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 

followed by: 

> HCI Event: Number of Completed Packets (0x13) plen 5 
handle 69 packets 1 

(для каждого из Notification Кусков)

Следующий вывод берется из HCIDump при отсутствии для отправки уведомлений:

< ACL data: handle 68 flags 0x00 dlen 27 
ATT: Handle notify (0x1b) 
    handle 0x000c 
    value 0x08 0x0a 0x46 0x46 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 0x47 

Но я не получаю никаких «завершенных пакетов», но вместо этого просто device: disconnected.

Мне еще предстоит выяснить, на какой стороне связи возникает ошибка. Насколько мне известно, это могут быть либо клиенты, которые не могут получить, так и Ack Notifications «быстро», потому что я слишком много запросов на стороне сервера.

Я протестировал, чтобы добавить команды Sleep() между отправкой каждого уведомления на сервере. Он работает, но чувствует себя слишком неустойчивым. Для 10 уведомлений мне понадобилась задержка в 6 мс для отправки уведомлений, для 30 уведомлений мне понадобилось 10 мс задержки.

Кто-нибудь знает, с чего начать поиск проблемы? Я рад предоставить дополнительную информацию, если это необходимо.

Примечание:

  • Я протестировано и точно такое же ограничение с моим устройством Android и IOS.

ответ

1

Существует ограничение на количество «кусков», которые вы можете отправить до того, как очередь будет заполнена. Вам нужно подождать, пока центральный центр подтвердит, что он готов получить больше данных, прежде чем отправлять следующий фрагмент.

В случае bleno ты бы ждать, чтобы получить обратно индикацию в onIndicate обратного вызова вашего характеристического перед отправкой следующего фрагмента:

var Characteristic = bleno.Characteristic; 

var characteristic = new Characteristic({ 
    uuid: 'fffffffffffffffffffffffffffffff1', 
    properties: [ ... ], 
    secure: [ ... ], 
    value: null, 
    onIndicate: null // <-- Right here 
}); 

По крайней мере прошивка, вы не должны изменить свою реализацию, чтобы получить указание назад.До тех пор, как вы назвали setNotifyValue:forCharacteristic: также включить показания, согласно документации Apple:

Устанавливает уведомления или указания для значения указанного признака.

Я не уверен, что для Android требуется больше работы.

+1

К сожалению, я не могу проверить, работает это или нет, поскольку мы больше не используем Bleno. Но это звучит очень здорово. – Joakim