LV02-01-天猫精灵IOT-01-WiFi智能灯-03-天猫精灵控制智能灯

本文主要是天猫精灵IOT——天猫精灵控制智能灯的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
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. 功能属性说明

我们在创建产品的时候定义了产品功能(产品管理 - 生活物联网平台 (aliyun.com)):

image-20231213215015917

在这里我们定义了开关属性,可以看到它的标识符为powerstate,数据类型是bool类型,0表示关闭,1表示打开。

2. 有哪些语音可用?

我们打开人机交互界面的语音交互面板(产品管理 - 生活物联网平台 (aliyun.com)):

image-20231213215325274

可以看到这里有一个控制口令,这里的含义就是我们对于前面工功能定义面板中定义的开关功能来讲,我们可以通过后面的语料来告诉天猫精灵下发对应的命令,比如我们说一个开灯,就会下发一个打开指令,也就是说前面的powerstate就会等于1,关灯也是一样。

3. 测试现象

我们使用天猫精灵对设备进行配网,然后对其说开灯和关灯,我们看一下会有什么现象:

  • 开灯
image-20231213215717199

可以看到这个powerstate变量的值为1了。

  • 关灯
image-20231213215808444

4. 在哪里获取这个值?

那我们的mk3080是在哪里获取的这个值的呢?我们看一下这个linkkit_mk3080/linkkit_example_solo.c文件中的下面这个函数:

1
2
3
4
5
6
7
8
9
10
11
12
/** recv event post response message from cloud **/
static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
{
int res = 0;
EXAMPLE_TRACE("Property Set Received, Request: %s", request);

res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
(unsigned char *)request, request_len);
EXAMPLE_TRACE("Post Property Message ID: %d", res);

return 0;
}

这个函数就是mk3080开发板收到天猫精灵下发的指令后的回调函数,我们可以来测试一下,我们修改函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/** recv event post response message from cloud **/
static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
{
int res = 0;
EXAMPLE_TRACE("++++++++++ 开始处理天猫精灵下发的命令... ++++++++++");
EXAMPLE_TRACE("Property Set Received, Request: %s", request);

res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
(unsigned char *)request, request_len);
EXAMPLE_TRACE("Post Property Message ID: %d", res);
EXAMPLE_TRACE("++++++++++ 处理完毕!!! ++++++++++");
return 0;
}

其实就是加了两行打印信息,我们编译烧写到开发板中,通过语音说开灯,就会看到如下打印信息:

image-20231213221810581

所以从这里我们就知道了如何来控制我们的LED灯了。

二、控制LED开关

1. 工程代码

具体修改的内容可以看这里:feat:语音控制灯的开关 · 9617509 · sumumm/AliOS-Things-Prj - Gitee.com

1.1 LED驱动代码

我们需要添加LED灯控制的相关代码,我们在linkkit_mk3080/app_entry.c中添加如下代码:

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
static gpio_dev_t  led_gpio_dev[3] = {0};

int sys_led_init(void)
{
//由于PA14时rtl8710的jtag接口,我要使用GPIO功能,必须先关闭jtag借口
sys_jtag_off();
led_gpio_dev[0].port = RED_LED;
led_gpio_dev[0].config = OUTPUT_PUSH_PULL;
led_gpio_dev[0].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[0]);

led_gpio_dev[1].port = GRE_LED;
led_gpio_dev[1].config = OUTPUT_PUSH_PULL;
led_gpio_dev[1].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[1]);

led_gpio_dev[2].port = BLU_LED;
led_gpio_dev[2].config = OUTPUT_PUSH_PULL;
led_gpio_dev[2].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[2]);

return 0;
}

然后我们在application_start()函数中对LED进行初始化即可。注意在linkkit_mk3080/app_entry.h中添加一个枚举类型:

1
2
3
4
5
typedef enum __LED_PORT_{
RED_LED = 0, // PA14
GRE_LED = 1, // PA15
BLU_LED = 6, // PA00
}LED_PORT;

1.2 解析天猫精灵命令

接下来我们就需要解析以下天猫精灵下发的命令,并且对LED进行控制,我们修改linkkit_mk3080/linkkit_example_solo.c中user_property_set_event_handler()函数如下:

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
/** recv event post response message from cloud **/
static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
{
int res = 0;
cJSON *root = NULL;
cJSON *pwrStobj = NULL;

EXAMPLE_TRACE("++++++++++ 开始处理天猫精灵下发的命令... ++++++++++");
EXAMPLE_TRACE("Property Set Received, Request: %s", request);
res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
(unsigned char *)request, request_len);

