开发者学堂课程【物联网平台开发全栈教程:Alink 协议解析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/562/detail/7703
Alink 协议解析
基本内容
一、 相关内容
二、 编译
三、 服务器模拟真实设备
一、 相关内容
1、在 WIFI.c 里面解析 MQTT 里面读取的信息;
//接收 MQTT 服努器友送辻来的数据,解析
void Analyze_ MQTT_ Read (void)
{
unsigned int Len=0,i=0;
// i=0 是个临时的变量
unsigned char Dat[256] ;
// 缓冲区的大小不超过256;
//如果用户觉得这个逻辑有问题,那就可以自己尝试去改变这个数值;
if(Get Mess Count_ WIFI() == 0)
return;
//首先会直接读取有没有信息过来如果没有信息那就直接退出。
// 如果说有数据,只要不是0那么它就直接读取缓冲区里所有的数据。
Len=0;
while(Get_ Byte_ WIFI (&Dat [Len++] ) ) ;
//获取接收缓冲区数据
Dat [Len] = 0;
// 这个做法其实是不科学的;
for(i=0;i
{
if((Dat[i] == 0XD0)& (Dat[i+1]==0x00) )
//检验此处是否包含 D0或者是00, 只要连续的两个是 D0或者是00, 那证明此处是回复的心跳。
send_ stzl
("\r\n收到 MQTT 服务器回复的心跳信号! \r\n");
if(Dat[i] == O)
//把前面二进制传输时的0去掉 ;
// 二进制中的00有很多个含义; 服务器上面下发的数据里面很可能还包含着许多个00;
//一旦碰到 Dat 里面有0,它的妙用则体现在 Compare_ str,Compare_ str 这个子函数会认为 Buf 里面都是 ASCII 字符,其实“1”不是 ASCII 字符,但是它如果在比较的时候遇到了0,它就会直接退出。(Dat 就是 buf)
Dat [i] = 1;
// 所以在这里 有一个简单的处理,把0授予1, 观察有没有出现 D0和00结合的情况,如果存在这样的情况, 那么就回复一下心跳。
if (Compare_ str (Dat, "\"WorkSwitch\":1") != 255)
// 先来比较一下 WorkSwitch 里面有没有1;
//在定义产品的时候,产品-功能定义; 在功能定义里面有一个标志符, 这个标识符非常的重要, 标志符的布尔值不是0就是1;如下图光标存在点所示:
{
Relay = 1;
Send Strl
("\r\l平台下发命令:打开继电器! \r\n");
//比较之后,发现 WorkSwitch 的数值为1,那么接着打开继电器;
}
if (Compare str (Dat, ") "WorkSwitch":0") != 255)
{
Relay = 0;
Send Strl
("\r\l平台下发命令:关闭继电器! \r\n");
//比较之后,发现 WorkSwitch 的数值为0,那么接着将会关闭继电器;
二、 编译
编译时将它加入单片机,观察在日志里面它会输出什么内容?
和 WIFI 模组交互的程序一切正常;
TCP Connect OK; 证明服务器的 TCP 链接是成功的;
MQTT 连接成功;
发送心跳;
收到心跳信号;
服务器连接正常;
三、 服务器模拟真实设备
1、产品-在线调试-选择设备-如下图红色边框内所示:
2、向下翻页-调试功能:运行开关(WorkSwitch)-方法设置
(1)当 WorkSwitch=1时,可以看到日志上:平台下发命令:打开继电器;
(2)当 WorkSwitch=0时,可以看到日志上:平台下发命令:关闭继电器;
如果想看一下平台发送了什么内容, 其实在之前使用 MQTT 的函数的时候,就已经知道它会发送一长串的内容,里面会包含 WorkSwitch =0或者 WorkSwitch =1;如果想看,就可以使用串口1将 Dat 的内容发出去,在串口1的窗口看到底发送了什么内容。
解析就是 Compare_str 这个子函数,有没有“0”或者“1”;它的做法其实并没有很科学,没有解析 json,也没有在 json 解析完之后再看哪一个字段到底是多少?这样做法是非常粗暴、非常直接的,就是简单的判断一下里面时候含有“WorkSwitch=1”、“ WorkSwitch=0”,本身学习编程就是为了简单的数据上报和简单的开关控制,所以说用粗暴的方法解决也是可以的,它本身的业务逻辑也没有那么复杂,需要学习的是在不同的场合去使用不同的思维做事情。