阿里云物联网平台与单片机通信采用MQTT协议(阿里云兼容MQTT3.1和MQTT3.1.0),什么是MQTT协议?MQTT是一种基于发布/订阅(publish/subscribe)模式的”轻量级”的应用层协议,该协议构建于TCP/IP协议上(类似HTTP),所以在MQTT通信之前需要建立TCP连接。 一个数据包包括包头,可变包头和负载三个部分(部分报文没有可变和负载部分,如ping,disconnect)。 包头由固定包头字节和剩余长度组成,其中固定包头字节的高四位表示控制包类型,低四位表示每个MQTT控制包类型的特殊标识,如连接报文(connect)的包头固定字节为0x10。 

从第二个字节开始就是数据包长度,指可变包头和负载的长度。注意包长度所占的字节数没有指定,也就是说长度可以占一个字节,两个,甚至更多。那么怎么知道长度到哪结束呢?数据包长度的每个字节最高位代表是否进位,剩下七位才代表长度,如果最高位置一则说明下个字节还是包长度部分,若下一个字节的最高位也为一则下下个字节还是长度……依此类推。其中下个字节所表示的数据是上一个字节的127倍,假设数据包长度为200,200>127,所以第一个字节放不下,但两个字节可以放下,第一个字节的数据则是((200%127)0x80)即0xc9,第二个字节为200/127,即0x01,所以包长度表示为0xc9,0x01;
可变包头由协议名称,协议版本,连接标识,保持连接时间按顺序构成
其中协议名称由Length MSB,Length LSB和utf-8编码的”MQTT”字符串组成,这样协议名称部分就表示为0x00,0x04,0x4d,0x51,0x54,0x54!
版本占一个字节,MQTT3.1.1为4,即0x04
连接标识
最低位保留 Clean Session:服务器和客户端断开后是否清除数据,为1时自动删除数据 Will Flag:如果Will Flag被设置为1,这意味着,如果连接请求被接受,服务端必须存储一个Will Message,并和网络连接关联起来。之后在网络连接断开的时候必须发布Will Message,除非服务端收到DISCONNECT包删掉了Will Message Will QoS:消息质量等级,0:只发一次;1:至少发一次;2:发且仅发一次。阿里云暂时只支持0和1 Will Retain:表示Will Message在发布之后是否需要保留。如果Will Flag设置为0,那么Will Retain必须是0。 Password Flag:负载中是否包括密码,置一。 User Name Flag:负载里是否包括用户名,直接置一。 这里连接标识我们设置为0xc2。 保持连接时间
表示客户端从发送完成一个控制包到开始发送下一个的最大时间间隔,单位为秒,两个字节长度。例如设置100秒即0x00,0x64。 这样可变包头部分配置完成。 最后负载部分 即数据包传输的数据部分,以连接阿里云connect为例,首先是客户端标识(ClientId)长度和客户端标识,注意长度占两个字节。上一步的连接标识里我们使能了User Name Flag和Password Flag两个标识,所以剩下的内容便是用户名长度(2B)+用户名+密码长度(2B)+密码。 关于客户端标识、用户名、密码等的介绍参考:使用MQTT.fx接入物联网平台 建议先使用MQTT.fx软件先将这些参数确定,防止直接在单片机上跑找不到错误原因。 MQTT协议参考:MQTT Version 3.1.1
stm32连接到阿里云——阿里云设备创建
首先登陆(没有?注册一个,反正不要钱)阿里云物联网控制台,然后创建产品(产品->创建产品)

名称任意,品类建议选择自定义,节点类型选直连,网络选择蜂窝,数据格式一定要选择JSON其它默认即可

接着添加设备,名称任意,完成后进入设备查看,可以看到我们建立的demo产品下的demo设备(产品是指某一类的设备的类型,如果需要增删改功能需要修改产品而不是设备),这样我们测试的设备就创建好了。
阿里云物联网平台收费