LV04-天猫蓝牙Mesh项目-02-进阶开发-08-手机连接Mesh节点控制

本文主要是天猫蓝牙Mesh项目——进阶开发 手机连接Mesh节点控制 的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu22.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
点击查看本文参考资料
分类 网址 说明
官方网站 阿里云 阿里云官网主页
阿里生活物联平台 生活物联网平台(飞燕平台)主页
AliGenie 天猫精灵开放平台AliGenie主页
阿里物联网平台 阿里物联网平台主页
Bluetooth 技术网站 蓝牙协议规范什么的可以来这里找
Telink Telink | Chips for a Smarter IoT (telink-semi.com)
Telink中文官网
开发手册 AliOS Things开发指南 AliOS Things开发指南,这里是最新版本,可以直接从官网找到
AliOS Things开发指南 AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档
AliOS Things开发指南(3.0) AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档
生活物联网平台开发文档 生活物联网平台(飞燕平台)开发文档
《设备端开发指南》
Wi-Fi IoT品类定义与功能开发 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发
硬件平台 mk3080 WiFi开发板 WiFi开发板使用指南-阿里云开发者社区
esp8266开发板 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com)
TLSR8258 Datasheet Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258
参考资料 AliOS Things 3.0 应用开发指南 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考
IP知识百科 - 华为 (huawei.com) IP的一些相关知识点
点击查看相关文件下载
分类 网址 说明
蓝牙规范相关文档 Core Specification 5.2 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。
《Core_v5.2.pdf》
Mesh Model(v1.1) 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。
本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。
《MshMDL_v1.1.pdf》
Mesh Profile(v1.0.1) 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。
《MshPRFv1.0.1.pdf》
Mesh Device Properties 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。
但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》
GATT Specification Supplement GATT Specification Supplement | Bluetooth® Technology Website。
好像可以在线看:《GATT Specification Supplement》
Assigned Numbers GATT的一些类型定义可以在这里找。
AliOS Things alios-things/AliOS-Things Gitee上的AliOSThings SDK源码仓库
alibaba/AliOS-Things GitHub上的AliOSThings SDK源码仓库
天猫精灵蓝牙Mesh协议栈 alibaba-archive/genie-bt-mesh-stack GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。
之前是在alibaba/genie-bt-mesh-stack这个仓库。
写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a
蓝牙Mesh设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

这一LV的笔记起始跟前面有所重叠,互相补充吧算是。

一、nRF Mesh

1. nRF Mesh简介

网上没找到,反正它就是一个蓝牙Mesh开发过程中的一个手机调试工具,他可以作为配网器对未配网设备进行配网。官网(nRF Mesh - nordicsemi.com)是这么说的:

Provision, configure and control Bluetooth mesh networks

The nRF Mesh apps enable you to provision, configure and control Bluetooth mesh networks. They demonstrate a subset of the capabilities of the nRF Mesh open source libraries. Nordic has created these apps to bring the natural benefits of using a smartphone in Bluetooth mesh setup and control activities. Provision devices with authentication and use the generic interface to configure and control the nodes.

The source code is available on GitHub and we encourage you to use it as a starting point for your Bluetooth mesh development.

Features:

  • Provision, configure, and control of nodes
  • Management of network, network keys, and application keys
  • Management of publications and subscriptions
  • Generic OnOff, Level and Scenes control
  • Sending messages to vendor models
  • Sharing network configuration with other phones

这个软件是有ios版本和安卓版本的:

image-20240105222655334

后面都是以安卓版本的为例来写,我自己用的iPhone,所以我直接去App Store下载了ios版本,后面我自己用的是ios版本的,功能都是一样的。

2. 软件安装

在写配网器代码前,先要让设备可以作为无oob模式进行配网,以便后期配网器可以先避开oob验证,降低代码难度。我们可以用手机app做配网器来连接节点。

2.1 安卓版本

image-20231231083029577