root = cJSON_Parse(request);
if(root)
{
pwrStobj = cJSON_GetObjectItem(root, "powerstate");
if(pwrStobj)
{
EXAMPLE_TRACE("pwrStobj->valueint=%d", pwrStobj->valueint);
func_led_ctrl(0, pwrStobj->valueint);
func_led_ctrl(1, pwrStobj->valueint);
func_led_ctrl(2, pwrStobj->valueint);
}
}
EXAMPLE_TRACE("Post Property Message ID: %d", res);
EXAMPLE_TRACE("++++++++++ 处理完毕!!! ++++++++++");
return 0;
}

2. 测试结果

我们分别进行开灯和关灯测试,正常来讲,天猫精灵会打开或者关闭所有的灯。

  • 开灯
image-20231213224636145
  • 关灯

image-20231213224711504

三、控制不同颜色LED

现在我们想控制不同颜色的LED亮和灭,比如红绿蓝白,四种灯。

1. 添加功能属性

我们打开功能定义界面(产品管理 - 生活物联网平台 (aliyun.com)),点击标准功能里面的添加功能。

image-20231213231524039

然后会弹出以下弹窗,我们选择颜色属性,然后点击确定即可。

image-20231213231623582

之后我们便可以在标准功能看到我们添加的属性了:

image-20231213231714621

我们其实不需要这么多,进行精简一下,点击右侧的编辑即可修改该属性,修改后如下:

image-20231213231835108

可以看到这次的标识符为color,类型为枚举,值与颜色一一对应。

2. 语音交互

语音交互其实我们是不可编辑的,但是我么还是要看一下有哪些语音可以下发颜色属性,我们打开人机交互中的语音交互面板(产品管理 - 生活物联网平台 (aliyun.com)):

image-20231213232056693

3. 工程代码

3.1 LED驱动代码

与前面一模一样。

3.2 解析天猫精灵命令

我们修改linkkit_mk3080/linkkit_example_solo.c中user_property_set_event_handler()函数如下:

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
/** recv event post response message from cloud **/
static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
{
int res = 0;
cJSON *root = NULL;
cJSON *pwrStobj = NULL;
cJSON *colorStobj = NULL;
static int led_status = 0;
static int led_color = 0;
EXAMPLE_TRACE("++++++++++ 开始处理天猫精灵下发的命令... ++++++++++");
EXAMPLE_TRACE("Property Set Received, Request: %s", request);
res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
(unsigned char *)request, request_len);

root = cJSON_Parse(request);
if(root)
{
pwrStobj = cJSON_GetObjectItem(root, "powerstate");
if(pwrStobj)
{
EXAMPLE_TRACE("pwrStobj->valueint=%d", pwrStobj->valueint);
led_status = pwrStobj->valueint;
}

colorStobj = cJSON_GetObjectItem(root, "color");
if(colorStobj)
{
EXAMPLE_TRACE("colorStobj->valueint=%d", colorStobj->valueint);
led_color = colorStobj->valueint;
}
switch(led_color)
{
case 255: //蓝色
func_led_ctrl(0, 0);
func_led_ctrl(1, 0);
func_led_ctrl(2, led_status);
break;
case 65280: //绿色
func_led_ctrl(0, 0);
func_led_ctrl(1, led_status);
func_led_ctrl(2, 0);
break;
case 16711680: //红色
func_led_ctrl(0, led_status);
func_led_ctrl(1, 0);
func_led_ctrl(2, 0);
break;
case 16777215: //白色
func_led_ctrl(0, led_status);
func_led_ctrl(1, led_status);
func_led_ctrl(2, led_status);
default:
func_led_ctrl(0, led_status);
func_led_ctrl(1, led_status);
func_led_ctrl(2, led_status);
break;
}
}
EXAMPLE_TRACE("Post Property Message ID: %d", res);
EXAMPLE_TRACE("++++++++++ 处理完毕!!! ++++++++++");
return 0;
}

4. 测试结果

需要注意的是,前面的代码逻辑上需要先开灯后,切换灯的颜色才会生效。

  • 语音:灯调成蓝色
image-20231214224728264
  • 语音:灯调成红色
image-20231214224816736
  • 语音:灯调成绿色
image-20231214224901124
  • 语音:灯调成白色
image-20231214225038069

四、控制灯的亮度

流程跟前面一样,只是需要一个PWM输出,这里就不详细说明了,直接看代码吧:feat:语音控制灯亮度 · 2854463 · sumumm/AliOS-Things-Prj - Gitee.com