如何使用bleno发布多条BLE特征数据

时间:2017-08-31 21:14:11

标签: node.js bluetooth bluetooth-lowenergy gatt bleno

我正在尝试学习如何使用bleno实现BLE外围设备。我想使用noble发现并阅读外围设备。例如,我想知道如何实现一个简单的智能比例,报告Weight Measurement GATT spec之后的重量,BMI等。

我能弄清楚的是,是否可以从特征中读取多条信息。 Weight Measurement GATT spec让你看起来像一个贵族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(),我认为这样可以帮助我解决问题。

问题:

  1. &#34;字段要求&#34>中的C<number>值? spec的列表示传递到offset的{​​{1}}值?如果消费者想要获得&#34;体重 - SI&#34;(onReadRequest())他们会以某种方式构建一个引发C1的贵宾characteristic.read()?如果是这样,onReadRequest(1,function())是如何构建的?
  2. 如何构建贵宾characteristic.read()以获取characteristic.read()的价值?
  3. 如何构建一个高贵的Flags,它会在一次读取中返回多个(或所有)属性?例如:给我这个外围设备支持的所有值(重量 - SI,BMI等)。
  4. 如果我的外围设备支持英制重量,用户ID,bmi和高度,我如何在characteristic.read()中填充data以进行回调。我上面的内容是否正确?
  5. onReadRequest()如何填充&am​​p;它在offset中意味着什么?
  6. 或者,我这样做是错的吗?我应该为每个值都有一个特征吗?例如:体重的单一特征 - SI,以及BMI的另一个特征?我想避免这种情况,宁愿保存往返行程并在一次通话中获得多个值。

1 个答案:

答案 0 :(得分:1)

试图回答你的问题:

  1. 我不确定C<number>是什么意思,但我相信每个字段(权重,BMI,高度等)都表示为一个或多个八位字节的组。请注意规范底部的内容
  2.   

    注意:上表中的字段按照LSO到MSO的顺序排列。   其中LSO =最不重要的八位位组,MSO =最重要的八位位组。

    因此,我相信为了获得重量 - SI&#34;字段,你会做类似的事情:

        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
        });
    
    1. 上面回答
    2. 上面回答,只需检查标志中是否存在属性,然后从适当的偏移量中读取值。 this也可以提供帮助。
    3. 上面回答。