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 successadd_service result: 0bt 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 = 101 06 20 0f a0 00 40 01 00 00 00 00 00 00 00 00 00 07 0004 0e 04 05 06 20 0001 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 0004 0e 04 05 08 20 0001 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 0004 0e 04 05 09 20 0001 0a 20 01 0104 0e 04 05 0a 20 00[ 6.509]BT_HOST_ADAPTER ble_stack_adv_start ret = 0bt_host start adv success 4.2、手机扫描连接设备打开手机安装好的NRF Connect软件,点击scan,可扫描到ble_test这台设备,如下图
点击CONNECT连接HaaS100,可看到服务列表,下图红色部分即为应用中注册的自定义服务。
4.3、设备上报数据当设备连接后,可按照如下动态图的方式打开Notify(点击属性右侧的三个箭头),之后可看到设备以2秒的间隔上报数据。
开发者支持如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号。
更多技术与解决方案介绍,请访问HaaS官方网站https://haas.iot.aliyun.com。
一次可以注册多少个 域名 ?一次可以注册的域名数量没有限制,一次可以注册一个...
如果不确定如何正确存储大数据,则应该将大数据存储在云中。 信息存储只能通过位...
大数据与其说是过时了,倒不如说还没有真正开始。只要摩尔定律还在生效,每过18...
本文转载自微信公众号「 码农读书」,作者 码农读书。转载本文请联系 码农读书公...
操作场景 当您不再需要轻量应用服务器时,可以对轻量应用服务器进行销毁。服务器...
企业邮箱 免费版怎么样?企业 邮箱 免费版相比于收费版来说,很多功能会受限,并...
业务背景: DAS(Database autonomy service)为上百万数据库实例的稳定运行保驾护...
提升您的YAML知识以编写更清晰的YAML文件 YAML是一种常用于数据序列化的文件格式...
Java开发可应用于什么领域?Java的应用非常的广泛,可以用来在开发软件工具、嵌入...
做过SEO的人都知道,网站服务器是一个网站正常运营的根本所在,而对于网站优化来...