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

STM32+MQTT

[复制链接]
STMCU小助手 发布时间:2022-11-24 20:59
为什么使用MQTT
! W5 a, _2 g0 p, k( H0 r* @MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。特别是物联网(IoT)和嵌入式。
4 T/ g- H2 ~: E7 IMQTT包容不稳定的网络,MQTT和MQ可以从诸如断开连接之类的故障中恢复,无需进一步的代码要求。但是,HTTP本身无法实现此目标,并且客户端必须重试编码,这会增加身份问题。) [& W# P" a* _
低功耗MQTT专为低功耗目标而设计。 HTTP设计未考虑此因素,这会增加功耗。  n; g- q2 K- _  c; a
MQTT使用的发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的。客户端可以发布消息(发送方)、订阅消息(接收方)或两者兼而有之,从而可以实现多对多通信。
7 s0 V. W, S  ?+ j' ?有三种消息发布服务质量:8 z6 c7 Q7 ^: a0 g# f% ~5 w( Q, R/ E9 b
“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
; v" E( G6 v/ R, }. b8 i“至少一次”,确保消息到达,但消息重复可能会发生。+ P7 P6 x; N  R8 q" F& E& z7 A
“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
2 B# c! k5 ], }项目概述* o9 y1 i( j! C1 U. I; D% s- v- U) p2 M
gitee项目地址
6 X1 F' s( ~5 E; |8 J  ]1 y3 K$ M, a3 F0 p0 p- P
13c2cd43b16b4bc190a5a61e7281f076.png
: s; {  p5 w& i) B7 ~% O, g' d  J/ H* q
移植ONENET开源代码
& W8 {2 u* H4 Q3 m7 I& Y+ X7 j2 V+ o" O将服务质量2修改为服务质量0;5 p1 |% I+ s. s" z7 W

  K* X# y$ u* f; P1 f fe1b0984477b4848858e13e8329bd61b.png " y: S6 a2 k/ }: f, P) W

& h9 ?! {9 a+ i9 A. K' y9 m6 N8 D9 ~修改服务器地址. Z$ q/ ]1 V% a, e

/ u+ r9 `: M3 J: c
  1. #define SERVER_HOST                 "broker.emqx.io"                //  MQTT服务器域名或IP
    ' f* m2 m3 g0 R0 S' E) S9 x2 V( T
  2. #define SERVER_PORT                   "1883"                           // MQTT服务器端口(一般为1883不用改)
复制代码
# m% t7 Y: o, }+ b4 g
修改接收数据解析
$ _! H# g- R4 N
4 I+ T' y; a& B
  1. case MQTT_PKT_PUBLISH:                                                       //接收的Publish消息9 K+ S2 }4 ~# {1 z. Z
  2.                 - j* N2 \% m/ i8 K3 v
  3.                         result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);: l; u9 Y$ d) j- q4 Z* s) Z
  4.                         if(result == 0): l  D8 C2 b$ y9 x9 R7 ^  Y
  5.                         {
      d9 h& M! C$ o* s  `' Z- _
  6.                                 UsartPrintf(USART_DEBUG, "topic: %s, topic_len: %d, payload: %s, payload_len: %d\r\n",! [" \) x! i# a; Q+ [
  7.                                                                                                                                         cmdid_topic, topic_len, req_payload, req_len);
    : R# y+ ?$ q$ ]: _+ @" S
  8.                                 
    ( [: w  A6 D% t
  9.                                 // 对数据包req_payload进行JSON格式解析
    5 |# z+ Q% b. l
  10.                                 json = cJSON_Parse(req_payload);
    6 D# k  R$ j0 {% B
  11.                                 if (!json)UsartPrintf(USART_DEBUG,"Error before: [%s]\n",cJSON_GetErrorPtr());: E3 i' U4 Z1 L+ H: |
  12.                                 else9 w! M" `5 Z2 `0 R
  13.                                 {
    7 j+ ]% s6 U$ ~8 [# P. z
  14.                                         json_value = cJSON_GetObjectItem(json , "LED");, D: e4 `1 {& V( h# Y
  15.                                         7 r$ V5 {* c% c( ^% y! C* K1 p6 @
  16.                                         UsartPrintf(USART_DEBUG,"json_value: [%d]\n",json_value->valueint);
    4 M  h2 x2 `( D7 G0 b. V* a! o
  17.                                         $ }7 p, ~9 L. l0 A# O0 o$ `
  18.                                         if(json_value->valueint)//json_value > 0且为整形
    2 C: t* y3 }* r$ J8 Z6 j  ^5 c9 g1 K
  19.                                         {$ J7 x" c. G+ t$ P% s
  20.                                                 ucLed = 1;//打开LED0 ; x4 H* C' w& B; a
  21.                                         }
    . z0 P/ A% x9 N1 M, \  R
  22.                                         else
    / E+ H# J0 P/ e& @
  23.                                         {
    : R9 q2 v- }* m7 q( r* o
  24.                                                 ucLed = 0;//关闭LED0
    ) C3 I5 Y2 z3 w$ `) l
  25.                                         }
    9 ?/ s; a+ D  |, q) j
  26.                                 }
    ) W  C% B- x# h+ c, t* H8 e0 c6 N
  27.                                 cJSON_Delete(json);
    5 G3 a1 D) R  M4 I  r1 n) z
  28.                                 MQTT_DeleteBuffer(&mqttPacket);                                                                        //删包+ Y, V. j1 h6 k0 A+ [
  29.                         }
    $ Y: P! x$ q" }: D  _; [1 N
  30.                 break;
复制代码
% M0 T: t1 S# ^- S3 \0 l7 C5 k" ^9 {
使用场景" {0 p1 Q8 H/ h6 B8 _
引用2 U" W; x6 C! _8 g! {' r
+ b; [  Q. m3 X1 G- Q0 F
eca3ce3fecc646ee9a3a245c85e41353.png , ~7 x8 x* u1 L7 Y5 `( c8 a

$ a/ B( B& P2 F8 d ee1d48e0b0964835b3e8e0123882c510.png   e) D* ^0 P0 N$ w  v% k  |! R$ Z8 X

# @1 Z1 f8 F( O+ L* T: f( _————————————————
; O5 ~( g( k7 u版权声明:Flynnsin
! v8 F1 X2 ~/ ?) b1 K3 `2 {% s
. U, V) u  p+ T" e
( V' p  l& B  A. {
收藏 评论0 发布时间:2022-11-24 20:59

举报

0个回答

所属标签

相似技术帖

官网相关资源

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