来源 | HaaS技术社区
1、案例简介
HaaS100自带低功耗蓝牙功能,可以通过自带的蓝牙功能完成诸如与手机交互,蓝牙配网等功能。
本案例主要演示使用HaaS轻应用框架(JavaScript),在HaaS100上完成BLE的自定义GATT服务,并开启广播让手机可以扫描并连接,连接后将数据上报到手机。
2、物料清单
HaaS100开发板(需将蓝牙天线接好)。
安装NRF Connect软件的手机。
3、代码实现
编写app.js。
开启蓝牙功能
参考代码如下,调用bt_host模块中的open函数即可开启蓝牙功能。
bt_host.open的主要参数定义如下:
deviceName: 设备名
conn_num_max: 最大连接数
调用成功后,返回bt_host的实例。
-
import * as bt_host from 'bt_host'
-
-
-
var bt_host_instant = bt_host.open({
-
deviceName: 'ble_test',
-
conn_num_max: 2,
-
success: function() {
-
console.log( 'bt_host init success');
-
setTimeout( () => {
-
app_add_service()
-
app_start_adv();
-
}, 1000)
-
},
-
fail: function() {
-
console.log( 'bt_host init failed');
-
}
-
});
蓝牙服务注册功能
蓝牙服务是BLE蓝牙的基础,通过服务来发现设备功能并交互数据,如下参考代码定义了一个自定义的服务。
add_service的主要参数如下:
service: 结构体,服务定义,需要包含一个服务的uuid,s_uuid。以及一个从属于此服务的属性列表,每个属性要包含属性uuid,属性的读写权限,如果属性包含描述项,也需要定义。关于服务的定义可参考蓝牙标准文档。
-
function app_add_service() {
-
-
let add_service = {
-
-
service: "{\
-
-
\"s_uuid\":\"0x1A1A\",\
-
-
\"chars_list\":[\
-
-
{\
-
-
\"char_uuid\":\"0x1B1B\",\
-
-
\"char_permit\":\"RW\",\
-
-
\"char_descr\":{\
-
-
\"descr_type\":\"CCC\",\
-
-
\"descr_uuid\":\"0x1C1C\"\
-
-
}\
-
-
},\
-
-
{\
-
-
\"char_uuid\":\"0x1D1D\",\
-
-
\"char_permit\":\"R\"\
-
-
}\
-
-
]\
-
-
}"
-
-
}
-
-
bt_host_instant.add_service(service);
-
-
}
蓝牙广播
蓝牙广播用于被主设备(如手机)发现并连接,可参考如下代码
start_adv的主要参数如下
type: 0代表可连接广播,3代表不可连接广播
adv_data:符合蓝牙规范的广播内容
scan_rsp_data:符合蓝牙规范的广播扩展内容(在type=3时无效)
interval_min: 最小广播间隔,单位0.625毫秒
interval_max: 最大广播间隔,单位0.625毫秒
channel_map:广播信道。
注意1,如果在open时设置了设备名,则不能在广播内容中添加设备名相关的字段,否则会报错。
注意2,蓝牙连接后,广播是自动关闭的,断开连接后如需继续广播,需要重新开启广播。
-
function app_start_adv() {
-
-
bt_host_instant.start_adv({
-
-
type: 0,
-
-
adv_data: '020106',
-
-
scan_rsp_data: '',
-
-
interval_min: 160,
-
-
interval_max: 320,
-
-
channel_map: 7,
-
-
success: function() {
-
-
console. log( 'bt_host start adv success');
-
-
},
-
-
failed: function() {
-
-
console. log( 'bt_host start adv failed');
-
-
},
-
-
});
-
-
}
蓝牙连接断开指示
当设备开启可连接广播后,主设备(如手机)可以扫描到这个设备并连接。连接和断开可参考如下代码
接口on可用于接收蓝牙的连接和断开事件,参数
"connect":代表连接事件,可以在回调函数(第二个参数)中处理
"disconnect":代表断事件,可以在回调函数(第二个参数)中处理
-
function onConnect() {
-
-
// onConnect
-
-
console.log( 'bt_host onConnect');
-
-
-
-
dev_connected = true
-
-
setTimeout( () => {
-
-
app_notify_data()
-
-
}, 2000);
-
-
}
-
-
-
-
function onDisconnect() {
-
-
// onDisconnect
-
-
console.log( 'bt_host onDisconnect');
-
-
dev_connected = false
-
-
app_start_adv();
-
-
}
-
-
-
-
bt_host_instant.on( 'connect', function() {
-
-
onConnect();
-
-
});
-
-
-
-
bt_host_instant.on( 'disconnect', function() {
-
-
onDisconnect();
-
-
});
蓝牙数据上报
蓝牙数据上报用于将数据上报到已连接的主设备上,可以参考如下代码进行周期的数据上报。
update_char的主要参数如下:
arg: 结构体,需要包含需要上报的属性的uuid,以及需要上报的数据value。
注意1,只有在属性项中定义了CCC描述项的属性可以上报数据。
注意2,需要在主设备连接HaaS100后,在主设备上开启属性的Notify功能,HaaS100才能上报数据。
-
function app_notify_data() {
-
-
cnt++;
-
-
console.log( 'app_notify_data cnt = '+cnt)
-
-
if (cnt% 2) {
-
-
let param = {
-
-
arg: "{\
-
-
\"uuid\": \"0x1B1B\",\
-
-
\"value\": [31,32,33]\
-
-
}",
-
-
}
-
-
bt_host_instant.update_char(param);
-
-
} else {
-
-
let param = {
-
-
arg: "{\
-
-
\"uuid\": \"0x1B1B\",\
-
-
\"value\": [33,32,31]\
-
-
}",
-
-
}
-
-
bt_host_instant.update_char(param);
-
-
}
-
-
-
-
if (dev_connected == true) {
-
-
setTimeout( () => {
-
-
app_notify_data()
-
-
}, 2000);
-
-
}
-
-
}
4、使用流程
4.1、轻应用代码生成与烧录
按以上章节的方式实现代码逻辑并生成app.js以及app.json(参考如下)
-
{
-
-
"version": "1.0.0",
-
-
"io": {
-
-
-
-
},
-
-
"debugLevel": "DEBUG"
-
-
}
将app.js和app.json放入hardware/chip/haas1000/prebuild/data/jsamp中,重新编译并烧录进HaaS100,重启开发板,可看到如下日志打印
-
[ 16 : 56 : 56.182]收←◆ srvc_cfg: { "s_uuid" :"0x1A1A", "chars_list" :[ { "char_uuid" :"0x1B1B", "char_permit" :"RW", "char_descr" :{ "descr_type" :"CCC", "descr_uuid" :"0x1C1C" } }, { "char_uuid" :"0x1D1D", "char_permit" :"R" } ] }
-
-
[ 6.427]BT_HOST native_bt_host_add_service enter
-
-
[ 6.427]BT_HOST [native_bt_host_add_service] service_cfg: { "s_uuid" :"0x1A1A", "chars_lr val uuid 0x1d1d
-
-
[ 6.428]BT_GATTS_ADAPTER [bt_gatts_adapter_add_service] declare service done, total attr: 6(6)
-
-
[ 6.429]BT_GATTS_ADAPTER [bt_gatts_adapter_add_service] add service done with ret 12
-
-
[ 6.429]BT_HOST [native_bt_host_add_service] add service success
-
-
add_service result: 0
-
-
bt host start adv
-
-
[ 6.429]BT_HOST native_bt_host_start_adv enter
-
-
[ 6.429]BT_HOST native_bt_host_start_adv: type = 0, ad = 020106, sd = , interval_min = 160, interval_max = 320, channel_map = 7
-
-
[ 6.430]BT_HOST_ADAPTER bt_host_adapter_start_adv, ble_stack_adv_start, type = 0, min = 160, max = 320, ch = 7, ad_num = 1, sd_num = 0, ad[0].type = 1, ad[0].len = 1
-
-
01 06 20 0f a0 00 40 01 00 00 00 00 00 00 00 00 00 07 00
-
-
04 0e 04 05 06 20 00
-
-
01 08 20 20 03 02 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-
-
04 0e 04 05 08 20 00
-
-
01 09 20 20 0a 09 09 62 6c 65 5f 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-
-
04 0e 04 05 09 20 00
-
-
01 0a 20 01 01
-
-
04 0e 04 05 0a 20 00
-
-
[ 6.509]BT_HOST_ADAPTER ble_stack_adv_start ret = 0
-
-
bt_host start adv success
4.2、手机扫描连接设备
打开手机安装好的NRF Connect软件,点击scan,可扫描到ble_test这台设备,如下图
点击CONNECT连接HaaS100,可看到服务列表,下图红色部分即为应用中注册的自定义服务。
4.3、设备上报数据
当设备连接后,可按照如下动态图的方式打开Notify(点击属性右侧的三个箭头),之后可看到设备以2秒的间隔上报数据。
开发者支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号。
更多技术与解决方案介绍,请访问HaaS官方网站https://haas.iot.aliyun.com。