【问题标题】:Can Pulse Oximeter Service (0x1822) be shown on "nRF Connect for Mobile"脉搏血氧仪服务 (0x1822) 能否显示在“nRF Connect for Mobile”上
【发布时间】:2019-09-23 16:20:05
【问题描述】:

我正在使用 arduino 通过 BLE 向移动设备发送消息,该移动设备使用“nRF Connect for Mobile”来扫描 arduino。

我能够获取血压 (0x1810) 和健康温度计 (0x1809) 的信息,但脉搏血氧计服务 (0x1822) 失败

只显示

Value: (0x) 00-63-00-50-00

我期待的是

00 = flags

63-00 = SLOAT of the SpO2 value, i.e. 99%

50-00 = SLOAT of the pulse rate, i.e. 80

由于它没有“无效数据语法”之类的症状,所以我想知道这个服务是不是这个应用程序定义的。

// For Blood Pressure service (0x1810): Blood Pressure Measurement (0x2A35)
byte flags1 = 0b00000000;
byte SYS = 100;
byte DIA = 160;
byte MAP = 120;
byte BP[8] = {flags1, SYS, 0, DIA, 0, MAP, 0};

pChara1_1->setValue(BP, 8);
pChara1_1->indicate();
// The mobile app (nRF Connect) display the systolic pressure: 100 mmHg successfully (also the diastolic and mean pressure)

// For Pulse Oximeter Service (0x1822): PLX Spot-check Measurement (0x2A5E)
byte flags3 = 0b00000000;
byte Sp = 99;
byte PR = 80;
byte SPO2[5] = {flags3, Sp, 0, PR, 0};

pChara3_1->setValue(SPO2, 5);
pChara3_1->indicate();

// For Pulse Oximeter Service (0x1822): PLX Features (0x2A60)
byte flags4[2] = {0b00000000,0b00000000};

pChara3_3->setValue(flags4, 2);

// It turns out "Value: (0x) 00-63-00-50-00"

预期结果

SpO2: 99%
Pulse rate: 80

实际结果

Value: (0x) 00-63-00-50-00

【问题讨论】:

  • 我认为 NRF 连接应用程序不支持解析 PulseOximetry 的特征数据。我正在处理完全相同的问题。
  • 我强烈建议您查看 Windows C++/C# BLE GUI 示例应用程序,您可以与它配对并连接到您的 nRF 服务器设备并发现 GATT 配置文件、服务和特征。如果它是可通知的,您可以订阅通知的特征,或者如果它是可读的,则可以读取它,如果它是可写的,则可以写入它github.com/microsoft/Windows-universal-samples/tree/master/…

标签: c# bluetooth bluetooth-lowenergy


【解决方案1】:

nRF 应用程序本身确实不支持解析此特征和其他少数特征。你没有做错任何事。

我在 nRF 存储库上创建了一个问题,维护人员表示他将尝试实现我提到的一个特征解析。

链接到Issue

【讨论】:

    【解决方案2】:

    在此处找到的官方蓝牙通用属性配置文件规范:
    https://www.bluetooth.com/specifications/gatt/

    以及该页面上 pdf 的链接:
    https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=304965

    Pulse Oximeter Service PLX 的返回值返回一个 SFLOAT。
    SFLOAT 是一个 16 位字,以带符号的 4 位整数指数开头,后跟带符号的 12 位尾数,每个都采用二进制补码形式。
    例如:
    您的 OxiValue:0x0063。
    指数:0x0 为 0。
    尾数:0x063 为 99。
    结果:99 * 10^0 是 99。
    由于指数是 0 ,这个例子很简单,因为 10^0 是 1。
    二进制补码形式的有符号 4 位整数由十进制范围 - 8 到 +7 表示,
    其中 -8 是 BIN 1000,0 是 BIN 0000,+7 是 BIN 0111。
    0xB 是 BIN 1011 给出 DEC -4。
    0x4 是 BIN 0100 给出 DEC 4。
    0x3 是 BIN 0011 给出 DEC 3。
    这意味着大于 0x7 的十六进制数将是负数,直到 0xF,即 -1 Dec。

    从 SFLOAT 转换为 DEC 的简单方法是为指数部分的所有 16 个值创建一个查找表。 对于尾数部分,如果是正数,只需将十六进制值转换为整数即可。对于负数,它更复杂。你必须用谷歌搜索。

    现在到 nRF Connect for Mobile。 要表示这些数字,您必须将它们转换为整数并使用表示格式 Int。这仅适用于 nRF Connect 版本 4.19.0。或更高,否则您必须将 int 值作为文本发送。

    【讨论】:

    • 我的答案格式有点错误,所以看起来过于复杂。原因是文本编辑器一直抱怨使用代码格式。我必须编辑一些公式以使其看起来像纯文本才能发布。很抱歉。
    • 感谢您的回复。当我发布这个问题时,我也多次收到同样的抱怨。但很抱歉,我真的不明白你的意思......
    • 我不明白 SFLOAT 中存在有符号和无符号位的原因。我只知道 可以显示另一个服务,其规范类似于 PLX 服务。所以我很确定我的代码是正确的。
    • 您提到我需要从 SFLOAT 转换为 DEC。从我的代码中可以看出,我定义了 ,它们都是 DEC。但是, 只能显示 SYS...它在 SFLOAT 中显示 PLX(我将其归类为 FAIL)
    • nRF Connect for Mobile 只是一个工具。 Nordic Semiconductor 声称它可以处理大多数特征格式,并且 SFLOAT 不是受支持的格式之一。如果不支持格式您将获得原始数据。再解释一下 SFOAT:例如,值 0x0E0113 :指数:0x0E = -2 尾数:0x0113 = 275 -> 实际值:275 * 10^-2 = 2.75
    猜你喜欢
    • 2015-11-19
    • 1970-01-01
    • 2022-11-11
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多