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

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

[复制链接]
STMCU小助手 发布时间:2022-5-10 22:00
1.概述# G$ X# R" H6 S, L; _! s8 Z
实现通过stm32f103c8t6+操作系统(freertos)读取dht12温湿度传感器的数据,采用ESP8266连接网络,经过MQTT协议连接阿里云IOT,进行数据的传输,以及服务器发送数据控制LED的亮灭,包括消息的发布和订阅等操作,完成云端和设备端的通讯。8 r" X/ n$ M9 _9 i
. Q; e" V) @3 s! u4 b3 T1 v
2.实现步骤5 T6 |, B+ j% u. a5 V: Z" g2 o( ^% R, p
2.1.MQTT.fx模拟器与阿里云通信
$ u6 [( q  e8 t& @! [. x! {
首先,我们使用MQTT.fx模拟器,通过模拟的方式去和阿里云平台进行通讯,此步骤是为了验证我们是否完成了阿里云平台的 搭建。其次是为了获取一些相关的日志信息。/ X$ E! I3 H1 T
7 N: K1 _! t% R* L7 }' }9 r
2.2.STM32与阿里云通信5 f8 `6 H! y! S5 F
其次,我们使用STM32F103C8T6,通过ESP8266连接网络,进行阿里云平台的通讯,实现本次设计的最终方案。本设计使用了dht12温湿度传感器进行读取温度,并通过阿里云平台进行发布,控制我们的LED灯的亮灭。! A5 h& w. X( h0 `, b. m; {3 l
) v$ L9 [/ H2 S7 [: q4 G
3. 搭建云平台
- V/ Z, H9 N$ F/ B/ h) E5 g3.1.登陆阿里云平台
& p( P! w+ H% I  Q; k0 W
1.登陆网址0 F/ D! k- ?+ U! T
2.找到物联网平台
( T' x* g; v+ E4 f/ ?2 [8 y3.根据阿里云的文档创建一个产品,创建一个这个产品的设备,并添加一个自定义功能7 K% K8 ]3 N8 {+ `; o$ z
B{[)DL1L4EI8%HK]8%@B}YX.png
, N( o! ?9 C/ O* U% ^
" k& f/ R& e# M, g  d4.我们先创建一个产品,创建流程如下:
" Y% Z$ n% M3 x2 _( Z2 A! U7 E) }% j
{ALE1A[$M2Q]R)U57BKJ`[J.png 2 [  t2 q' p) k5 y( [
$ r" M( e0 {+ T) k
然后点击确认即可。
3 [2 T4 j" V) m" z; H+ B+ s1 i9 W
5.产品弄好了,就要在产品下面挂上设备
" I( t) P+ k( p, x6 M2 b6 @
# d# l  ^  o5 v+ K$ T $M}8]A~NN}~3T%}I8Z68][9.png 0 x4 `2 F& }0 U$ r. y* t

& s# X$ Y' c# `1 z/ }% j% w  \6.设置下添加的设备的名字
; [6 }5 F8 E! N. U( a  w! ~( p5 J6 v
[LWL0P[~M${2{HX_AC~LVNI.png
' [' L0 V1 b8 S6 f1 p
& c) c5 w6 Q8 s  l7.查看添加的设备信息
, [3 t9 ]; M$ Z' ?3 |1 n  A6 [7 k6 z  F4 k; [  W/ E
82~M}P{9TM04CXICLJ8Z8(W.png
- l5 ]0 J7 A# \0 x+ x! \" T) @; t4 h( D& B0 X2 P
ZZ`I0GVDMU13UM]`}H1G]8R.png
/ W# Z, d8 P4 V* C5 u/ r
$ \# _  J8 f' S. u' m& N$ y注意,以下信息是连接阿里云平台的时候需要用到的。
9 _: F  A8 [( B8 {' y" ]
# a: H' M& b: U2 I1 V5 `' z `~V6){NRO(`I6ODID8AFKSO.png
0 O2 x, u% A/ X" N# \' y& s4 i$ k$ l6 G/ e6 c8 e1 ?' x* p
提示:后面咱就会使用下面三个参数(三元组)组合MQTT参数" ?3 Y2 E3 r. s# x
“ProductKey”: “a1Q",. R( D2 c" V! F1 ?  D9 F
“DeviceName”: “dht12”,1 Y$ D+ @- j; o: V; L+ K/ ~
“DeviceSecret”: "7G****************VsU”
' y6 d6 }* U$ ?! `, q5 K4 {2 R3 u7 }2 n% i. ~$ \0 D
4.连接阿里云平台(MQTT.fx)
* ]% B1 c1 |  f" g1.这里需要用到两个软件( h- [' V0 v6 K! N
1.1.阿里云物联平台配置_32
* g! L( i2 u0 s* Q( `" k0 e- I1.2.MQTT.fx
0 I2 ^* a1 \0 {8 j
9 v9 u0 j2 P: d0 u2.打开MQTT.fx软件- e% A' H8 d9 g# ]' h7 D
2.1.打开软件
- U; \6 x% w- T$ @$ R2 M' |! V; }6 U
1QLW4{_LN$GPR3)WV`XYHHX.png
5 D; _' l: _1 B, c
( U  O/ I$ m( d9 S8 H: n2.2.配置相关信息+ z( R# c6 X7 s, N! }# N0 m
/ H/ e/ y+ u# P$ E$ D0 q1 B
~%KOY}HUAA)EAQFLCEZH@9D.png
1 w5 x1 ]! {( w
" v$ B8 W3 B& H9 T, e/ Z; V, v8 h F[S[8RU`3PJEPX~6T0`@165.png
0 W. C4 z& ~  w* [+ Q& Q0 ~0 L; M; c$ z: P
5N(BY$XW[%_)1NZIHUT)IMP.png % d% @8 ~8 ?* S& F' ]5 o. I+ F
/ ~% M1 r0 N* L1 x  T
OM)}0}7)RZYK}$WCV6WT{%A.png
: Q; E# R; L+ y% S# z* B. V
! r5 e- v8 ]" Q  H( C( e0 F8 D# ^/ @* T" t
3.连接调试
( R9 l1 k) j5 a2 n) f1 l3.1.查看Topic列表,一会需要用到: m, E1 K2 D& g, X
/ Q+ A4 W5 @- P0 ?
QU$$UQHVS47~@(DSZHJ[9KX.png
  \3 _( t9 g( t: W" a  J( A2 l
. N5 R! k) I% \3.2.发布LED开关和温湿度功能。) D$ B" P0 r4 m2 X

; l  ~& t1 x$ h- T0 Z* ]2 T8 { J}}7A1I`_{N5DRJAX8R)U63.png
( Y8 U, I) t- Z' v
% e7 G! g1 y4 N. ]4 [3.3.添加自定义功能,7 @9 r. X. x3 \7 p* [

& m% w1 f; n1 e9 D1 g/ Y HY6%IU}DR$FEKNWBLHIW.png
: O8 c0 O7 A0 Q' s: s# g5 N7 A* s4 T* d. h! g6 H: v# h) V. I
ZOX}RO14Q7NO{K}_ESEFJ.png # Q' [  E( ?+ {0 p- K- j

) p  W  w' c- k2 i3 N- x 63N}B608FE(7K)J{SLXE.png / t; a9 D3 A; h; n. |/ p  q4 r

. j  \: q/ ?7 c* y9 I* {% G  |# H K`NUN4(5Z(`SO5ZXX9B.png
  [' r7 Y/ J9 e- }% \- {; @: W
0 n# f# I' }+ u; |; V& \! t' S, @3 ]) _# d% g. ?
3.4.最后一定要记得发布。
4 L0 v8 l# |0 O% N  z: \! z+ L* ~. v2 P8 e8 G) P7 a
CWDG2NK[VUS[K(]TEN0F03K.png
# S# N4 H0 Z# z0 q0 D* V! H  v* K- \
$ M+ X: }8 A3 m) n  |+ ~3.5.连接服务器
# R2 c2 [7 |- v4 ?& |3 w" g0 \! {) ?' c
@[1{TOGRXE3TR8ZG64S}EYW.png 7 T& g" B6 c4 m- H7 u  x2 D+ e; @

9 W" b1 n7 y; P/ n3 J3 X5 z2 f3.6.推送的内容需要在阿里云平台点击
2 z& }/ u! C: P- g, L
  B( _& D2 n$ }6 v8 G7 n
) C+ ?7 o. Y; G GHTULX5J{Y73[X8@J6P8{`U.png
3 |8 m6 M! K$ D8 |
8 I- p# y  i$ @5 v- L7 ~4 K3.7.推送温湿度数据到阿里云平台服务器上
# P6 @: q  r* `6 m: i% V' W7 W! H( ]8 k
H}J}B_GAC%ZW@(KV_RV[_5R.png
6 a. P& Y2 |: Q8 Y  ]6 n+ ~* D' u- g! G- j
K`F4M[85J6KBLQJF{33W1[J.png ' u* z! t" d5 e$ i! U; i! M/ `0 A

3 v. C: R9 t5 D4 \3 c; g3 r3.8.到此,MQTT.fx模拟器调试就结束了。8 f# ]9 \# W# B& s) ~1 }

/ Y6 M5 W1 d' L( L5.连接阿里云平台(STM32)9 T" T: q6 D2 B/ u! Q4 U3 m
5.1.调试信息
- O8 J5 u* o' P# Q( ]" N( R# }9 i# W* }/ j- L5 n
OP7[)VI5_T683477}XVHQK7.png 3 S# O( q1 L8 n5 D; b
6 E/ A0 d. z$ b  Z: r* G& S* c
5.2.源码分析

/ M9 H7 [4 t8 A. M+ a. H5.2.1. 向服务器发起连接(CONNECT)
4 D, `5 W+ y/ X4 E5 S8 X  g1 v% m" j8 W8 @7 c- ~% A
AE11(JSIH1G6NIRXCPGOZNC.png
8 r/ X$ |, ~6 Z' H4 Q
- G0 h5 w! I4 m8 F3 m7 ]# g5.2.2.服务器回复连接回执(CONNACK)  |! x' Q* p2 t3 \1 W$ w8 c

' }, B1 c% Z& ?% n  O3 G5 H7 j3 R 9fd8bd92019e4f8f943077c753a4ac9c.png   _" r" o2 }; j8 v

# G9 w$ R1 P5 d5 k* e7 K! Y5.2.3.向服务器发起订阅(SUBSCRIBE). y) D: F2 T& }6 z9 B
$ I/ h. B4 a4 f" I- G% v0 ^! M
HSWGJNCU@%3RLH6[9%T%X`P.png 6 A# W- N2 {# q# V; I9 c

( p. A5 P1 l8 ]( C# e7 r5 O, X5.2.4.服务器回复订阅回执(SUBACK)# F7 y6 O4 s7 s2 u% a0 H* V7 |

- [7 D+ u' f0 ~( B WY07_GWEOO)WPN]UCID.png 4 Y0 t# M! A& |& j0 G4 W

  W4 o) t+ @9 s: p3 ^5.2.5.向服务器发起心跳包请求(PINGREQ)
* h/ T& v& x) `% a
. L' W3 i" n7 y1 L5 v- M UJ}BJ4H]~VXKK6GGODJIGDD.png ' u$ [1 H) p4 ^* l2 u8 q
& d; ~  X3 `9 Q
5.2.6.服务器回复心跳回执(PINGRESP)* }* j4 z+ ^$ B, {' ]/ y

$ ^4 k! H$ I+ I* G3 |- J! e 750457b11e2b4f2f9828413b906f952a.png
9 s* Z+ ], s- t' ]# P# Y3 Q$ o% u: \3 ]% y& V! _
5.2.7.服务器发布消息" {: S# K% Y2 A( e6 [5 O2 M0 X/ v

1 k" ~1 v" M% o( J) S 7ebee07dfa714ff19230a9029efb0ac9.png
( K# m% |7 B5 g% e; C
; x0 j# A5 s- U" @1 ?- @当服务器发布消息的时候,会进入此函数,对数据进行解析数据,数据格式为json格式,如代码所示。1 D. s$ M3 H# O( t
4 J% Y0 e3 l. I2 e5 w. U) X
  1. u8 MQTT_Publish(unsigned char* data,int len)
    # |1 a5 ]" Q# W: U" T9 Q( T2 a
  2. {
    " O3 y( H* k3 l5 g- D. D: j2 }
  3.         int buflen = sizeof(buf);; r, w. ^8 z% A+ Y" S1 x! n+ P
  4.         int rc = 0;6 S0 c2 k# A2 M6 N
  5.         unsigned char dup;+ a/ d; g4 F1 l0 J5 H
  6.         int qos;0 u6 ^9 ?: N1 |# F! B8 \* O
  7.         unsigned char retained = 0;# `: t- r, u$ n- z+ m. m6 s; q
  8.         unsigned short msgid = 1;
    : j. g. G* [5 C' F, h" c/ V
  9.         int payloadlen_in;
    # [0 T8 c: Z/ ?9 ?
  10.         unsigned char* payload_in;/ c) u/ ~  m. {9 Z- i
  11.         MQTTString receivedTopic;
    3 r5 u- J: u* e) o9 e% t5 M$ T
  12.                 # `+ E" ?" y3 o+ r& w  {( S* o
  13.         cJSON *json , *json_params, *json_id, *json_led, *json_display;0 U0 X/ h5 I8 Z3 j! f# G9 s) Y. Z
  14.         0 H/ M7 Q  L( h( C2 ?3 n: O
  15.         memcpy(buf,data,len);: C) _. l  s. e- W  V( n
  16.         
    / F0 h, P4 `% W: j: \
  17.         rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,&payload_in, &payloadlen_in, (unsigned char*)buf, buflen);        //服务器有推送信息0 a2 I& J0 h: n/ z' U* U) j2 g
  18.         printf("message arrived : %s\r\n", payload_in);
    2 [* r% \7 L; ]" c% C
  19.         
    ' `2 S+ W, J7 ^4 ?6 z0 \/ b( R/ l: |3 r
  20.         json = cJSON_Parse((char *)payload_in);                        //解析数据包
    3 Q7 E# Y) e$ o* f. j
  21.         if (!json)  
    9 D0 C/ Y; T# [1 Z- \$ `# M
  22.         {  
    7 d. A: e% S0 J( R0 d# {4 t" m; z
  23.                 printf("Error before: [%s]\r\n",cJSON_GetErrorPtr());  
    : M0 i+ y& K9 U" _" Z9 Q
  24.         } + H# b( ~7 Z% q/ s1 a: V. _
  25.         else
    $ U+ O6 U- a0 j: ?2 `: D) p
  26.         {) r7 s! u7 ]1 j+ A. q: b
  27.                 json_id = cJSON_GetObjectItem(json , "id"); , X/ H7 n. f6 X
  28.                 if(json_id->type == cJSON_String)
    4 X4 m6 U% u% _" s0 x, D3 I
  29.                 {9 W& y- L  t- F* t# a
  30.                         printf("id:%s\r\n", json_id->valuestring);  
    : J( t! O: S: h) G  S& X
  31.                 }
    ' l# T8 {* `5 U
  32.                 json_params = cJSON_GetObjectItem(json , "params");  7 `: d" H/ f; E, z8 {
  33.                 if(json_params)  
    " N- j) i" l% i# c$ q* b
  34.                 {  4 L# D5 @4 \( d  j) |/ Q/ z
  35.                         if(cJSON_GetObjectItem(json_params, "LED0"))2 U  f2 D. n' ?: }0 _; e
  36.                         {  T6 }) S" {. m9 U: ~* Z+ z
  37.                                 json_led  = cJSON_GetObjectItem(json_params, "LED0");& U( |2 O; g1 W; G
  38.                                 if(json_led->type == cJSON_Number)
    / c" F* Y- t& n. V( }7 x; {( d' ~
  39.                                 {
    $ ?, F$ \. R" j, p
  40.                                         printf("LED:%d\r\n", json_led->valueint);  
    8 i) K0 A4 H3 P0 u0 F9 Y; `
  41.                                         if(json_led->valueint == 1)
    ' R0 ^/ E8 g+ C4 R
  42.                                         {  I8 ^% k( @% _7 [. P
  43.                                                 LED0 = 0;+ R9 v  j) [3 H( G, j; q5 v
  44.                                         }
    9 A' M1 W; Q  L2 b+ ~3 F; k, X, R
  45.                                         else
    7 k3 Z% f% W$ I' {2 g+ O
  46.                                         {
    / _4 a% a' D: e2 w( P& w) ~8 b( Z
  47.                                                 LED0 = 1;; t" S" W4 T3 b7 E
  48.                                         }                        
    1 D& A6 h) ^' n- i
  49.                                 }( O# t/ s' H& ?( Z1 E, I0 d& ?; u# n
  50.                         }* y6 S! |' H6 J/ ]7 d7 M
  51.                         if(cJSON_GetObjectItem(json_params, "display"))3 y; p$ P6 _2 o" h8 _( e& x
  52.                         {
    . E! U( M6 Q7 L. Z
  53.                                 json_display = cJSON_GetObjectItem(json_params, "display");1 I1 a0 _! g" v" e7 y4 z) L
  54.                                 if (json_display->type == cJSON_String)  3 K: X5 r0 k( y9 h
  55.                                 {  * }$ D# L9 V1 ~
  56.                                         //暂不处理
    - r5 i7 ]0 z1 T& `1 D0 X5 ?
  57.                                 }  ' V; `: D; g3 j5 A6 ]7 y) P
  58.                         }
    ) _5 J0 i' @) r& u: n
  59.                 }
    7 Y) U, g  O! j2 `
  60.         }/ s8 Y& O2 g5 E! n- P7 Y0 u  P
  61.         cJSON_Delete(json);
    ' C8 y2 b5 i7 F2 a$ e* r
  62.         ; \6 |: n: u: u& f6 q" W3 @
  63.         return TRUE;
    0 c! J9 h5 t$ u! g  D% Z
  64. }7 r% X, p0 j: D! n1 N* N  n7 s
复制代码

* L4 M+ T+ `3 ~" }8 _/ o/ T5.2.8.轮询,读MQTT返回数据类型$ Z; D) E" i; E* Y$ \  L

# O7 ]0 P6 ]+ b8 H- s4 X V5R6CT`1QK[2NQ@PNME1.png
% _1 g2 A3 b  q$ [" {2 c' J/ I1 k4 ^: X* I, E; A
5.2.9.向服务器发送dht12温湿度传感器的数据1 o# ~8 N/ k1 H

2 R- p) a. c0 \+ K9 e `3(GFU5$VY3YTN2KSZ%`H5M.png   ?1 m# q3 V" U  m  n

( P* L3 Z  X- G& H5 p5 p7 ?注释:由于本设计使用了ESP8266来联网,ESP8266联网部分代码就不再过多解释,可参考相关的例子进行。
) N$ w8 M/ ~$ v. t; @/ ~0 n- E  W" Z/ C) g  P/ l
6.连接信息) T# }' p+ E/ i5 K

4 H! ?6 O+ h% I" u; f6 n! t NMDK3YVQI(4PMRI9[DRY0U1.png
: C& r$ s- ]9 \9 Y; Y! t( q注释:串口通信这块使用串口DMA的方式,开启串口DMA中断收发的方式,同时使用了freertos操作系统。
. C5 `' i' T2 E% z/ ~" ?4 I. D7 W2 v
7.实物图
: k1 s' U& D* ?% A/ U7 V7 I- J; `. C/ p. ~5 T
YYIVVRJQTWUQ2IB2{J%9@KD.png
  Q$ Q# ]6 M3 {. W  N. D
4 z. F+ I* `8 q# Z2 c' d1 o
. `* r; q9 S( X6 ?) s9 C; E  a& j- G$ P5 U
赞 收藏 评论0 发布时间:2022-5-10 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版