新手上路
- 积分
- 27
- 金钱
- 27
- 注册时间
- 2020-6-2
- 在线时间
- 5 小时
|
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服务器和订阅消息都成功,但是下发数据没有反应。
云端下发数据
主循环的代码如下:
- if (MQTTPacket_read(buf, buflen, transport_getdata) == PUBLISH)
- {
- 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);
- u1_printf("message arrived qos:%d, len:%d", qos, payloadlen_in);
- }
复制代码
transport.c中的两个函数代码如下:(剩下三个函数都是空的)
- int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen)
- {
- HAL_UART_Transmit_IT(&huart3, buf, buflen);
- return buflen;
- }
- int transport_getdata(unsigned char* buf, int count)
- {
-
- HAL_Delay(100);
- memcpy(buf, (const char*)USART3_RX_BUF, count);
-
- USART3_RX_STA = 0;
- memset(USART3_RX_BUF,0,USART3_MAX_RECV_LEN);
- return count;
-
- }
复制代码
|
|