完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
stm32移植mqtt
//接收数据,recv函数仅仅是copy数据,真正的接收数据是协议来完成的), recv函数返回其实际copy的字节数。 int transport_getdata(unsigned char* buf, int count) { int rc = 0; u16 len = 0; u8 *data = 0; while(1) { if(UART7_RX_STA&0X8000) //接收到一次数据了 { memcpy(buf, (void*)&UART7_RX_BUF[read_buf_len], count); read_buf_len += count; break; } delay_ms(10); } return count; } 在需要调用的地方实现订阅发布和读取订阅。 //打开网络连接 mysock = transport_open(host, port); if(mysock < 0) return mysock; printf("Sending to hostname %s port %dn", host, port); //现在将连接字符串格式化一下,现在还没有发送 len = MQTTSerialize_connect(buf, buflen, &data); printf("%s",buf); //现在是数据的发送 rc = transport_sendPacketBuffer(mysock, buf, len); /* 等待connack *///发送后接收服务器返回的数据,这里使用了一个函数的指针,要定义这个指针 if (MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK)//CONNACK – 确认连接请求 { unsigned char sessionPresent, connack_rc if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0) { printf("Unable to connect, return code %dn", connack_rc); goto exit; } } else goto exit; /* 订阅 */ topicString.cstring = "substopic"; len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos); rc = transport_sendPacketBuffer(mysock, buf, len); //等待服务器答复 //SUBACK 订阅确认 报文包含一个返回码清单, 它们指定了 SUBSCRIBE 请求的每个订阅被授予的最大 QoS 等级。 if (MQTTPacket_read(buf, buflen, transport_getdata) == SUBACK) /* 等待 suback */ { unsigned short submsgid; int subcount; int granted_qos; rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen); if (granted_qos != 0) { printf("granted qos != 0, %dn", granted_qos); goto exit; } } else goto exit; /* 循环获取消息 on subscribed topic */ // topicString.cstring = "pubtopic"; // while (1) { /* transport_getdata() has a built-in 1 second timeout, your mileage will vary */ if (MQTTPacket_read(buf, buflen, transport_getdata) == PUBLISH)//qos 响应报文,当qos>0时才有响应 { unsigned char dup; int qos; unsigned char retained; unsigned short msgid; int payloadlen_in; unsigned char* payload_in; int rc; MQTTString receivedTopic; rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic, &payload_in, &payloadlen_in, buf, buflen); printf("message arrived %.*sn", payloadlen_in, payload_in); //消息到达 } printf("publishing readingn");//读取发布 //下面两行是用来发布消息。这里发布,上面订阅,就形成了一个循环。 len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char*)payload, payloadlen); rc = transport_sendPacketBuffer(mysock, buf, len); delay_ms(1000); } while(1) { len = MQTTSerialize_pingreq(buf, buflen);//发送心跳 rc = transport_sendPacketBuffer(mysock, buf, len);//发送 delay_s(55); printf("心跳"); } exit: transport_close(mysock); MQTT实质上只是一个协议,搞清楚什么是订阅什么是发布,如何保持连接。 鉴于网友要求现在提供工程文件: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:24 , Processed in 0.832521 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号