如何将 蓝牙BLE 设备(YiTHE 人体温度计)通过蓝牙网关(YiGATE)接入 YiCONNECT?
目录
关注我们
关注 ThingsBoard 微信公众号
手动增加微信公众号:thingsboard_cn
访问 ThingsBoard 中文社区网站
访问网址:http://www.thingsboard.club
我们都知道蓝牙BLE设备只能与蓝牙相关设备通信,如果需要将蓝牙BLE设备接入物联网平台,那需要通过一些技术手段来实现协议和数据的转换。本文章,就是为这个解决方案提供一个指引。
准备工作
设备和软件相关
- 蓝牙BLE广播设备,可以是一个iBeacon,这里用 YiTHE 人体温度计为例;
- 蓝牙BLE网关,可以是一个通用的蓝牙网关或可以二次开发的网关;
- ThingsBoard Gateway,需要二次开发;
蓝牙网关需要跟蓝牙设备之间已经建立连接和配合,具体配置要看蓝牙设备的协议是否被网关支持。
数据走向
- 蓝牙设备持续广播,将数据发送出来:02010613ff11aae6000055444757543035000000000000;
- 网关设备持续扫描广播,并解析广播数据,比如 YiTHE ;
- 蓝牙网关将数据发送到 ThingsBoard Gateway;
- ThingsBoard 端需要针对 iBeacon 数据解析,并入库。
协议转换
蓝牙网关端
为了区分自有设备,过滤掉其他厂家设备,需要在网关处开发过滤规则:
- 根据广播数据长度过滤不相关数据;
- 根据数据内容关键字过滤;
ThingsBoard 端
为了保证数据完整性,我们将原始数据直接发送到 TB ,然后,在规则链 中过滤并且分析数据,写入:
adv_data = msg.adv_data;
// 电池
battery_str = adv_data.substr(20, 2);
hex = "0x" + battery_str;
charValueBattery = String.fromCharCode(hex);
battery = charValueBattery.charCodeAt(0);
msg.battery = battery;
// 温度
temp_symbol = adv_data.substr(10, 2);
if (temp_symbol == "00") {
symbol = -1;
} else if (temp_symbol == "11") {
symbol = 1;
}
temp1_str = adv_data.substr(16, 2);
temp2_str = adv_data.substr(14, 2);
hex = "0x" + temp1_str + temp2_str;
charValueTemp = String.fromCharCode(hex);
temp = charValueTemp.charCodeAt(0);
msg.temp = symbol * temp / 10.0;
// 温度单位 摄氏度或华氏度
temp_unit_str = adv_data.substr(12, 2);
if (temp_unit_str == "aa") {
unitCode = "C";
} else if (temp_unit_str == "bb") {
unitCode = "F";
}
msg.temp_unit = unitCode;
// 按键标志
pressed_str = adv_data.substr(18, 2);
if (pressed_str == "01") {
pressed = true;
} else if (pressed_str == "00") {
pressed = false;
}
msg.pressed = pressed;
// 设备id
devcie_id_str = adv_data.substr(34, 12);
hex = "0x" + devcie_id_str;
charValueDeviceId = String.fromCharCode(hex);
device_id = charValueDeviceId.charCodeAt(0);
msg.device_id = device_id;
// 设备标志位
var result = [];
device_flag_str = adv_data.substr(22, 12);
for (var i = 0; i < device_flag_str.length / 2; i++) {
var aa = device_flag_str.slice(i * 2, (i + 1) * 2);
result.push(aa);
}
var device_flag = "";
for (var i = 0; i < result.length; i++) {
device_flag += String.fromCharCode(parseInt(result[i],
16));
}
msg.device_flag = device_flag;
return {
msg: msg,
metadata: metadata,
msgType: msgType
};
需要解析数据,并写入msg,达到入库的作用。
{
"msg": {
"adv_data": "02010613ff11aae6000055444757543035000000000000",
"battery": 85,
"temp": 23,
"temp_unit": "C",
"pressed": false,
"device_id": 0,
"device_flag": "DGWT05"
},
"metadata": {
"deviceType": "default",
"deviceName": "Test Device",
"ts": "1618149679239"
},
"msgType": "POST_TELEMETRY_REQUEST"
}