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

STM32+MQTT

[复制链接]
STMCU小助手 发布时间:2022-11-24 20:59
为什么使用MQTT: R) _; g# P6 H
MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。特别是物联网(IoT)和嵌入式。* r5 @! f0 N' I6 ?! y
MQTT包容不稳定的网络,MQTT和MQ可以从诸如断开连接之类的故障中恢复,无需进一步的代码要求。但是,HTTP本身无法实现此目标,并且客户端必须重试编码,这会增加身份问题。/ P# r+ K1 F; {+ z9 v
低功耗MQTT专为低功耗目标而设计。 HTTP设计未考虑此因素,这会增加功耗。, V' ^- {- t+ v* U( `
MQTT使用的发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的。客户端可以发布消息(发送方)、订阅消息(接收方)或两者兼而有之,从而可以实现多对多通信。
+ C% b+ A4 M) h' U7 k有三种消息发布服务质量:
( _/ @# P, n* I8 I“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。$ n3 U+ N8 h9 O5 K4 J( W8 i
“至少一次”,确保消息到达,但消息重复可能会发生。
) g+ D' {7 k  f% S" Q“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
, d* l: x7 L3 d6 l4 r: i项目概述# [5 s- g' l' m* |( R$ O
gitee项目地址
) x3 q6 e: {. O6 X2 ^3 P4 L9 u
* W. ]& k9 I- B, Y* M 13c2cd43b16b4bc190a5a61e7281f076.png . {! |3 a4 R, H& m. B: R* F

& ^* v6 W- K( }' G( t移植ONENET开源代码
0 ]8 o  B4 o5 \4 y  B) x将服务质量2修改为服务质量0;' Y  K" t6 I0 T( g! ]! ~8 P9 O( o; Z

0 a0 @, _1 l" B; @ fe1b0984477b4848858e13e8329bd61b.png " @" P8 {! k2 y& F3 v
# ~; I! Q. _" W
修改服务器地址
0 `  y; U. Q9 ^' s9 ], U1 S
* Q: Z5 X8 w* ~7 \  Q# f( ]8 b; E' u
  1. #define SERVER_HOST                 "broker.emqx.io"                //  MQTT服务器域名或IP
    " s7 z5 G* V# q4 r. `. _! H+ }4 w
  2. #define SERVER_PORT                   "1883"                           // MQTT服务器端口(一般为1883不用改)
复制代码
7 u% H  @1 A# H* L$ }5 c1 |3 n
修改接收数据解析
) t4 w  {! f4 b$ A0 A: G3 i) X4 h1 M$ `( \" q5 Z
  1. case MQTT_PKT_PUBLISH:                                                       //接收的Publish消息
    7 j* p" Y& C" e  |9 ~, R
  2.                
      e* a+ x9 i5 }9 _. _( Q
  3.                         result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);6 C( H0 s5 Q2 o) F0 n
  4.                         if(result == 0)
    6 w. Q! W* X& }* Y6 V
  5.                         {2 T! f5 J, F* y/ c( Y8 H  o/ S
  6.                                 UsartPrintf(USART_DEBUG, "topic: %s, topic_len: %d, payload: %s, payload_len: %d\r\n",
    7 E! D2 z2 O7 \0 z
  7.                                                                                                                                         cmdid_topic, topic_len, req_payload, req_len);
    6 s+ ?- O& H/ v) D/ u8 R$ n
  8.                                 
    ( @9 G9 y% A7 e* C) r) S5 v
  9.                                 // 对数据包req_payload进行JSON格式解析* N5 a( G7 H/ s; ?1 C& t! c
  10.                                 json = cJSON_Parse(req_payload);3 |1 K( l3 |. E" `% ]7 p$ F/ \% Y
  11.                                 if (!json)UsartPrintf(USART_DEBUG,"Error before: [%s]\n",cJSON_GetErrorPtr());
    5 c9 ]5 }2 c3 T8 m
  12.                                 else2 v* F# U4 p. P" G  q; d
  13.                                 {
    * u' U& W: e  h! R. s
  14.                                         json_value = cJSON_GetObjectItem(json , "LED");
    + R. R% G) i9 _, u6 Z. Z! C4 k) q
  15.                                        
    - g. G  Z$ n+ j5 n4 }& P, X* S! Q
  16.                                         UsartPrintf(USART_DEBUG,"json_value: [%d]\n",json_value->valueint);# B! X! i+ v/ r
  17.                                         1 T+ C  v" M/ O- E' {+ l
  18.                                         if(json_value->valueint)//json_value > 0且为整形  |8 @; ?' Q" O. V2 [# W% C
  19.                                         {
    6 y. M! C3 t  |4 U6 T0 t& ~
  20.                                                 ucLed = 1;//打开LED0 9 J( J. k7 G' T' c2 ?
  21.                                         }3 F+ V2 Y' I3 i2 @1 S4 r
  22.                                         else" p) l/ C0 O& y2 c
  23.                                         {
    & c4 S9 i3 i' ^& ]9 K
  24.                                                 ucLed = 0;//关闭LED0
    7 c! ^+ ^# K9 r% {
  25.                                         }4 ~1 I# v3 E- L+ `3 t2 v
  26.                                 }, @7 B7 F5 L: k) O& P% f- J
  27.                                 cJSON_Delete(json);
    8 K1 r- W; W& q) m+ z
  28.                                 MQTT_DeleteBuffer(&mqttPacket);                                                                        //删包
    8 o  l- y3 H8 @6 r
  29.                         }
    $ V8 S0 m9 ]( H$ L
  30.                 break;
复制代码
/ {6 T2 I2 B( F* N' I
使用场景9 W# {7 V5 e& ~/ A3 S6 H6 F
引用2 d/ f0 c0 o) F8 p
5 Z/ z6 `# ?' |; Q, ]
eca3ce3fecc646ee9a3a245c85e41353.png
/ i/ a. E* O, ~, @7 D1 ~  [6 e: N5 d0 Z& `1 |( r% R
ee1d48e0b0964835b3e8e0123882c510.png
* z) ]% v! F) y# O4 v* n, Z
, x, f, ]5 g: ?; f————————————————
' R$ z- Z/ T3 G2 S6 o4 c) g版权声明:Flynnsin' P' v& g3 l" J0 d, O4 m/ `! Y; W/ c6 R3 K- R
9 U; k$ L& l8 D6 G5 \3 T
, d$ t( X& S' c
赞 收藏 评论0 发布时间:2022-11-24 20:59

举报

0个回答

所属标签

相似技术帖

官网相关资源

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