你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于STM32+FreeRtos+ESP8266+MQTT连接阿里云

[复制链接]
STMCU小助手 发布时间:2022-5-10 22:00
1.概述
实现通过stm32f103c8t6+操作系统(freertos)读取dht12温湿度传感器的数据,采用ESP8266连接网络,经过MQTT协议连接阿里云IOT,进行数据的传输,以及服务器发送数据控制LED的亮灭,包括消息的发布和订阅等操作,完成云端和设备端的通讯。

2.实现步骤
2.1.MQTT.fx模拟器与阿里云通信

首先,我们使用MQTT.fx模拟器,通过模拟的方式去和阿里云平台进行通讯,此步骤是为了验证我们是否完成了阿里云平台的 搭建。其次是为了获取一些相关的日志信息。

2.2.STM32与阿里云通信
其次,我们使用STM32F103C8T6,通过ESP8266连接网络,进行阿里云平台的通讯,实现本次设计的最终方案。本设计使用了dht12温湿度传感器进行读取温度,并通过阿里云平台进行发布,控制我们的LED灯的亮灭。

3. 搭建云平台
3.1.登陆阿里云平台

1.登陆网址
2.找到物联网平台
3.根据阿里云的文档创建一个产品,创建一个这个产品的设备,并添加一个自定义功能
B{[)DL1L4EI8%HK]8%@B}YX.png

4.我们先创建一个产品,创建流程如下:

{ALE1A[$M2Q]R)U57BKJ`[J.png

然后点击确认即可。

5.产品弄好了,就要在产品下面挂上设备

$M}8]A~NN}~3T%}I8Z68][9.png

6.设置下添加的设备的名字

[LWL0P[~M${2{HX_AC~LVNI.png

7.查看添加的设备信息

82~M}P{9TM04CXICLJ8Z8(W.png

ZZ`I0GVDMU13UM]`}H1G]8R.png

注意,以下信息是连接阿里云平台的时候需要用到的。

`~V6){NRO(`I6ODID8AFKSO.png

提示:后面咱就会使用下面三个参数(三元组)组合MQTT参数
“ProductKey”: “a1Q",
“DeviceName”: “dht12”,
“DeviceSecret”: "7G****************VsU”

4.连接阿里云平台(MQTT.fx)
1.这里需要用到两个软件
1.1.阿里云物联平台配置_32
1.2.MQTT.fx

2.打开MQTT.fx软件
2.1.打开软件

1QLW4{_LN$GPR3)WV`XYHHX.png

2.2.配置相关信息

~%KOY}HUAA)EAQFLCEZH@9D.png

F[S[8RU`3PJEPX~6T0`@165.png

5N(BY$XW[%_)1NZIHUT)IMP.png

OM)}0}7)RZYK}$WCV6WT{%A.png


3.连接调试
3.1.查看Topic列表,一会需要用到

QU$$UQHVS47~@(DSZHJ[9KX.png

3.2.发布LED开关和温湿度功能。

J}}7A1I`_{N5DRJAX8R)U63.png

3.3.添加自定义功能,

HY6%IU}DR$FEKNWBLHIW.png

ZOX}RO14Q7NO{K}_ESEFJ.png

63N}B608FE(7K)J{SLXE.png

K`NUN4(5Z(`SO5ZXX9B.png


3.4.最后一定要记得发布。

CWDG2NK[VUS[K(]TEN0F03K.png

3.5.连接服务器

@[1{TOGRXE3TR8ZG64S}EYW.png

3.6.推送的内容需要在阿里云平台点击


GHTULX5J{Y73[X8@J6P8{`U.png

3.7.推送温湿度数据到阿里云平台服务器上

H}J}B_GAC%ZW@(KV_RV[_5R.png

K`F4M[85J6KBLQJF{33W1[J.png

3.8.到此,MQTT.fx模拟器调试就结束了。

5.连接阿里云平台(STM32)
5.1.调试信息

OP7[)VI5_T683477}XVHQK7.png

5.2.源码分析

5.2.1. 向服务器发起连接(CONNECT)

AE11(JSIH1G6NIRXCPGOZNC.png

5.2.2.服务器回复连接回执(CONNACK)

9fd8bd92019e4f8f943077c753a4ac9c.png

5.2.3.向服务器发起订阅(SUBSCRIBE)

HSWGJNCU@%3RLH6[9%T%X`P.png

5.2.4.服务器回复订阅回执(SUBACK)

WY07_GWEOO)WPN]UCID.png

5.2.5.向服务器发起心跳包请求(PINGREQ)

UJ}BJ4H]~VXKK6GGODJIGDD.png

