HaaS轻应用(JavaScript)低功耗蓝牙案例

简介: HaaS100自带低功耗蓝牙功能,可以通过自带的蓝牙功能完成诸如与手机交互,蓝牙配网等功能。本案例主要演示使用HaaS轻应用框架(JavaScript),在HaaS100上完成BLE的自定义GATT服务,并开启广播让手机可以扫描并连接,连接后将数据上报到手机。
来源 | HaaS技术社区

1、案例简介

HaaS100自带低功耗蓝牙功能,可以通过自带的蓝牙功能完成诸如与手机交互,蓝牙配网等功能。

本案例主要演示使用HaaS轻应用框架(JavaScript),在HaaS100上完成BLE的自定义GATT服务,并开启广播让手机可以扫描并连接,连接后将数据上报到手机。

2、物料清单

HaaS100开发板(需将蓝牙天线接好)。

image.png

安装NRF Connect软件的手机。

image.png

3、代码实现

编写app.js。

开启蓝牙功能

参考代码如下,调用bt_host模块中的open函数即可开启蓝牙功能。

bt_host.open的主要参数定义如下:

deviceName: 设备名

conn_num_max: 最大连接数

调用成功后,返回bt_host的实例。

  1. import * as bt_host from 'bt_host'
  2. var bt_host_instant = bt_host.open({
  3. deviceName: 'ble_test',
  4. conn_num_max: 2,
  5. success: function() {
  6. console.log( 'bt_host init success');
  7. setTimeout( () => {
  8. app_add_service()
  9. app_start_adv();
  10. }, 1000)
  11. },
  12. fail: function() {
  13. console.log( 'bt_host init failed');
  14. }
  15. });

蓝牙服务注册功能

蓝牙服务是BLE蓝牙的基础,通过服务来发现设备功能并交互数据,如下参考代码定义了一个自定义的服务。

add_service的主要参数如下:

service: 结构体,服务定义,需要包含一个服务的uuid,s_uuid。以及一个从属于此服务的属性列表,每个属性要包含属性uuid,属性的读写权限,如果属性包含描述项,也需要定义。关于服务的定义可参考蓝牙标准文档。

  1. function app_add_service() {
  2. let add_service = {
  3. service: "{\
  4. \"s_uuid\":\"0x1A1A\",\
  5. \"chars_list\":[\
  6. {\
  7. \"char_uuid\":\"0x1B1B\",\
  8. \"char_permit\":\"RW\",\
  9. \"char_descr\":{\
  10. \"descr_type\":\"CCC\",\
  11. \"descr_uuid\":\"0x1C1C\"\
  12. }\
  13. },\
  14. {\
  15. \"char_uuid\":\"0x1D1D\",\
  16. \"char_permit\":\"R\"\
  17. }\
  18. ]\
  19. }"
  20. }
  21. bt_host_instant.add_service(service);
  22. }

蓝牙广播

蓝牙广播用于被主设备(如手机)发现并连接,可参考如下代码

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,蓝牙连接后,广播是自动关闭的,断开连接后如需继续广播,需要重新开启广播。

  1. function app_start_adv() {
  2. bt_host_instant.start_adv({
  3. type: 0,
  4. adv_data: '020106',
  5. scan_rsp_data: '',
  6. interval_min: 160,
  7. interval_max: 320,
  8. channel_map: 7,
  9. success: function() {
  10. console. log( 'bt_host start adv success');
  11. },
  12. failed: function() {
  13. console. log( 'bt_host start adv failed');
  14. },
  15. });
  16. }

蓝牙连接断开指示

当设备开启可连接广播后,主设备(如手机)可以扫描到这个设备并连接。连接和断开可参考如下代码

接口on可用于接收蓝牙的连接和断开事件,参数

"connect":代表连接事件,可以在回调函数(第二个参数)中处理

"disconnect":代表断事件,可以在回调函数(第二个参数)中处理

  1. function onConnect() {
  2. // onConnect
  3. console.log( 'bt_host onConnect');
  4. dev_connected = true
  5. setTimeout( () => {
  6. app_notify_data()
  7. }, 2000);
  8. }
  9. function onDisconnect() {
  10. // onDisconnect
  11. console.log( 'bt_host onDisconnect');
  12. dev_connected = false
  13. app_start_adv();
  14. }
  15. bt_host_instant.on( 'connect', function() {
  16. onConnect();
  17. });
  18. bt_host_instant.on( 'disconnect', function() {
  19. onDisconnect();
  20. });

蓝牙数据上报

蓝牙数据上报用于将数据上报到已连接的主设备上,可以参考如下代码进行周期的数据上报。

update_char的主要参数如下:

arg: 结构体,需要包含需要上报的属性的uuid,以及需要上报的数据value。

注意1,只有在属性项中定义了CCC描述项的属性可以上报数据。