安装完成如下所示:

image-20231231083145977

2.2 ios版本

直接去App Store下载即可:

image-20240105223124535

安装完毕后如下图:

image-20240105223743038

二、手机连接控制蓝牙Mesh节点

我们使用之前做的这个工程来做测试:feat:bt_node工程添加按键控制风扇功能 · sumumm/my-genie-bt-mesh-stack@61e8273 (github.com),整个工程其实之前没搞完,这里从这次提交开始先做测试吧,后续会继续完善。

1. 将静态oob改为无oob

详细改动的部分可以看代码仓库:feat:bt_node工程为例演示手机连接蓝牙Mesh控制设备(无OOB,所有工程都会生效) · sumumm/my-genie-bt-mesh-stack@f28719e (github.com)

后来改了一下,这些代码通过指定工程中的宏来进行控制:feat:bt_node工程为例演示手机连接蓝牙Mesh控制设备(无OOB的配置使用宏进行打开关闭) · sumumm/my-genie-bt-mesh-stack@ce2ea88 (github.com)

1.1 GENIE_OLD_AUTH

从代码中搜索宏 GENIE_OLD_AUTH 所有涉及的地方。

  • genie-bt-mesh-stack/genie_app/bluetooth/mesh/genie_mesh.c:genie_mesh_init()
1
2
3
4
5
6
//在 void genie_mesh_init(void) 函数里
//配网信息关于静态oob数据要填 NULL 和 0
#ifdef GENIE_OLD_AUTH
prov.static_val = genie_tri_tuple_get_auth();
prov.static_val_len = STATIC_OOB_LENGTH;
#endif
  • genie-bt-mesh-stack/network/bluetooth/bt_mesh/src/prov.c:prov_invite()
1
2
3
4
5
6
7
//在 static void prov_invite(const u8_t *data) 函数里
//只有prov->static_val 等于NULL,发送配网邀请的时候才会把对应的静态oob标志位写为0。
#ifdef GENIE_OLD_AUTH
net_buf_simple_add_u8(buf, prov->static_val ? MESH_BIT(0) : 0x00);
#else
net_buf_simple_add_u8(buf, MESH_BIT(0));
#endif
  • genie-bt-mesh-stack/network/bluetooth/bt_mesh/src/prov.c:send_confirm()
1
2
3
4
5
6
7
8
9
//在 static void send_confirm(void) 函数里
//在获取认证数据的时候会产生认证随机值填充 link.auth ,将参与加密运算。
//此时需要把 link.auth 设置为全0,以无00b的方式来和手机匹配。
#ifdef GENIE_OLD_AUTH
memcpy(link.auth , genie_tri_tuple_get_auth(), STATIC_OOB_LENGTH);
#else
memcpy(link.auth , genie_tri_tuple_get_auth(link.rand), STATIC_OOB_LENGTH);
#endif
memset(link.auth ,0,STATIC_OOB_LENGTH); //新添加
  • genie-bt-mesh-stack/network/bluetooth/bt_mesh/src/prov.c:prov_random()
1
2
3
4
5
6
7
//在  static void prov_random(const u8_t *data)  函数里
#ifdef GENIE_OLD_AUTH
memcpy(link.auth , genie_tri_tuple_get_auth(), STATIC_OOB_LENGTH);
#else
memcpy(link.auth , genie_tri_tuple_get_auth(data), STATIC_OOB_LENGTH);
#endif
memset(link.auth,0,STATIC_OOB_LENGTH); //新添加

1.2 prov_auth()

