Мой код, предоставляющий службу BLE, работает под управлением nodejs и использует пакет bleno.
Моя служебная характеристика поддерживает read и notify.
Вот моя упрощенная реализация функции onSubscribe:
function(maxValueSize, updateValueCallback) {
var a = buildPacket();
var buf = Buffer.from(a);
console.info('Buffer: ', buf);
updateValueCallback(this.RESULT_SUCCESS, buf);
}
Функция buildPacket возвращает Uint8Array из 20 байтов. Оператор консоли показывает, что буфер имеет размер 20 байт и имеет ожидаемые значения.
Однако вызов updateValueCallback выдает ошибку:
RangeError: Index out of range
at checkInt (buffer.js:1187:11)
at Buffer.writeUInt8 (buffer.js:1233:5)
at Gatt.<anonymous> (/home/pi/Dev/MyTest/node_modules/bleno/lib/hci socket/gatt.js:881:33)
Вот соответствующий код из gatt.js:
878 if (useNotify) {
879 var notifyMessage = new Buffer(3 + dataLength);
880
881 notifyMessage.writeUInt8(ATT_OP_HANDLE_NOTIFY, 0);
882 notifyMessage.writeUInt16LE(valueHandle, 1);
Есть ли какой-то шаг, который я пропустил?
Большинство примеров на bleno, которые я читал, похоже, отправляют строковые данные. Однако мне нужно отправить двоичные данные. Требуется ли что-то особенное для отправки двоичных данных?





Оказывается updateValueCallback принимает только один параметр. Я должен был посмотреть на примеры bleno немного внимательнее :-(.
Простая передача buf в качестве единственного параметра устранила проблему.