开发自有品牌项目蓝牙Mesh灯产品
本文介绍如何开发一个自有品牌项目蓝牙Mesh灯产品,包括使用开发板与云智能App调试配网和控制的过程。
背景信息
生活物联网平台自有品牌项目已经支持创建蓝牙Mesh产品,如果基于TG7100B芯片开发,可以按照基于TG7100B的Mesh灯应用固件说明中的介绍,下载V1.3.4版本SDK、编译和运行固件。如果基于TG7120B或者TG7121B芯片开发,注意下载和使用V1.3.5以上版本SDK。在创建与产品后,将设备证书写入设备,通过云智能App(V3.8.0以上版本)可以对蓝牙Mesh产品进行配网和控制。
自有App暂不支持对蓝牙Mesh产品进行开发蓝牙Mesh配网和控制的能力。
创建与配置产品
创建一个自有品牌项目。
创建产品,在产品中填写产品名称,“所属品类“选择为“电工照明/灯“,“节点类型”选择为“设备“,“是否接入网关”选择“是”;“接入网关协议”选择为“BLE Mesh”。
定义产品功能,注意选择硬件复位事件、开关属性、亮度属性、色温属性、模式属性。
配置产品的人机交互,需要打开“使用公版App控制产品“,后续可以通过云智能App进行验证,需要详细配置和确认完六步。其中“分享方式”无须选择,目前仅支持抢占式。
配置设备面板。
light_ctl应用仅支持开关、亮度、色温、模式控制,可以搭建一个简单的面板,如下所示。
配网引导配置,单击右上角“我要自定义配网”,切换配置界面。
确认配网方式为“蓝牙Mesh配网”,并且单击下述配置,可以配置具体配网引导文案和图片,详见下图。配网引导内容,会有默认的文案,也可以自定义填写。遍历各个语言,会自动生成多语言的默认文案。
配置多语言,配置完成后保存。
设备调试配置。首先选择认证模组/芯片,可以根据实际使用的芯片选择。
目前自有品牌项目尚无Mesh网关的情况下,暂不支持设备“在线调试”功能。
发布产品与购买激活码。
购买激活码时,注意选择“自有品牌蓝牙设备“。
生成与烧录设备证书
在设备调试页面,单击新增测试设备生成测试设备证书,可以选择输入合法MAC地址作为DeviceName,或者不输入由平台自动分配。
说明蓝牙Mesh设备的DeviceName与MAC地址需要保持一致。当输入合法MAC地址作为DeviceName时,调试阶段要避免同一MAC地址在不同产品下作为DeviceName。即要注意保证MAC地址的唯一性,避免造成问题。
如下图拷贝Product ID,Device Secret与Device Name。
通过set_tt命令,将设备证书烧录到开发板。
set_tt 8xxxxx4 exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxd 28fa7aa4cac5 /*输入命令*/ 8xxxxx4 exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxd 28fa7aa4cac5 /*返回结果*/
通过reboot命令重启设备,设备进入待配网状态。
调试云智能App添加设备
进入云智能App,打开“自动发现“页面,添加设备,整个流程如下图所示。
App配网过程关键的设备端日志。
Provision关键日志。
DEVICE:light APP VER:1.3.1 GenieSDK:V1.3.4-tg7100b PROUDUCT:ALI_AOS_TG7100B MAC:28:FA:7A:A4:CA:C5 ais pre init [000609]<I> GenieE:3 [000638]<I> SigE:11 [000648]<I> SigE:12 [000708]<I> GenieE:12 [proxy_connected]conn(0x2000b63c) reason 0x00 /* App与设备之间建立proxy连接*/ [000939]<I> GenieE:11 [001604]<I> SigE:14 [001614]<I> SigE:4 [001624]<I> GenieE:55 [light_save_state]save 1 58982 20000 /*默认开关为1,亮度为58982(90%),色温为20000(100%)*/ [ALI_PROV][D] prov_invite , 1--->2 [001960]<I> GenieE:20 [ALI_PROV][D] prov_start , 2--->3 [ALI_PROV][D] prov_pub_key , 3--->4 [ALI_PROV][D] prov_confirm , 4--->5 [ALI_PROV][D] prov_random , 5--->6 [ALI_PROV][D] prov_data , 6--->7 [002606]<I> GenieE:21
设备绑定关键日志。
...... [004731]<I> GenieE:30 ...... [004965]<I> GenieE:23 ...... [005309]<I> GenieE:37
设备全属性上报日志:开关(Attr Type 0x0100)属性值0x01(开),亮度(Attr Type 0x0121)属性值为0xE666(相比最大值0xFFFF,0xE666相当于90%),色温(Attr Type 0x0122)属性值为0x4E20(最大值20000,相当于100%),模式(Attr Type 0xF004)属性值为0x0000。
[009552]<I> User report data [009566]<I> SendTID(82) [TX] SRC: 0x1634 [TX] DST: 0xF000 [TX] msg size: 19 [TX] D4 A8 01 82 00 01 01 21 01 66 E6 22 01 20 4E 04 [TX] F0 00 00
设备上电事件日志:事件上报(Attr Type 0xF009),上电事件(0x03)。
[009787]<I> SendTID(84) [TX] SRC: 0x1634 [TX] DST: 0xF000 [TX] msg size: 7 [TX] D4 A8 01 84 09 F0 03
调试云智能App控制设备
在云智能App控制设备,如下图所示。
设备端关键日志。
开灯操作。
[RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0x8202 [RX] Payload size: 4 [RX] 01 C0 41 00 [116958]<I> SigE:20 [116968]<I> SIG mesg ElemID(0) +MESHMSGRX:6,820201C04100 /*App下发开灯操作:Generic OnOff Set消息,Opcode 0x8202, OnOff 0x01*/ [117000]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0x128 [TX] msg size: 5 [TX] 82 04 01 01 41 /*设备回复Generic OnOff Status消息,Opcode 0x8204,Target OnOff 0x01*/ [117065]<I> SigE:1 [117075]<I> SigE:12 [117106]<I> SigE:14 [117116]<I> SigE:4 [117126]<I> SigE:5 [117136]<I> SendTID(85) [117148]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0xF000 [TX] msg size: 11 [TX] D4 A8 01 85 00 01 01 21 01 66 E6 /* 设备上报Indication,TID 0x85,开关0x01,亮度0xE666(即90%)*/ [117223]<I> GenieE:55 [117342]<I> RX Info [RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0xD501A8 [RX] Payload size: 1 [RX] 85 /* 设备收到Confirmation,TID 0x85,即上条上报对应的确认 */
关灯操作。
[RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0x8202 [RX] Payload size: 4 [RX] 00 C1 41 00 [126978]<I> SigE:20 [126988]<I> SIG mesg ElemID(0) +MESHMSGRX:6,820200C14100 /*App下发关灯操作:Generic OnOff Set消息,Opcode 0x8202, OnOff 0x00*/ [127021]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0x128 [TX] msg size: 5 [TX] 82 04 01 00 41 /*设备回复Generic OnOff Status消息,Opcode 0x8204,Target OnOff 0x00*/ [127086]<I> SigE:1 [127095]<I> SigE:12 [127946]<I> SigE:14 [127956]<I> SigE:4 [127966]<I> SigE:5 [127976]<I> SendTID(86) [127988]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0xF000 [TX] msg size: 11 [TX] D4 A8 01 86 00 01 00 21 01 00 00 /* 设备上报Indication,TID 0x86,开关0,亮度0 */ [128063]<I> GenieE:55 [light_save_state]save 0 58982 20000 /* 保存开关0 */ [128259]<I> RX Info [RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0xD501A8 [RX] Payload size: 1 [RX] 86 /* 设备收到Confirmation,TID 0x86,即上条上报对应的确认 */
设置灯亮度。平台通过下发Light Lightness Set(Opcode 0x824C)消息来设置灯的亮度。Light Lightness Set消息中的字段Lightness(16bit)表示亮度,0xFFFF(65535)表示最大亮度,即100%。示例中的0xE666(58982)为相对于0xFFFF (65535)的90%,0x828F(33423)为相对于0xFFFF (65535)的51%。
[RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0x824C [RX] Payload size: 5 [RX] 8F 82 C3 41 00 [146540]<I> SigE:20 [146550]<I> SIG mesg ElemID(0) +MESHMSGRX:7,824C8F82C34100 /*下发亮度调至51%:Light Lightness Set消息,Opcode 0x824C,Lightness 0x828F*/ [146584]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0x128 [TX] msg size: 7 [TX] 82 4E 66 E6 8F 82 41 /*设备回复Light Lightness Status消息,Opcode 0x824E,亮度从0xE666调到0x828F*/ [146652]<I> SigE:1 [146662]<I> SigE:12 [147513]<I> SigE:14 [147523]<I> SigE:4 [147533]<I> SigE:5 [147543]<I> SendTID(88) [147555]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0xF000 [TX] msg size: 8 [TX] D4 A8 01 88 21 01 8F 82 /* 设备上报Indication,TID 0x88,亮度0x828F(33423) */ [147624]<I> GenieE:55 [light_save_state]save 1 33423 20000 /* 保存开关1,亮度33423(51%),色温20000(100%) */ [147850]<I> RX Info [RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0xD501A8 [RX] Payload size: 1 [RX] 88 /* 设备收到Confirmation,TID 0x88,即上条上报对应的确认 */
设置灯色温。平台通过下发Light CTL Set(Opcode 0x825E)消息来设置灯的色温。Light CTL Set消息中的CTL Temperature字段(16bit)表示色温,取值范围为800~20000(即0x0320~0x4E20),其中下发0x320(800)代表色温值取最低(对应色温以百分比为单位的0%),0x4E20(20000)代表色温值取最高(对应色温以百分比为单位的100%)。中间的值按比例计算,如0x3020(12320)对应60%。
[RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0x825E [RX] Payload size: 9 [RX] FF FF 20 30 00 00 C5 41 00 [160694]<I> SigE:20 [160704]<I> SIG mesg ElemID(0) +MESHMSGRX:11,825EFFFF20300000C54100 /*Opcode 0x825F,Lightness 0xFFFF忽略,色温0x3020*/ [160744]<I> uv:0 lightness:65535 [160760]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0x128 [TX] msg size: 11 [TX] 82 60 8F 02 20 4E 8F 02 20 30 41/*设备回复Light CTL Status消息,Opcode 0x8260,目标色温0x3020*/ [160836]<I> SigE:1 [160846]<I> SigE:12 [161696]<I> SigE:14 [161706]<I> SigE:4 [161716]<I> SigE:5 [161726]<I> SendTID(8A) [161738]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0xF000 [TX] msg size: 8 [TX] D4 A8 01 8A 22 01 20 30 /* 设备上报Indication,TID 0x8A,色温0x3020(12320) */ [161806]<I> GenieE:55 /* 灯效执行完成 */ [light_save_state]save 1 655 12320 /* 保存开关1,亮度655(1%),色温12320(60%) */ [162070]<I> RX Info [RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0xD501A8 [RX] Payload size: 1 [RX] 8A /* 设备收到Confirmation,TID 0x8A,即上条上报对应的确认 */
设置灯模式。平台通过下发Scene Set(Opcode 0x8242)消息来设置灯的模式。Scene Set消息中的字段Scene Number(16bit)表示灯的场景模式,是枚举型数据,如0x0003对应阅读模式,0x0004对应影院模式。
[RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0x8242 [RX] Payload size: 5 [RX] 03 00 C8 00 00 [182079][gatt_proxy_advertise]Connectable advertising deferred (max connections) /*设备已有proxy连接*/ [182138]<I> SigE:20 [182148]<I> SIG mesg ElemID(0) +MESHMSGRX:7,82420300C80000 /*Opcode 0x8242,目标场景号0x0003,TID 0xC8,渐变时间0,delay 0*/ [182181]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0x128 [TX] msg size: 3 [TX] 5E 03 00 /*设备回复Scene Status消息,Opcode 0x5E,目标场景号0x0003*/ [182243]<I> SigE:1 [182252]<I> SigE:4 [182262]<I> SigE:5 [182272]<I> GenieE:55 /* 灯效执行完成 */ [182360]<I> RX Info [RX] RSSI: 0 [RX] SRC: 0x128 [182395]<I> ReTID(8C), LR(1) [182409]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0xF000 [TX] msg size: 8 [TX] D4 A8 01 8C 04 F0 03 00 /* 设备上报Indication,TID 0x8C,模式属性0x0003(阅读模式) */ [RX] DST: 0x1634 [RX] OPCODE: 0xD501A8 [RX] Payload size: 1 [RX] 8C /* 设备收到Confirmation,TID 0x8C,即上条上报对应的确认 */
调试云智能App解绑设备
在云智能App解绑设备,如下图所示。
云智能App解绑时设备端关键日志(前提:云智能App与网络已建立proxy连接)。
[RX] RSSI: 0 [RX] SRC: 0x128 [RX] DST: 0x1634 [RX] OPCODE: 0x8049 /*设备收到Config Node Reset消息,Opcode 0x8049,设备解除绑定*/ [RX] Payload size: 0 [311956]<I> TX Info [TX] SRC: 0x1634 [TX] DST: 0x128 [TX] msg size: 2 [TX] 80 4A /*设备回复Config Node Reset Status消息,Opcode 0x804A,确认解除绑定*/ [312022]<I> GenieE:1 /* 1:GENIE_EVT_SW_RESET */ [proxy_disconnected]conn(0x2000b63c) reason 0x16 /*断开proxy连接*/ [315125]<I> GenieE:10 /* 10:AIS连接断开 */ [315143]<I> GenieE:12 /* 12:GENIE_EVT_SDK_MESH_PBADV_START,开始待配网 */
说明在没有网关只有App的网络中,当App解绑设备时,只有App已与网络中节点存在proxy连接时,即App与被删除设备之间可通信时,设备才有可能收到解绑指令。
在没有网关只有App的网络中,当设备主动发起硬件复位(恢复出厂设置),上报硬件复位事件时,不能保证此时有App与网络中节点存在proxy连接,所以App不一定能收到设备的硬件复位事件。设备会清除配网信息,进入待配网状态。由于Mesh设备是抢占式的,App直接对其配网即可。
调试云智能App分享与控制设备
在分享者账号下分享设备,在被分享者账号下接受分享,如下图所示。
在被分享者账号下控制设备,注意被分享者的App也要先通过proxy连接接入分享者的网络才能实现控制。如果当前分享者网络中只有一个节点,由于一个节点只能同时允许一个proxy接入,则分享者与被分享者无法同时接入该节点的proxy服务。如果当前分享者网络中有N个设备,则理论上允许N个用户的App同时通过N个节点的proxy服务接入该网络。
调试云智能App分组控制
分组可实现同型号设备同步控制,必须两个以及以上的同型号设备(相同Product Key)才可以添加分组,且注意当前仅支持灯和插座产品。
添加分组与分组控制的示例如下。
添加分组时,云智能App会给设备配置添加组播地址,因此需要App与待添加分组设备之间可通信时(通过proxy直连或者别的proxy节点转发),该设备才能被添加成功。
添加分组时的设备端关键日志如下。
[RX] RSSI: 0 [RX] SRC: 0x133 [RX] DST: 0x2870 [RX] OPCODE: 0x801B /*设备收到Config Model Sub Add消息,Opcode:0x801B*/ [RX] Payload size: 6 [RX] 70 28 12 E7 00 10 /*Element Address 0x2870,添加组播地址0xE712*/ [116470]<I> TX Info [TX] SRC: 0x2870 [TX] DST: 0x133 [TX] msg size: 9 [TX] 80 1F 00 70 28 12 E7 00 10 /*设备回复Config Model Sub Status,Opcode:0x801F,Status 0:添加成功*/
分组控制时设备端关键日志如下。
[RX] RSSI: 0 [RX] SRC: 0x133 [RX] DST: 0xE712 /* 目标地址为0xE712的组播地址 */ [RX] OPCODE: 0x825E /* 设备收到Light CTL Set消息,Opcode:0x825E*/ [RX] Payload size: 9 [RX] 66 E6 20 30 00 00 2E 41 00 /* 目标色温值 0x3020(12320),即60%*/ [152135]<I> SigE:20 [152149]<I> SIG mesg ElemID(0) +MESHMSGRX:11,825E66E6203000002E4100 /* 色温值调整到0x3020,即60% */ [152251]<I> TX Info [TX] SRC: 0x2870 [TX] DST: 0x133 [TX] msg size: 11 [TX] 82 60 66 E6 20 4E 66 E6 20 30 41 /* 设备通过单播消息回复Light CTL Status */ [152327]<I> SigE:1 [152337]<I> SigE:12 [gatt_proxy_advertise]Connectable advertising deferred (max connections) /* 该节点有proxy连接,为proxy节点*/ [153229]<I> SigE:14 [153239]<I> SigE:4 [153249]<I> SigE:5 [153260]<I> SendTID(B1) [153271]<I> TX Info [TX] SRC: 0x2870 [TX] DST: 0xF000 [TX] msg size: 8 [TX] D4 A8 01 B1 22 01 20 30 /* 设备上报Indication,TID 0xB1,色温属性0x3020(60%) */ [153340]<I> GenieE:55 [light_save_state]save 1 58982 12320 /* 保存开关1,亮度90%,色温60% */ [RX] RSSI: 0 [RX] SRC: 0x133 [RX] DST: 0x2870 [RX] OPCODE: 0xD501A8 [RX] Payload size: 1 [RX] B1 /* 设备收到Confirmation,TID 0xB1,即上条上报对应的确认 */
删除分组时的设备端关键日志如下。
[RX] RSSI: 0 [RX] SRC: 0x133 [RX] DST: 0x2870 [RX] OPCODE: 0x801C /*设备收到Config Model Sub Delete消息,Opcode:0x801C*/ [RX] Payload size: 6 [RX] 70 28 12 E7 00 10 /*Element Address 0x2870,删除组播地址0xE712*/ [116470]<I> TX Info [TX] SRC: 0x2870 [TX] DST: 0x133 [TX] msg size: 9 [TX] 80 1F 00 70 28 12 E7 00 10 /*设备回复Config Model Sub Status,Opcode:0x801F,Status 0:删除成功*/
本地定时
自有品牌蓝牙Mesh产品暂不支持本地定时。
固件OTA
云智能App V3.10.0以上版本支持对自有品牌项目蓝牙Mesh设备做固件OTA,因此在开始OTA之前,注意检查和升级云智能App版本。
进入生活物联网平台的运营中心。
进入 页面,选择相应项目下的相应产品。
获取待升级固件文件和版本信息。固件编译成功后fota.bin文件即为OTA的bin文件。
版本号即为编译OTA的bin文件时指定的宏PROJECT_SW_VERSION的值。版本号格式遵循版本格式。
进入固件升级,在固件列表窗口下操作下列步骤。
单击添加固件。
在固件版本号栏中并输入OTA固件版本号。
在签名算法栏中,选择MD5。
单击选择固件下的上传固件,选择上传待升级的bin文件。
单击确定完成添加固件。
对新增加的固件执行操作验证固件。在待验证设备中选择测试设备的DeviceName。
进入云智能App,进入待验证设备的设备设置页面,单击立即升级开始OTA升级。
升级完成后,查看运营中心升级状态。
查看设备端关键日志。
GenieE:11 /* 建立AIS连接 */ ais cmd:0x10 state:1 len:20 ais rsp err(0) p_ind(0x1fffd718) ais cmd:0x12 state:2 len:5 ais rsp err(0) p_ind(0x1fffd718) ais cmd:0x20 state:3 len:20 ais cmd:0x20 state:3 len:20 ais cmd:0x22 state:3 len:20 [3696.886]<I>AOSBT genie_ota_handle_update_request:ota ver:0x00010202 imgT:0 imgS:202568 maxS:217088 /*新固件版本号与大小*/ [3697.192]<I>AOSBT genie_ota_status_report:ota last[15] total[15] size[1984] err[0] … ota progress:10 … ota progress:20 … ota progress:30 … ota progress:40 … ota progress:50 … ota progress:60 … ota progress:70 … ota progress:80 … ota progress:90 … ota progress:100 [3732.236]<I>AOSBT genie_ota_status_report:ota last[1] total[1] size[202568] err[0] ais cmd:0x25 state:4 len:20 ais notify msgid:0 cmd:26 len:16 ais timeout disconnect /*断开AIS连接*/ proxy disconn:0x1fff94e8 reason:0x16 [ 0.004]<I>INIT Build:Oct 12 2021,16:34:29 /*重启*/ [ 0.009]<I>INIT find 7 partitions [ 0.217]<I>AOSBT application_start:BTIME:Oct 12 2021,16:34:29 DEVICE:GenieLight APP VER:1.2.2 GenieSDK:V1.3.6 PROUDUCT:TG7120B MAC:28:FA:7A:A4:CA:C5 ais pre init …. GenieE:3
量产设备注意事项
购买激活码时,注意选择自有品牌蓝牙设备。
对于自有品牌项目的产品,智能生活物联网平台可以提供MAC地址段。
如果使用智能生活物联网提供的MAC地址,激活码生成方式可以选择自动生成。
如果需要自己上传MAC地址,作为Device Name来生成设备证书,激活码生成方式可以选择批量上传。