新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2019-4-6
- 在线时间
- 8 小时
|
1金钱
在stm32f103c8+ESP8266平台 实现一个mqtt协议远程控制的实验
1.使用MDK自带的paho MQTTPacket组件构建mqtt链接包后发送可以正常链接并可收到connect ack
2.连接后每1s有心跳发送并可收到response
3.订阅$SYS/broker/time主题(订阅后服务器自动返回时间,QoS为0),无法收到sub ack 与服务器的 publish 消息,同样配置使用MQTTBox可以订阅成功并收到消息
4.使用手动组包后也可以订阅成功并收到消息
相关函数如下:
u16 mqtt_subscribe_message(u8 *mqtt_message,char *topic,u8 qos,u8 whether)
{
u16 topic_len = strlen(topic);
u16 i,index = 0;
static u16 id=0;
id++;
if(whether)
mqtt_message[index++] = 130; //0x82 //消息类型和标志 SUBSCRIBE 订阅
else
mqtt_message[index++] = 162; //0xA2 取消订阅
mqtt_message[index++] = topic_len + 5; //剩余长度(不包括固定头部)
mqtt_message[index++] = (0xff00&id)>>8; //消息标识符
mqtt_message[index++] = 0xff&id; //消息标识符
mqtt_message[index++] = (0xff00&topic_len)>>8; //主题长度(高位在前,低位在后)
mqtt_message[index++] = 0xff&topic_len; //主题长度
for (i = 0;i < topic_len; i++)
{
mqtt_message[index + i] = topic[i];
}
index += topic_len;
if(whether)
{
mqtt_message[index] = qos;//QoS级别
index++;
}
return index;
}
void mqttDebug(void)
{
#if 0
u8 buf[MQTT_CMD_LEN]={0};
u16 pktlen;
int req_qos=0;
MQTTString topicString=MQTTString_initializer;
topicString.cstring="$SYS/broker/time";
pktlen = MQTTSerialize_subscribe(buf, MQTT_CMD_LEN, 0,get_gmid(), 1, &topicString, &req_qos);
ESP_SendString((u8*)buf,pktlen);
delay_ms(100);
printf("\r\nlib subscribe len[%d]====\r\n",pktlen);
for(int i=0;i<pktlen;i++)
{
printf("%02x ",buf[i]);
}
printf("\r\nlib end ===========\r\n");
#else
u8 buf[64]={0};
u16 pktlen=0;
pktlen=mqtt_subscribe_message(buf,"$SYS/broker/time",0,1);
ESP_SendString((u8 *)buf,pktlen);
delay_ms(100);
printf("\r\nmy subscribe len[%d]====\r\n",pktlen);
for(int i=0;i<pktlen;i++)
{
printf("%02x ",buf[i]);
}
printf("\r\nlib end ===========\r\n");
#endif
}
通过宏选择组包方式,打印输出结果长度内容一毛一样,
使用paho库组包就是没有订阅应答,每法成功订阅
有没有大佬知道是什么原因指点一下
|
|