修改 genie-bt-mesh-stack/network/bluetooth/bt_mesh/src/prov.c:prov_auth() 函数中关于认证方式的返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
static int prov_auth(u8_t method, u8_t action, u8_t size)
{
#if 0
bt_mesh_output_action_t output;
bt_mesh_input_action_t input;
#endif

switch (method) {
case AUTH_METHOD_STATIC:
if (action || size) {
return -EINVAL;
}
memcpy(link.auth + 16 - prov->static_val_len,
prov->static_val, prov->static_val_len);
memset(link.auth, 0, sizeof(link.auth) - prov->static_val_len);
return 0;
//#if 0 //refuse other method //将此行 #if 0 转移到下边
case AUTH_METHOD_NO_OOB: //开启无oob此处需要进入
if (action || size) {
return -EINVAL;
}

memset(link.auth, 0, sizeof(link.auth));
return 0;
#if 0 //refuse other method
case AUTH_METHOD_OUTPUT:
output = output_action(action);
if (!output) {
return -EINVAL;
}

if (!(prov->output_actions & output)) {
return -EINVAL;
}

if (size > prov->output_size) {
return -EINVAL;
}

if (output == BT_MESH_DISPLAY_STRING) {
unsigned char str[9];
u8_t i;

bt_mesh_rand(str, size);

/* Normalize to '0' .. '9' & 'A' .. 'Z' */
for (i = 0; i < size; i++) {
str[i] %= 36;
if (str[i] < 10) {
str[i] += '0';
} else {
str[i] += 'A' - 10;
}
}
str[size] = '\0';

memcpy(link.auth, str, size);
memset(link.auth + size, 0, sizeof(link.auth) - size);

return prov->output_string((char *)str);
} else {
u32_t div[8] = { 10, 100, 1000, 10000, 100000,
1000000, 10000000, 100000000
};
u32_t num;

bt_mesh_rand(&num, sizeof(num));
num %= div[size - 1];

sys_put_be32(num, &link.auth[12]);
memset(link.auth, 0, 12);

return prov->output_number(output, num);
}

case AUTH_METHOD_INPUT:
input = input_action(action);
if (!input) {
return -EINVAL;
}

if (!(prov->input_actions & input)) {
return -EINVAL;
}

if (size > prov->input_size) {
return -EINVAL;
}

if (input == BT_MESH_ENTER_STRING) {
atomic_set_bit(link.flags, WAIT_STRING);
} else {
atomic_set_bit(link.flags, WAIT_NUMBER);
}

return prov->input(input, size);
#endif
default:
return -EINVAL;
}
}

2. 实现手机控制LED灯

2.1 硬件配置

(1)修改为无oob配网后,用 helloworld 示例工程生成 .bin 文件。

(2)将Red引脚和PB4引脚通过杜邦线或者跳线帽连接。

image-20231231083452626

2.2 安卓手机操作

2.3 IOS版本操作

我自己用的是IOS版本,操作如下:

  • (1)添加Application Keys,这里在绑定设备的时候会用到,所以先创建一个,这里是可以创建多个的
image-20240105231912777
  • (2)添加设备
image-20240105233103479

在此期间,串口的打印信息如下:

image-20240105232421901
  • (3)邀请配网
image-20240105233430437

这个过程中打印信息如下:

image-20240105232759091
  • (4)设备添加App Key

注意这里一定要在刚配网完成的时候添加,要是隔一段时间再去添加,可能就会添加不成功,我猜测是因为我们的蓝牙Mesh设备退出了某种状态,具体没有深究了。

image-20240105234929949

这个过程中串口打印信息如下,反正是这个过程中打印的,具体表示什么没有详细分析:

image-20240106000008861
  • (5)通用开关服务的使用
image-20240105235748597

重复打开OFF和ON的话,会有以下打印信息:

image-20240106000149738

这个时候我们会发现红色LED随着开关而亮起熄灭。

3. 修改蓝牙设备名字

我们上面手机上找到的蓝牙设备名字为AOS Device,这个是可以修改的,我们搜索一下:

image-20240106000723949

会发现,有两个文件中有,我们可以修改尝试一下,就会发现,我们改这个network/bluetooth/bt_common/port/include/config.h文件中的才会真正修改设备的名字。

image-20240106001203737