注意2,需要在主设备连接HaaS100后,在主设备上开启属性的Notify功能,HaaS100才能上报数据。

  1. function app_notify_data() {
  2. cnt++;
  3. console.log( 'app_notify_data cnt = '+cnt)
  4. if (cnt% 2) {
  5. let param = {
  6. arg: "{\
  7. \"uuid\": \"0x1B1B\",\
  8. \"value\": [31,32,33]\
  9. }",
  10. }
  11. bt_host_instant.update_char(param);
  12. } else {
  13. let param = {
  14. arg: "{\
  15. \"uuid\": \"0x1B1B\",\
  16. \"value\": [33,32,31]\
  17. }",
  18. }
  19. bt_host_instant.update_char(param);
  20. }
  21. if (dev_connected == true) {
  22. setTimeout( () => {
  23. app_notify_data()
  24. }, 2000);
  25. }
  26. }

4、使用流程

4.1、轻应用代码生成与烧录

按以上章节的方式实现代码逻辑并生成app.js以及app.json(参考如下)

  1. {
  2. "version": "1.0.0",
  3. "io": {
  4. },
  5. "debugLevel": "DEBUG"
  6. }

将app.js和app.json放入hardware/chip/haas1000/prebuild/data/jsamp中,重新编译并烧录进HaaS100,重启开发板,可看到如下日志打印

  1. [ 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" } ] }
  2. [ 6.427]BT_HOST native_bt_host_add_service enter
  3. [ 6.427]BT_HOST [native_bt_host_add_service] service_cfg: { "s_uuid" :"0x1A1A", "chars_lr val uuid 0x1d1d
  4. [ 6.428]BT_GATTS_ADAPTER [bt_gatts_adapter_add_service] declare service done, total attr: 6(6)
  5. [ 6.429]BT_GATTS_ADAPTER [bt_gatts_adapter_add_service] add service done with ret 12
  6. [ 6.429]BT_HOST [native_bt_host_add_service] add service success
  7. add_service result: 0
  8. bt host start adv
  9. [ 6.429]BT_HOST native_bt_host_start_adv enter
  10. [ 6.429]BT_HOST native_bt_host_start_adv: type = 0, ad = 020106, sd = , interval_min = 160, interval_max = 320, channel_map = 7
  11. [ 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
  12. 01 06 20 0f a0 00 40 01 00 00 00 00 00 00 00 00 00 07 00
  13. 04 0e 04 05 06 20 00
  14. 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
  15. 04 0e 04 05 08 20 00
  16. 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
  17. 04 0e 04 05 09 20 00
  18. 01 0a 20 01 01
  19. 04 0e 04 05 0a 20 00
  20. [ 6.509]BT_HOST_ADAPTER ble_stack_adv_start ret = 0
  21. bt_host start adv success

4.2、手机扫描连接设备

打开手机安装好的NRF Connect软件,点击scan,可扫描到ble_test这台设备,如下图

image.png

点击CONNECT连接HaaS100,可看到服务列表,下图红色部分即为应用中注册的自定义服务。

image.png

4.3、设备上报数据

当设备连接后,可按照如下动态图的方式打开Notify(点击属性右侧的三个箭头),之后可看到设备以2秒的间隔上报数据。

image.png

开发者支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号。

image.png

更多技术与解决方案介绍,请访问HaaS官方网站https://haas.iot.aliyun.com

相关文章
|
28天前
|
监控 安全 中间件
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
这篇文章介绍了什么是Next.js中的中间件以及其应用场景。中间件可以用于处理每个传入请求,比如实现日志记录、身份验证、重定向、CORS配置等功能。文章还提供了一个身份验证中间件的示例代码,以及如何使用限流中间件来限制同一IP地址的请求次数。中间件相当于一个构建模块,能够简化HTTP请求的预处理和后处理,提高代码的可维护性,有助于创建快速、安全和用户友好的Web体验。
|
30天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
56 11
|
1月前
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
52 8
|
1月前
|
敏捷开发 人工智能 JavaScript
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
Figma-Low-Code 是一个开源项目,能够直接将 Figma 设计转换为 Vue.js 应用程序,减少设计师与开发者之间的交接时间,支持低代码渲染和数据绑定。
107 3
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
|
3月前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
91 31
|
3月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
76 3
|
3月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
3月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
222 77
|
3月前
|
前端开发 JavaScript 关系型数据库
基于 Vue2.0 + Nest.js 全栈开发的后台应用
Vue2 Admin 是一个基于 Vue2 和 Ant Design Pro 开发的前端项目,配合 Nest.js 构建的后端,提供了一个完整的全栈后台应用解决方案。该项目支持动态国际化、用户权限管理、操作日志记录等功能,适合全栈开发者学习参考。线上预览地址:https://vue2.baiwumm.com/,用户名:Admin,密码:abc123456。
|
3月前
|
JavaScript 前端开发 API
Vue.js 3:深入探索组合式API的实践与应用
Vue.js 3:深入探索组合式API的实践与应用