代码拉取完成,页面将自动刷新
同步操作将从 KANG/MQTT_C 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "mqtt.h"
/**
* @function: uint8_t MQTT_Send_Data(uint8_t *Data, uint16_t PacketSize)
* @description: MQTT发送报文数据
* @param {uint8_t} *Data 待发送的数据
* @return {1} 失败
* @return {0} 成功
*/
uint8_t MQTT_Send_Data(uint8_t *Data, uint16_t PacketSize)
{
if (HAL_UART_Transmit(&huartx, Data, PacketSize, 1000) != HAL_OK)
return 1;
else
return 0;
}
/**
* @function: uint8_t MQTT_Connect(void)
* @description: MQTT连接(CONNECT)报文数据包
* @param {*}
* @return {1} 失败
* @return {0} 成功
*/
uint8_t MQTT_Connect(void)
{
uint8_t Connect_Packet[200];
int temp, Remaining_len;
int Fixed_len; //固定报头长度
int Variable_len = 10; //可变报头长度,连接报文中,可变报头长度=10
int Payload_len; //有效负载长度
Fixed_len = 1; //连接报文中,固定报头长度暂时先=1
Payload_len = 2 + CLIENT_ID_LEN + 2 + USERNAME_LEN + 2 + PASSWORD_LEN; //连接报文中,负载长度
Remaining_len = Variable_len + Payload_len; //剩余长度=可变报头长度+负载长度
Connect_Packet[0] = 0x10; //固定报头第1个字节-固定0x10
do //循环处理固定报头中的剩余长度字节,字节量根据剩余字节的真实长度变化
{
temp = Remaining_len % 128; //剩余长度取余128
Remaining_len = Remaining_len / 128; //剩余长度取整128
if (Remaining_len > 0)
temp |= 0x80; //按协议要求位7置位
Connect_Packet[Fixed_len] = temp; //剩余长度字节记录一个数据
Fixed_len++; //固定报头总长度+1
} while (Remaining_len > 0); //如果Remaining_len>0的话,再次进入循环
Connect_Packet[Fixed_len + 0] = 0x00; //可变报头第1个字节-固定0x00
Connect_Packet[Fixed_len + 1] = 0x04; //可变报头第2个字节-固定0x04
Connect_Packet[Fixed_len + 2] = 'M'; //可变报头第3个字节-固定0x4D
Connect_Packet[Fixed_len + 3] = 'Q'; //可变报头第4个字节-固定0x51
Connect_Packet[Fixed_len + 4] = 'T'; //可变报头第5个字节-固定0x54
Connect_Packet[Fixed_len + 5] = 'T'; //可变报头第6个字节-固定0x54
Connect_Packet[Fixed_len + 6] = 0x04; //可变报头第7个字节-固定0x04
Connect_Packet[Fixed_len + 7] = 0xC2; //可变报头第8个字节-使能用户名和密码校验,不使用遗嘱,不保留会话
Connect_Packet[Fixed_len + 8] = KEEP_ALIVE / 256; //可变报头第9个字节-保活时间高字节 0x00
Connect_Packet[Fixed_len + 9] = KEEP_ALIVE % 256; //可变报头第10个字节-保活时间高字节 0x64 100s
/* CLIENT_ID */
Connect_Packet[Fixed_len + 10] = CLIENT_ID_LEN / 256; //客户端ID长度高字节
Connect_Packet[Fixed_len + 11] = CLIENT_ID_LEN % 256; //客户端ID长度低字节
memcpy(&Connect_Packet[Fixed_len + 12], CLIENT_ID, CLIENT_ID_LEN); //复制过来客户端ID字串
/* USERNAME */
Connect_Packet[Fixed_len + 12 + CLIENT_ID_LEN] = USERNAME_LEN / 256; //用户名长度高字节
Connect_Packet[Fixed_len + 13 + CLIENT_ID_LEN] = USERNAME_LEN % 256; //用户名长度低字节
memcpy(&Connect_Packet[Fixed_len + 14 + CLIENT_ID_LEN], USERNAME, USERNAME_LEN); //复制过来用户名字串
/* PASSWORD */
Connect_Packet[Fixed_len + 14 + CLIENT_ID_LEN + USERNAME_LEN] = PASSWORD_LEN / 256; //密码长度高字节
Connect_Packet[Fixed_len + 15 + CLIENT_ID_LEN + USERNAME_LEN] = PASSWORD_LEN % 256; //密码长度低字节
memcpy(&Connect_Packet[Fixed_len + 16 + CLIENT_ID_LEN + USERNAME_LEN], PASSWORD, PASSWORD_LEN); //复制过来密码字串
#if MQTT_DEBUG
Debug_printf("ClientID:%s\r\n", CLIENT_ID);
Debug_printf("UserName:%s\r\n", USERNAME);
Debug_printf("Password:%s\r\n", PASSWORD);
Debug_printf("CONNECT Packet Len:%d\r\n", (Fixed_len + Variable_len + Payload_len));
#endif
//发送MQTT的CONNECT报文
if (MQTT_Send_Data(Connect_Packet, (Fixed_len + Variable_len + Payload_len)))
{
#if MQTT_DEBUG
Debug_printf("Send CONNECT Fail\r\n");
#endif
return 1;
}
#if MQTT_DEBUG
Debug_printf("Send CONNECT Success\r\n");
#endif
return 0;
}
/**
* @function: uint8_t MQTT_Subscribe(char *topic, int QoS)
* @description: MQTT订阅(SUBSCRIBE)报文数据包
* @param {char} *topic 待订阅主题名
* @param {int} QoS 服务质量等级
* @return {1} 失败
* @return {0} 成功
*/
uint8_t MQTT_Subscribe(char *topic, int QoS)
{
uint8_t Subscribe_Packet[128];
int topic_len = strlen(topic);
int temp, Remaining_len;
int Fixed_len; //SUBSCRIBE报文中,固定报头长度
int Variable_len = 2; //SUBSCRIBE报文中,可变报头长度=2
int Payload_len = 2 + topic_len + 1; //计算有效负荷长度 = 2字节(topic_name长度)+ topic_name字符串的长度 + 1字节服务等级
Remaining_len = Variable_len + Payload_len; //剩余长度=可变报头长度+负载长度
Fixed_len = 1;
Subscribe_Packet[0] = 0x82; //第1个字节 :固定0x82
do //循环处理固定报头中的剩余长度字节,字节量根据剩余字节的真实长度变化
{
temp = Remaining_len % 128; //剩余长度取余128
Remaining_len = Remaining_len / 128; //剩余长度取整128
if (Remaining_len > 0)
temp |= 0x80; //按协议要求位7置位
Subscribe_Packet[Fixed_len] = temp; //剩余长度字节记录一个数据
Fixed_len++; //固定报头总长度+1
} while (Remaining_len > 0); //如果Remaining_len>0的话,再次进入循环
Subscribe_Packet[Fixed_len + 0] = 0x00; //第3个字节 :报文标识符高字节,固定使用0x00
Subscribe_Packet[Fixed_len + 1] = 0x0A; //第4个字节 :报文标识符低字节,固定使用0x0A
Subscribe_Packet[Fixed_len + 2] = topic_len / 256; //第5个字节 :topic_name长度高字节
Subscribe_Packet[Fixed_len + 3] = topic_len % 256; //第6个字节 :topic_name长度低字节
memcpy(&Subscribe_Packet[Fixed_len + 4], topic, topic_len); //第7个字节开始 :复制过来topic_name字串
Subscribe_Packet[Fixed_len + 5 + topic_len] = QoS; //最后1个字节:订阅等级
#if MQTT_DEBUG
Debug_printf("SubscribeTopic:%s\r\n", topic);
Debug_printf("SUBSCRIBE Packet Len:%d\r\n", (Fixed_len + Variable_len + Payload_len));
#endif
//发送MQTT的SUBSCRIBE报文
if (MQTT_Send_Data(Subscribe_Packet, (Fixed_len + Variable_len + Payload_len)))
{
#if MQTT_DEBUG
Debug_printf("Send SUBSCRIBE Fail\r\n");
#endif
return 1;
}
#if MQTT_DEBUG
Debug_printf("Send SUBSCRIBE Success\r\n");
#endif
return 0;
}
/**
* @function: uint8_t MQTT_Publish_Qs0(char *topic, char *data, int data_len)
* @description: MQTT发布(PUBILSH)数据(Qs0)
* @param {char} *topic 待发布的主题
* @param {char} *data 待发布的数据
* @param {int} data_len 待发布数据的长度
* @return {1} 失败
* @return {0} 成功
*/
uint8_t MQTT_Publish_Qs0(char *topic, char *data, int data_len)
{
uint8_t Publish_Packet[256];
int temp, Remaining_len;
int topic_len = strlen(topic);
int Fixed_len, Variable_len, Payload_len;
Fixed_len = 1; //固定报头长度暂时先等于:1字节
Variable_len = 2 + topic_len; //可变报头长度:2字节(topic长度)+ topic字符串的长度
Payload_len = data_len; //有效负荷长度:就是data_len
Remaining_len = Variable_len + Payload_len; //剩余长度=可变报头长度+负载长度
Publish_Packet[0] = 0x30; //固定报头第1个字节 :固定0x30
do
{ //循环处理固定报头中的剩余长度字节,字节量根据剩余字节的真实长度变化
temp = Remaining_len % 128; //剩余长度取余128
Remaining_len = Remaining_len / 128; //剩余长度取整128
if (Remaining_len > 0)
temp |= 0x80; //按协议要求位7置位
Publish_Packet[Fixed_len] = temp; //剩余长度字节记录一个数据
Fixed_len++; //固定报头总长度+1
} while (Remaining_len > 0); //如果Remaining_len>0的话,再次进入循环
Publish_Packet[Fixed_len + 0] = topic_len / 256; //可变报头第1个字节-topic长度高字节
Publish_Packet[Fixed_len + 1] = topic_len % 256; //可变报头第2个字节-topic长度低字节
memcpy(&Publish_Packet[Fixed_len + 2], topic, topic_len); //可变报头第3个字节开始-拷贝topic字符串
memcpy(&Publish_Packet[Fixed_len + 2 + topic_len], data, data_len); //有效负荷-拷贝data数据
#if MQTT_DEBUG
Debug_printf("PublishTopic:%s\r\n", topic);
Debug_printf("PUBLISH Packet Len:%d\r\n", (Fixed_len + Variable_len + Payload_len));
#endif
//发送MQTT的PUBILSH报文
if (MQTT_Send_Data(Publish_Packet, (Fixed_len + Variable_len + Payload_len)))
{
#if MQTT_DEBUG
Debug_printf("Send PUBLISH Fail\r\n");
#endif
return 1;
}
#if MQTT_DEBUG
Debug_printf("Send PUBLISH Success\r\n");
#endif
return 0;
}
/**
* @function: uint8_t MQTT_PingREQ(void)
* @description: MQTT发送(PING)报文
* @param {*}
* @return {1} 失败
* @return {0} 成功
*/
uint8_t MQTT_PingREQ(void)
{
uint8_t Ping_Packet[2];
Ping_Packet[0] = 0xC0; //第1个字节 :固定0xC0
Ping_Packet[1] = 0x00; //第2个字节 :固定0x00
if (MQTT_Send_Data(Ping_Packet, 2))
{
#if MQTT_DEBUG
Debug_printf("Send PING Fail\r\n");
#endif
return 1;
}
#if MQTT_DEBUG
Debug_printf("Send PING Success\r\n");
#endif
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。