OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6051|回复: 5

【求助】使用STM32F103移植MQTT无法读取到订阅话题的数据

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2020-6-2
在线时间
5 小时
发表于 2020-6-2 16:10:09 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 一只韬韬 于 2020-6-2 21:51 编辑

最近在搞项目的时候,要用STM32F103连接阿里云物联网平台,由于阿里云主要是使用MQTT进行通信的,所以将MQTT客户端移植到了STM32上面。硬件采用的是STM32F103C8T6 + ESP8266。
MQTT客户端使用的是paho.mqtt.embedded-c里面的MQTTPacket分支。
主要原理就是使用USART3向ESP8266发送串口指令,控制连接WIFI、服务器以及开启透传模式,然后MQTT客户端通过transport.c文件实现底层的对接。USART1是向笔记本发送消息来DEBUG的。目前已经实现了向阿里云物联网平台发布(PUBLISH)消息,而且也能成功订阅(SUBCRIBE)服务器的话题,但是服务器向订阅的话题发布消息时,客户端无法有效地读取到消息的内容。工程文件已经上传到附件了,希望大佬帮忙看看。下面第一个图片就是云端下发数据的调试,第二图片是串口助手收到的USART1的调试信息,可以看见连接MQTT服务器和订阅消息都成功,但是下发数据没有反应。

云端下发数据

云端下发数据
微信截图_20200602214445.png 主循环的代码如下:
  1.   if (MQTTPacket_read(buf, buflen, transport_getdata) == PUBLISH)
  2.                 {
  3.                         unsigned char dup;
  4.                         int qos;
  5.                         unsigned char retained;
  6.                         unsigned short msgid;
  7.                         int payloadlen_in;
  8.                         unsigned char* payload_in;
  9.                         int rc;
  10.                         MQTTString receivedTopic;

  11.                         rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic, &payload_in, &payloadlen_in, buf, buflen);
  12.                         u1_printf("message arrived qos:%d, len:%d", qos, payloadlen_in);
  13.                 }
复制代码


transport.c中的两个函数代码如下:(剩下三个函数都是空的)
  1. int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen)
  2. {
  3.   HAL_UART_Transmit_IT(&huart3, buf, buflen);
  4.   return buflen;
  5. }


  6. int transport_getdata(unsigned char* buf, int count)
  7. {
  8.         
  9.   HAL_Delay(100);
  10.   memcpy(buf, (const char*)USART3_RX_BUF, count);
  11.         
  12.   USART3_RX_STA = 0;
  13.   memset(USART3_RX_BUF,0,USART3_MAX_RECV_LEN);
  14.   return count;
  15.         
  16. }
复制代码









fishTank.zip

1.26 MB, 下载次数: 39

MDK工程文件

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-6-5 01:39:07 | 显示全部楼层
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1429
金钱
1429
注册时间
2020-5-12
在线时间
393 小时
发表于 2020-6-5 12:35:45 | 显示全部楼层
本帖最后由 叶子君 于 2020-6-5 12:37 编辑

不知道你会不会开发esp8266。我之前的做法是mqtt的所有操作都放在esp8266里面,包括连云,订阅主题等等,然后通过串口指令暴露给stm32。一开始可以通过查询的方式,可以查询到esp8266是否连云。连上之后。stm32就可以使用这些mqtt的串口指令。我个人是用c8t6+esp8266来实现的了。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2020-6-2
在线时间
5 小时
 楼主| 发表于 2020-6-6 18:03:27 | 显示全部楼层
叶子君 发表于 2020-6-5 12:35
不知道你会不会开发esp8266。我之前的做法是mqtt的所有操作都放在esp8266里面,包括连云,订阅主题等等,然 ...

之前有了解过开发ESP8266的sdk,是不是可以形成一套AT指令来实现mqtt连云。不过好像8266的开发基本都是要linux环境的,我对于这个还是不太熟悉,之前觉得相比在STM32实现MQTT,在ESP8266实现似乎难度更大一点。
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2020-5-19
在线时间
13 小时
发表于 2021-6-19 15:41:43 | 显示全部楼层
window + eclipse   下载SDK包即可二次开发ESP8266,环境戴建中需要采坑
回复

使用道具 举报

4

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2019-11-12
在线时间
77 小时
发表于 2021-6-21 08:54:30 | 显示全部楼层
一只韬韬 发表于 2020-6-6 18:03
之前有了解过开发ESP8266的sdk,是不是可以形成一套AT指令来实现mqtt连云。不过好像8266的开发基本都是要 ...

esp8266支持mqtt的,应该只要用AT就可以,我大概看了下手册,没有实战过。如果用单片机实现,需要自己写协议栈吧。如果楼主实现了 求分享一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 00:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表