C# 脉搏血氧计服务(0x1822)是否可以显示在;用于移动设备的nRF连接”;

C# 脉搏血氧计服务(0x1822)是否可以显示在;用于移动设备的nRF连接”;,c#,bluetooth,bluetooth-lowenergy,C#,Bluetooth,Bluetooth Lowenergy,我正在使用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

我正在使用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

在此处找到的官方蓝牙通用属性配置文件规范中:

以及该页面上的pdf链接:

脉搏血氧计服务PLX的返回值返回SFLOAT。
SFLOAT是一个16位字,以有符号的4位整数指数开头,后跟有符号的12位尾数,每个尾数都是两个补码形式。
例如:
您的值: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是BIN1011给出的12月4日。
0x4是12月4日的仓位0100。
0x3是BIN 0011给出的12月3日。
这意味着大于0x7的十六进制数在0xF(即-1 Dec)之前为负数

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

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

事实上,nRF应用程序本身不支持解析此特征和其他一些特征。你没有做错什么

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


链接到。

我的答案格式有点不正确,因此看起来过于复杂。原因是文本编辑器一直抱怨使用代码格式。我必须编辑一些公式,使其看起来像纯文本,然后才能发布。很抱歉,谢谢你的回复。当我发布这个问题时,我也多次收到同样的抱怨。但很抱歉,我真的不明白你的意思…我不明白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我认为NRF connect应用程序不支持脉搏血氧测定的特征数据解析。我正在研究完全相同的问题。我强烈建议您查看Windows C++/C#BLE GUI示例应用程序,您可以与该应用程序配对并连接到您的nRF服务器设备,并发现GATT配置文件、服务和特性。如果特征是可通知的,则可以订阅该特征以进行通知;如果特征是可读的,则可以读取该特征;如果特征是可写的,则可以写入该特征