我正在尝试学习如何使用bleno实现 BLE 外围设备。我想使用高贵的外围设备发现和阅读。例如,我想知道如何实现一个简单的智能秤,按照GATT 重量测量规范报告体重、BMI 等。
我无法弄清楚是否可以从一个特征中读取多条信息。体重测量GATT 规范使您似乎可以在一个贵族characteristic.read()
中同时检索体重、BMI、身高等。
例如,这个简单的 bleno 特性:
'use strict';
const bleno = require('bleno');
const flags = {
IMPERIAL_WEIGHT: 1 << 0,
USER_ID_PRESENT: 1 << 2,
BMI_AND_HEIGHT_PRESENT: 1 << 3
};
module.exports.flags = flags;
module.exports.WeightMeasureCharacteristic = class WeightMeasureCharacteristic extends bleno.Characteristic {
constructor(scale) {
super({
uuid: '2A9D',
properties: ['read'],
descriptors: []
});
this._scale = scale;
}
onReadRequest(offset, callback) {
//Not sure what `offset` means here or how it gets populated...Help!
let data = new Buffer.alloc(8); //1(flags)+2(weightImp)+1(userId)+2(BMI)+2(heightImp)
//Write supported value fields as bit flags
data.writeUInt8(flags.IMPERIAL_WEIGHT | flags.USER_ID_PRESENT | flags.BMI_AND_HEIGHT_PRESENT), 0);
//Write out weight (lbs) - offset 1 byte
data.writeUInt16LE(100.01, 1);
//Write out user id - offset 12 bytes (flags+Imperial, no need to include offset for SI or Timestamp since the flags indicated those are not supported)
data.writeUInt8(69, 3);
//Write out BMI - offset 13 bytes (after UserId)
data.writeUInt16LE(18.6, 4);
//Write out Height Imperial - offset 17 bytes (after Height SI)
data.writeUInt16LE(72.2, 6);
callback(this.RESULT_SUCCESS, data);
}
}
如果有人能够在onReadRequest()
上面实现/伪代码,我认为这将有助于我的想法。
问题:
- 规范
C<number>
的“字段要求”列中的值是否表示传入的值?如果消费者想要获得“体重 - SI”(),他们会以某种方式构建一个触发? 如果是这样,是如何构建的?offset
onReadRequest()
C1
characteristic.read()
onReadRequest(1,function())
characteristic.read()
- 我如何构造一个贵族
characteristic.read()
来获得价值Flags
? - 我如何构建一个贵族
characteristic.read()
,它会在一次阅读中返回多个(或所有)属性?例如:给我这个外围设备支持的所有值(重量 - SI、BMI 等)。 - 如果我的外围设备支持英制重量、用户 id、bmi 和身高,我如何
data
在onReadRequest()
. 我上面的内容正确吗? - 是如何
offset
填充的?它是什么意思onReadRequest(offset,callback)
?
或者,我做这一切都错了吗?我应该对每个值都有一个特征吗?例如:体重的单一特征 - SI,以及 BMI 的另一个特征?我想避免这种情况,宁愿节省往返行程并在一次通话中获得多个值。