LV03-04-天猫蓝牙Mesh开发-04-开发板对接天猫精灵

本文主要是天猫蓝牙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设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

一、工程代码

1. 工程创建

我们需要使用SDK的app/example/bluetooth/light_ctl这个demo,我们复制一份,先体验一下开发板接入天猫精灵是怎样的。

image-20231225214606775

一定要注意重命名这两个文件,否则可能会编译不通过。

2. 定义三元组信息

我们先不做功能上的开发,我们先把创建的云端设备信息写入到开发板中,我们找到这个文件genie_app/base/tri_tuple_default.h:

image-20231225221237743

可以看到这里就是我们填写设备的三元组信息的地方,我们打开

image-20231225221442686

我们修改上面的三个宏如下:

1
2
3
#define DEFAULT_PID    21176303                             // product_id
#define DEFAULT_SECRET "17e0e0266ffe3c6ecee7510d4dec7361" // device_secret
#define DEFAULT_MAC "64f0ad03a185" // device_name

3. 编译工程

我们可以到demo目录下,执行以下命令:

1
aos make bluetooth.light_ctl_demo@tc825x

或者修改task.json,修改后通过vscode的命令框来选择对应的标签进行编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"version": "2.0.0",
"tasks": [
{
"label": "tc825x", //标签,会在生成代码中显示出来此目标名
"type": "shell", //类型为shell
"command": "aos", //此处配置命令,本初使用的alios,所以指定了aos,如果是直接make就指定make即可
"args": [
"make",
"bluetooth.light_ctl_demo@tc825x", //此处为命令跟的参数,也就是aos make bluetooth.light_ctl@tc825x
],
"group": "build", //归属于build组下,编译目标类别内
"presentation": {
"reveal": "silent" // 此处为出现错误时才会进行输出
},
"problemMatcher": "$msCompile" // 此处为使用标准的MS编译器输出错误和警告等信息
},
}

编译成功如下所示:

image-20231225214855903

然后会在蓝牙协议栈顶层源码目录的out/bluetooth.light_ctl_demo@tc825x/binary目录下生成对应的可执行文件:

image-20231225215016378

4. 烧录程序

image-20231225222327458

5. 重启测试

我们重启一下开发板,会有以下打印信息:

image-20231225222458683

发现报了一些错之类的,但是似乎并不影响。

二、开发板联网

1. 软硬件准备

1.1 天猫精灵智能音箱

用的这款方糖3 智能音箱:

image-20231213074955022

1.2 天猫精灵app

我们直接去应用商店搜索天猫精灵即可:

image-20231213075144757

1.3 泰凌微TLSR8258

image-20231225223652046

2. 天猫精灵语音配网

我们首先使用天猫精灵语音控制来配网。

2.1 进入配网模式

我们前面知道,烧写完程序后,启动开发板,会有如下打印信息:

image-20231225222458683

要是之前没有配过网,这里是自动在配网模式的,不需要做别的操作。

2.2 语音唤醒天猫精灵开始配网

  • (1)语音:天猫精灵,找朋友

先说天猫精灵,等待回应后,说出找朋友三个字,然后天猫精灵就会提示正在扫描智能设备,然后开始扫描周围处于配网模式的设备。

  • (2)语音:连接

当天猫精灵扫描到我们的泰凌微TLSR8258开发板的时候,会提示我们发现了我们的智能设备(这里是智能灯),会询问我们是否连接,然后会有“叮咚”一声的提醒,提醒后,我们说出连接,我们的泰凌微TLSR8258就会开始蓝牙Mesh配网。时候就会提示连接中,请稍后,并且,开发板的串口会有以下打印信息:

image-20231225223956687

还有很多的打印信息,当连接成功后,天猫精灵会提示连接成功,然后我们会看到一系列这样的打印:

image-20231225224019518

2.3 设备上线

这个时候我们进入网页端的项目中:产品管理 - 生活物联网平台 (aliyun.com)——设备调试,会发现我们的设备已在线:

image-20231225224105594

3. 注意

这里好像有个很坑的事,就是每次烧写完代码都需要重新使用天猫精灵配对。

三、Genie_app

Genie_app目录为天猫精灵的核心处理代码,之所以填充三元组就可以进行广播被发现全是它带来的功劳,这里面包含了事件处理,命令,flash操作,三元组,以及模型等等内容,后面将要实现的智能灯就是通过Genie_app的事件处理完成的,在这里面需要重点了解几个函数。

1. genie_event.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//genie事件处理,此处会被传入关于,设备reset、prov、appkey、sub、sequpdate以及vendor等消
息,应用开发只需在对应的动作下完成自己的动作即可,但这里还不是我们常用的,继续追溯代码。
void genie_event(E_GENIE_EVENT event, void *p_arg)
{
switch(event)
{
case GENIE_EVT_SDK_INDICATE: //上报事件,如果是厂商数据的话需要自行触发和修改
next_event = _genie_event_handle_indicate((elem_state_t *)p_arg);
break;
}
if(!ignore_user_event)
user_event(event, p_arg); //此函数需要重点关注,此函数没有函数原型是需要用户自己去写的,其格书写方法与genie_event类似,通过追溯代码发现,genie_event在相关状态执行完成过后会把状态和数据传给user_event,开发者只需要在user_event中获取到相关数据进行执行就可以了。
if(next_event != event) {
genie_event(next_event, p_arg);
}
}

2. tri_tuple_default.c

1
2
3
4
//三元组信息,申请到的三元组信息添加即可
#define DEFAULT_PID 13xx
#define DEFAULT_SECRET "61c03xxxxxxaeca6f47d9ba17437d"
#define DEFAULT_MAC "28xxx6bd2

3. genie_app.c

1
2
3
4
5
6
7
//如下函数可以得值,genie_init执行了一次flash_init,随后执行了genie_mesh_init
void genie_init(void)
{
genie_flash_init();
genie_mesh_init(); //包含了广播数据的线程启动,这也是为什么app中直接调用一次genie_init就可以了。
//同时此处会调用 genie_event(GENIE_EVT_SDK_MESH_INIT,NULL);最终会到 user_event(GENIE_EVT_SDK_MESH_INIT,NULL);
}