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

Posted HaaS技术社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HaaS轻应用(JavaScript)低功耗蓝牙案例相关的知识,希望对你有一定的参考价值。

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]<D>BT_HOST native_bt_host_add_service enter

[   6.427]<D>BT_HOST [native_bt_host_add_service] service_cfg: {         "s_uuid":"0x1A1A",         "chars_lr val uuid 0x1d1d

[   6.428]<D>BT_GATTS_ADAPTER [bt_gatts_adapter_add_service] declare service done, total attr: 6(6)

[   6.429]<D>BT_GATTS_ADAPTER [bt_gatts_adapter_add_service] add service done with ret 12

[   6.429]<D>BT_HOST [native_bt_host_add_service] add service success

add_service result: 0

bt host start adv

[   6.429]<D>BT_HOST native_bt_host_start_adv enter

[   6.429]<D>BT_HOST native_bt_host_start_adv: type = 0, ad = 020106, sd = , interval_min = 160, interval_max = 320, channel_map = 7

[   6.430]<D>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]<D>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

以上是关于HaaS轻应用(JavaScript)低功耗蓝牙案例的主要内容,如果未能解决你的问题,请参考以下文章

HaaS轻应用(JavaScript)总览

NRF52833蓝牙5.1可用于105℃环境温度的Nordic蓝牙5.1 SoC能实现更广泛的并发多协议低功耗蓝牙mesh和Thread应用

HaaS轻应用(JavaScript)快速开始 @HaaS100

来了!HaaS轻应用(JavaScript)2.0!It just works

HaaS轻应用(JavaScript)快速开始 @HaaS EDU K1

HaaS轻应用(JavaScript)快速开始 @ HaaS610