13号.PINGRESP(心跳响应)

博客提及STM32相关内容,重点介绍了第1 - 2位固定报头。STM32常用于物联网等领域,此报头可能在相关通信或数据传输中有重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第1-2位固定报头

D0 00

void Aliyun(void) { static int retryCount = 0; // 全局或静态变量 static const int MAX_RETRY = 3; // 1、 WIFI模块连接服务器 if (IOT_state == IOT_RESET) { WIFI_Clean(); for (retryCount = 0; retryCount < MAX_RETRY; retryCount++) { if (0 == WIFI_Connect()) { IOT_state = WIFI_OK; printf("第%d次重连成功", retryCount + 1); break; } delay_ms(1000); // 增加重连间隔 } if (retryCount >= MAX_RETRY) { printf("严重错误:无法连接WiFi"); // 进入错误处理流程 } } /******************************************************************************************************/ // 2、发送连接报文 if (WIFI_OK == IOT_state) { MQTT_Connect( "client123", // clientid "user", // username "pass", // password "devices/status", // will_topic "offline", // will_message 1, // will_qos 1, // will_retain 1, // will_flag 1, // clean_session 1, // user_name_flag 1, // pass_word_flag 60 // keep_alive ); WIFI_Clean(); } // 3、发送订阅报文 if (Connect_OK == IOT_state) { MQTT_Subscribe(0x01, SET_TOPIC, 0, 1); // 发送订阅报文 WIFI_Clean(); } /******************************************************************************************************/ // 一直检测服务器下发的其他报文 if (USART3_RxBuff[0] != 0) { unsigned short id = 0; char qos, dup, retain; mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n\r\n* 接收到服务器数据:%x *\r\n"); MQTT_ReceivelPublish(&dup, &qos, &retain, &id, MQTT_RxBUFF); switch (USART3_RxBuff[0] >> 4) { case 2: // 2控制报文:CONNACK – 确认连接请求 if(1 == MQTT_ConnAck()) { mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n* 连接成功 *\r\n"); IOT_state = Connect_OK; } break; case 3: // printf("\r\n* 接收到服务器下发的 QoS1等级 报文 * \r\n"); MQTT_PubAck(MQTT_PUBLISH_ID); // 先回复 break; case 4: // printf("\r\n* 接收到服务器下发的 QoS2等级 报文 * \r\n"); // MQTT_PubRec(MQTT_PUBLISH_ID); // 发布收到(QoS 2,第一步) C <=> S // MQTT_UnPublish(USART3_RxBuff); break; case 5: // 4控制报文:PUBACK – 发布确认(对 QoS1 等级的 PUBLISH 报文的响应) printf("\r\n* PUBACK –发布确认 * \r\n"); // MQTT_PubAck(MQTT_PUBLISH_ID); // MQTT_UnPublish(USART3_RxBuff); break; case 6: // 9SUBACK 订阅确认 S -> C */ if(1 == MQTT_SubAck(0xCCCC)) { mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n* 订阅成功 *\r\n"); IOT_state = Subscribe_OK; // 成功发送订阅报文 } break; case 7: // 13控制报文:PINGRESP心跳响应 printf("\r\n* PINGRESP 心跳响应 S -> C * \r\n"); break; case 8: // 13控制报文:PINGRESP心跳响应 printf("\r\n* PINGRESP 心跳响应 S -> C * \r\n"); break; case 9: // 13控制报文:PINGRESP心跳响应 printf("\r\n* PINGRESP 心跳响应 S -> C * \r\n"); break; case (char) D: // 13控制报文:PINGRESP心跳响应 printf("\r\n* PINGRESP 心跳响应 S -> C * \r\n"); break; default: break; } WIFI_Clean(); } }修正这个代码错误的地方
03-13
void Aliyun(void) { int i; int TimeOut; // 1、 WIFI模块连接服务器 if (0 == IOT_state) { WIFI_Clean(); if (0 == WIFI_Connect()) // WIFI模块连接服务器 { WIFI_Clean(); IOT_state = WIFI_OK; // WIFI已连接服务器 } } /******************************************************************************************************/ // 2、发送连接报文 if (WIFI_OK == IOT_state) { MQTT_Connect(); // 发送连接报文 TimeOut = 1000; while (1 != MQTT_ConnAck()) // 一直等待连接响应 { TimeOut--; delay_ms(10); printf("|"); // 画一个进度条 if (TimeOut == 0) { // 清除屏幕 break; // 超时退出循环 } } WIFI_Clean(); IOT_state = Connect_OK; // 成功发送连接报文 } // 3、发送订阅报文 if (Connect_OK == IOT_state) { MQTT_Subscribe(SET_TOPIC, 1, 1); // 发送订阅报文 TimeOut = 1000; while (1 != MQTT_SubAck()) // 一直等待订阅成功 { delay_ms(10); printf("|"); // 画一个进度条 if (TimeOut == 0) { // 清除屏幕 break; // 超时退出循环 } } WIFI_Clean(); IOT_state = Subscribe_OK; // 成功发送订阅报文 } /******************************************************************************************************/ // 一直检测服务器下发的其他报文 if (IOT_state == Subscribe_OK) { printf("\r\n\r\n* 接收到服务器数据:%x *\r\n", USART3_RxBuff[0]); for (i = 0; i < USART3_RxCounter; i++) { printf("%c", USART3_RxBuff[i]); } printf("\r\n"); #if MQTT_DEBUG for (i = 0; i < USART3_RxCounter; i++) { printf("%02X ", USART3_RxBuff[i]); } printf("\r\n"); #endif switch (USART3_RxBuff[0]) { case 0x30: //3控制报文:PUBLISH – 发布消息 printf("\r\n* 接收到服务器下发的 QoS0等级 报文 * \r\n"); MQTT_Dealsetdata_Qos0(USART3_RxBuff); MQTT_UnPublish(USART3_RxBuff); break; case 0x32: // printf("\r\n* 接收到服务器下发的 QoS1等级 报文 * \r\n"); MQTT_PubAck(MQTT_PUBLISH_ID); MQTT_UnPublish(USART3_RxBuff); break; case 0x34: // printf("\r\n* 接收到服务器下发的 QoS2等级 报文 * \r\n"); MQTT_PubRec(MQTT_PUBLISH_ID); // 发布收到(QoS 2,第一步) C <=> S MQTT_UnPublish(USART3_RxBuff); break; case 0x40: // 4控制报文:PUBACK – 发布确认(对 QoS1 等级的 PUBLISH 报文的响应) printf("\r\n* PUBACK –发布确认 * \r\n"); MQTT_PubAck(MQTT_PUBLISH_ID); MQTT_UnPublish(USART3_RxBuff); break; case (char)0xD0: // 13控制报文:PINGRESP心跳响应 printf("\r\n* PINGRESP 心跳响应 S -> C * \r\n"); break; default: break; } WIFI_Clean(); } }
03-12
void Aliyun(void) { static int retryCount = 0; // 全局或静态变量 static const int MAX_RETRY = 3; // 1、 WIFI模块连接服务器 if (IOT_state == IOT_RESET) { WIFI_Clean(); for (retryCount = 0; retryCount < MAX_RETRY; retryCount++) { if (0 == WIFI_Connect()) { IOT_state = WIFI_OK; printf("第%d次重连成功", retryCount + 1); break; } delay_ms(1000); // 增加重连间隔 } if (retryCount >= MAX_RETRY) { printf("严重错误:无法连接WiFi"); // 进入错误处理流程 } } /******************************************************************************************************/ // 2、发送连接报文 if (WIFI_OK == IOT_state) { MQTT_Connect( "client123", // clientid "user", // username "pass", // password "devices/status", // will_topic "offline", // will_message 1, // will_qos 1, // will_retain 1, // will_flag 1, // clean_session 1, // user_name_flag 1, // pass_word_flag 60 // keep_alive ); WIFI_Clean(); } // 3、发送订阅报文 if (Connect_OK == IOT_state) { MQTT_Subscribe(0x01, SET_TOPIC, 0, 1); // 发送订阅报文 WIFI_Clean(); } /******************************************************************************************************/ // 一直检测服务器下发的其他报文 if (USART3_RxBuff[0] != 0) { unsigned short id = 0; char qos, dup, retain; mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n\r\n* 接收到服务器数据:%x *\r\n"); switch (USART3_RxBuff[0] >> 4) { case 2: // 2控制报文:CONNACK – 确认连接请求 if (1 == MQTT_ConnAck()) { mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n* 连接成功 *\r\n"); IOT_state = Connect_OK; } break; case 3: // 3控制报文:PUBLISH – 发布消息 printf("\r\n* 接收到服务器下发 30 报文 * \r\n"); MQTT_ReceivelPublish(&dup, &qos, &retain, &id, MQTT_RxBUFF); if(qos == 1) { MQTT_PubAck(id); // 回复 PubAck 报文 QoS1 回复 } if(qos == 2) { // MQTT_PubRec(id); // 回复 PubRec 报文 QoS2 第一步 } break; case 4: // 4控制报文:PUBACK – 发布确认 printf("\r\n* QoS1等级 报文发布成功 * \r\n"); break; case 5: // 5控制报文:PUBREC – 发布收到(QoS 2 ,第一步) // printf("\r\n* PUBACK –发布确认 * \r\n"); break; case 6: // 6控制报文:PUBREL – 发布释放(QoS 2 ,第二步) // printf("\r\n* PUBACK –发布确认 * \r\n"); break; case 7: // 7控制报文:PUBCOMP – 发布 完成(QoS 2 ,第三步) // printf("\r\n* PINGRESP 心跳响应 S -> C * \r\n"); break; case 9: // 9控制报文:SUBACK – 订阅确认 if (1 == MQTT_SubAck(0xCCCC)) { mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n* 订阅成功 *\r\n"); IOT_state = Subscribe_OK; // 成功发送订阅报文 } break; case 11: // 11控制报文:UNSUBACK – 取消订阅确认 printf("\r\n* 取消订阅成功 * \r\n"); break; case 13: // 13控制报文:PINGRESP心跳响应 printf("\r\n* 取消订阅成功 * \r\n"); break; default: break; } WIFI_Clean(); } } 完善这段代码
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值