我正在学习如何使用布莱诺实现BLE外围设备。我想用贵姓从外设中发现和阅读。例如,我想知道我如何实现一个简单的智能量表,报告体重指数,体重指数等跟随重量测量GATT规范。
我不知道的是,是否可以从一个特征中读取多个信息。重量测量GATT规范使它看起来像是在一个高贵的characteristic.read(),你可以同时检索体重,体重指数,身高等。
例如,这个简单的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>值在等级库的“字段需求”列中是否指示传递给onReadRequest()的offset值?如果消费者想要获得“重量- SI"(C1),他们会以某种方式构建一个触发onReadRequest(1,function())的高尚的characteristic.read()?如果是这样,characteristic.read()是如何构造的?characteristic.read()以获得Flags的值characteristic.read(),它将在一次读取中返回多个(或所有)属性?给我所有这些外围支持的价值(体重- SI,BMI等)。onReadRequest()中填充回调的onReadRequest()。我上面的内容正确吗?offset &在onReadRequest(offset,callback)中它意味着什么?还是,我做错了?我应该对每一个价值都有一个特征吗?例:体重的单一特征- SI,和BMI的另一个特征?我想避免这种情况,我更愿意节省往返,并在一次调用中获得多个值。
发布于 2017-09-01 00:27:36
试图回答你的问题:
C<number>是什么意思,但我相信每个领域(体重、体重指数、身高等)表示为一个或多个八位数的组。注意在规范的底部是怎么写的注:上表中的字段按LSO到MSO的顺序排列。其中LSO =最小的八进制,MSO =最重要的八位。
因此,我相信,为了得到“加权- SI”字段,您将执行如下操作:
characteristic.read((err, data) => {
let char_flags = data.readUint8(0); // read first bit
if (!(char_flags & flags.IMPERIAL_WEIGHT)) // if SI weight
let weightSI = data.readUint16LE(1) // read SI weight starting at second bit
});https://stackoverflow.com/questions/45990186
复制相似问题