5.2.6.服务器回复心跳回执(PINGRESP)

750457b11e2b4f2f9828413b906f952a.png

5.2.7.服务器发布消息

7ebee07dfa714ff19230a9029efb0ac9.png

当服务器发布消息的时候,会进入此函数,对数据进行解析数据,数据格式为json格式,如代码所示。

  1. u8 MQTT_Publish(unsigned char* data,int len)
  2. {
  3.         int buflen = sizeof(buf);
  4.         int rc = 0;
  5.         unsigned char dup;
  6.         int qos;
  7.         unsigned char retained = 0;
  8.         unsigned short msgid = 1;
  9.         int payloadlen_in;
  10.         unsigned char* payload_in;
  11.         MQTTString receivedTopic;
  12.                
  13.         cJSON *json , *json_params, *json_id, *json_led, *json_display;
  14.         
  15.         memcpy(buf,data,len);
  16.         
  17.         rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,&payload_in, &payloadlen_in, (unsigned char*)buf, buflen);        //服务器有推送信息
  18.         printf("message arrived : %s\r\n", payload_in);
  19.         
  20.         json = cJSON_Parse((char *)payload_in);                        //解析数据包
  21.         if (!json)  
  22.         {  
  23.                 printf("Error before: [%s]\r\n",cJSON_GetErrorPtr());  
  24.         }
  25.         else
  26.         {
  27.                 json_id = cJSON_GetObjectItem(json , "id");
  28.                 if(json_id->type == cJSON_String)
  29.                 {
  30.                         printf("id:%s\r\n", json_id->valuestring);  
  31.                 }
  32.                 json_params = cJSON_GetObjectItem(json , "params");  
  33.                 if(json_params)  
  34.                 {  
  35.                         if(cJSON_GetObjectItem(json_params, "LED0"))
  36.                         {
  37.                                 json_led  = cJSON_GetObjectItem(json_params, "LED0");
  38.                                 if(json_led->type == cJSON_Number)
  39.                                 {
  40.                                         printf("LED:%d\r\n", json_led->valueint);  
  41.                                         if(json_led->valueint == 1)
  42.                                         {
  43.                                                 LED0 = 0;
  44.                                         }
  45.                                         else
  46.                                         {
  47.                                                 LED0 = 1;
  48.                                         }                        
  49.                                 }
  50.                         }
  51.                         if(cJSON_GetObjectItem(json_params, "display"))
  52.                         {
  53.                                 json_display = cJSON_GetObjectItem(json_params, "display");
  54.                                 if (json_display->type == cJSON_String)  
  55.                                 {  
  56.                                         //暂不处理
  57.                                 }  
  58.                         }
  59.                 }
  60.         }
  61.         cJSON_Delete(json);
  62.         
  63.         return TRUE;
  64. }
复制代码

5.2.8.轮询,读MQTT返回数据类型

V5R6CT`1QK[2NQ@PNME1.png

5.2.9.向服务器发送dht12温湿度传感器的数据

`3(GFU5$VY3YTN2KSZ%`H5M.png

注释:由于本设计使用了ESP8266来联网,ESP8266联网部分代码就不再过多解释,可参考相关的例子进行。

6.连接信息

NMDK3YVQI(4PMRI9[DRY0U1.png
注释:串口通信这块使用串口DMA的方式,开启串口DMA中断收发的方式,同时使用了freertos操作系统。

7.实物图

YYIVVRJQTWUQ2IB2{J%9@KD.png



收藏 评论0 发布时间:2022-5-10 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版