STM32+MQTT

目录

  • 为什么使用MQTT
  • 项目概述
  • 移植ONENET开源代码
  • 使用场景

为什么使用MQTT

  • MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。特别是物联网(IoT)和嵌入式。
  • MQTT包容不稳定的网络,MQTT和MQ可以从诸如断开连接之类的故障中恢复,无需进一步的代码要求。但是,HTTP本身无法实现此目标,并且客户端必须重试编码,这会增加身份问题。
  • 低功耗MQTT专为低功耗目标而设计。 HTTP设计未考虑此因素,这会增加功耗。
  • MQTT使用的发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的。客户端可以发布消息(发送方)、订阅消息(接收方)或两者兼而有之,从而可以实现多对多通信。
  • 有三种消息发布服务质量:
    “至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
    “至少一次”,确保消息到达,但消息重复可能会发生。
    “只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

项目概述

gitee项目地址
STM32+MQTT_第1张图片

移植ONENET开源代码

将服务质量2修改为服务质量0;
在这里插入图片描述

修改服务器地址

#define SERVER_HOST						"broker.emqx.io"			//	MQTT服务器域名或IP
#define SERVER_PORT						"1883"								//	MQTT服务器端口(一般为1883不用改)

修改接收数据解析

case MQTT_PKT_PUBLISH:														//接收的Publish消息
		
			result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);
			if(result == 0)
			{
				UsartPrintf(USART_DEBUG, "topic: %s, topic_len: %d, payload: %s, payload_len: %d\r\n",
																	cmdid_topic, topic_len, req_payload, req_len);
				
				// 对数据包req_payload进行JSON格式解析
				json = cJSON_Parse(req_payload);
				if (!json)UsartPrintf(USART_DEBUG,"Error before: [%s]\n",cJSON_GetErrorPtr());
				else
				{
					json_value = cJSON_GetObjectItem(json , "LED");
					
					UsartPrintf(USART_DEBUG,"json_value: [%d]\n",json_value->valueint);
					
					if(json_value->valueint)//json_value > 0且为整形
					{
						ucLed = 1;//打开LED0 
					}
					else
					{
						ucLed = 0;//关闭LED0 
					}
				}
				cJSON_Delete(json);
				MQTT_DeleteBuffer(&mqttPacket);									//删包
			}
		break;

使用场景

引用
STM32+MQTT_第2张图片
STM32+MQTT_第3张图片

你可能感兴趣的:(STM32,linux,bash,stm32,物联网)