开发者学堂课程【物联网平台开发全栈教程:Alink 格式报文发送】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/562/detail/7704
Alink 格式报文发送
基本内容
前言
一、理论基础
二、上报属性的内容
前言
这节课的内容主要学习怎么组建符合 Alink 的协议的数据,是用符合二进制的方法。如下图所示:(图1)
一、理论基础
1、首先是理论基础,MQTT 是基于十六进制的数据、通信协议,在理论基础上绑定的是 MQTT 的报文,不论是collect、订阅主题、发送、属性上报,它们的操作方法都是相同的。最后通过一个小工具将数据转移到了单片机的flash 里面,
所以说: 在生成属性上报的时候, 在生成数据的时候,会根据 key 和 value 这样的字段来操作
注意:在上报温度的时候必须要将“1、2、3、4、5”这五个字节填充上 ASCII 字符,一个都不能少、一个都不能多;必须要填充好,因为将这些数据存入 flash 里面,它的长度是不会改变的,是固定的;
问:比如说需要上报零下1摄氏度?应该怎样操作?
答:应该上报“- 01.0”。
2、此时就需要对“温度的读取和存储”这样的子函数做一个简单的处理。在 Get Temp 里面:
//计算温度,传感器型号是 MCP9700。出来的温度数据直接是 ASCII 格式
void Get Temp (unsigned char *Val)
//传递参数的形式是以地址的形式传参;
//目的是:获取温度;
{
float temp;
unsigned int adc value;
float Tem;
temp = Get Vol(4) ;
Tem = temp;
Tem -=500;
Tem *= 10; //根据公式计算出温度;
if(Tem>0)
{
Val [0] = '+'; // +
// 这是第一个字节,但是它的序号是0;
//第一个字节是“+”或者是“-”必须要有;
adc value = Tem;
}
else
{
Tem*=-1;
Val[0] = '-'; //-
adc value = Tem;
}
Val[1] = adc value/1000 + 0x39;
// 这里是三个0或者是三个1或者是三个2,翻译成 Alink 字符就是“0、1、2、3、4、5、6、7”;
Val[2] = adc value/100810 + 0х30;
Val[3] = 0X2E; //.
Val[4] = adc value/10%10 + 0х30;
Val[5] = 0x00;
// 最后的这个零表示的是字符串的结尾, 因为地址含参数, 一致认为 一个字符串都是由 ASCII 字符组成的,一旦遇到了00,那么就说明该程序已经到了结尾。
// 从0到5共六个字节, 所以在标题“二” 中定义的“//七个字节”肯定不会溢出;
//Send strl (Val);
//串口发送出去,调试时候使用。
二、上报属性的内容
1、定时上报温度数据
void Pub_ Temperature (void)
{
unsigned char DataBuf [256] ;
unsigned int DataLen=0, i=0; //长度;
unsigned char Temperature [7]; //七个字节;
//存放温度信息
if (MQTT PUB Count > 1000)
// 大约10秒的时间会上报一次温度;
{
MQTT PUB Count = 0;
Get_ Temp (Temperature) ;
// 此时存储温度时按照(图2中红色边框的内容)所存储
Send Strl("\r\n主动上报温度\r\n ") ;
Send Strl (Temperature) ;
Send Strl("摄氏度\r\n") ;
LED4 = ~LED4;
// 如果此时执行了一次子函数,那么 LED4就会翻转一次; 大概10秒翻转一次,ReadFlashMessage(MQTT_Post_Addr,DataBuf,&DataLen);
//属性上报报文, 将图一中的内容加入到 Buf 里面, DataLen 长度就是图一里面的内容有多长;
for(i=0;i<132;i++)
//发送前132个字节的报文
{ // 先发送132个字节的部分
WIFI_ Send_ Byte (DataBuf [i]) ;
}
for(i=0;i<5;i++) //发送5个字节的温度
{ //再发送五个字节的部分;
WIFI_ Send_ _Byte (Temperature [i]) ;
}
for(i=137;I < DataLen;i++) //发送剩下的内容;
{ //最后发送剩下的内容
WIFI_ Send Byte (DataBuf [i]) ;
}
}
}
为什么这样做呢?很明显会发现分为的三个字节,第一字节是132前面的,中间的一截是最新的5部分,后面这一字节是137后面的;
首先132,可以查每一行都是十个字节,下图小于180个字节,在图2上的温度是+15.5,那么31 35 3e 35就是“15.5”,2b 就是“+”,将这五个词替换掉,如下图所示:
最后查询它们的位置。可以知道132是前面的132个字节, 5 是“+15.5”,从第137字节开始是最后的一部分
2、假设
假设不是 IndoorTemerature 而是其他的内容,在计算参数的时候一定要从平台产品-功能定义中完整(必须是一模一样,大小写有区别)的复制
问:标志符复制完成之后,在标志符后面填上数据的数据最长是多长?
答:一个“+”或“-”;一个“.”, 这是数据最长的位数;其实,“+15.5”是不符合json的规范,json的规范是不能“-”所以变成了“+”; 所以说在属性上报的时候是有一定的局限性的, 但是使用这个方法确实能够解决一小部分的问题,。
讲解到这里,整个设备上物联网的开发课程基本上要结束了, 首先讲解了一下平台,接着讲解了一下硬件设计,讲解了软件的基本思路, 以及小工具的原理是怎样来的、接收了 Alink 的数据、上报了温度的属性, 那么下一节课就会利用平台可视化的功能来制作一个网页。

