×

STM32 + SIM800C 实现MQTT协议资料下载

消耗积分:5 | 格式:pdf | 大小:264.15KB | 2021-04-19

分享资料个

一、本教程中说明的内容 先说说本文化的适用范围吧: 一、使用的芯片是STM32F103C8T6,但是并没有任何与平台相关的代码,应该在所有STM32芯片中都是可以用的。 二、本文使用的是SIM800C模块,驱动是用C 实现的,基于ARM mbed平台写的。但是从原理上来讲,C和C 差别不大,本文的代码经过修改也可以直接用于其他平台的使用。 三、本文数据传输使用的是“透传模式”,对于所有的透传模块,本文都有很大的参考意义。 二、MQTT的使用 首先,推荐一个MQTT的库:Paho,这个库支持非常多的平台,当然也包括了嵌入式平台:GitHub – paho.mqtt.embedded-c。将该库中的MQTTPacket文件夹下载下来,MQTTPacket文件夹下面主要有三个文件夹,我们使用的文件主要集中在src文件夹和samples文件夹中。 src文件夹中存放着MQTT核心功能的代码,而samples中存放着三个例子:pub00sub1、pub0sub1_nc、qos0pub和网络驱动(transport.c和transport.h)。 由于三个驱动都有一个main函数,所以无法同时存在,本文中只使用了pub0sub,所以将此文件夹内容精减到只有pub0sub1.c、transport.c、transport.h三个文件。 当然,在实现使用时可能会改变目录结构,使目录结构更加清楚,可以根据自己的喜好来进行更改,并不影响使用。 将transport.h的内容精减到以下内容: 主要的工作有: 1、为了方便表示,删除了版权信息,有实际使用时请保留。 2、没有使用pub0sub1_nc这个例子,所以将transport_getdatanb方法去除。 3、透传模块中使用不到socket,所以将与socket相关的参数去掉。 这些方法实现的主要功能是: 1、transport_open的作用是初始化模块连网的信息、transport_close作用是关闭链接。 2、transport_sendPacketBuffer用于发送数据、transport_getdata用于接收数据。 然后用transport.c来实现transport.h中声明的4个函数。 三、在ARM mbed中使用MQTT 首先说句题外话,自我感觉mbed是一个非常不错的平台,很大程度上提高了代码的可重用性。但也有一个问题,就是其支持是以开发板为单位的,所以并不是对每一种芯片的支持都很好。 首先介绍一个例子,HelloMQTT – a mercurial repository | mbed。但这个例子其中有很多不完善的地方,而且该例子使用的网络驱动也不是GPRS模块。 如果要用不同的连网方式,那么就写一个驱动,驱动中至少要包含以下两个方法: 这两个方法会在MQTTClient中自动调用,timeout表示毫秒。返回值为读或写的字节数。 对此,我写了驱动程序: MQTTGRPSEthernet.h #pragma once #if !defined(MQTTGPRSETHERNET_H) #define MQTTGPRSETHERNET_H #define DEFAULT_GPRS_TIMEOUT 6000000 //6s #define SERIAL_BUFFER_SIZE 256 #include "mbed.h" class MQTTGPRSEthernet { public: MQTTGPRSEthernet(PinName tx, PinName rx, int baudrate = 115200); ~MQTTGPRSEthernet(); bool initNet(const char* apn, const char* userName = "", const char* passWord = "", int timeout = DEFAULT_GPRS_TIMEOUT, bool isReconnect = false); bool connect(char* hostname, int port, int timeout = DEFAULT_GPRS_TIMEOUT); int read_line(char* buffer, int timeout = DEFAULT_GPRS_TIMEOUT); int read(unsigned char* buffer, int len, int timeout = DEFAULT_GPRS_TIMEOUT); int write(unsigned char* buffer, int len, int timeout = DEFAULT_GPRS_TIMEOUT); bool disconnect(); private: bool initNet(); Serial eth; bool command(const char* cmd, const char* ack = ""); bool connected = false; bool initialized = false; char* localIP; const char *_apn; const char *_passWord; const char *_userName; }; #endif MQTTGRPSEthernet.cpp 主程序 lient的yield函数中用调用messageArrived函数,之前的示例给出的是100,可能是由于间太短的缘故,总是调用不了回调函数,所以我将其改的非常大,便于调试。实际使用时可以使用1000。 四、总结 其实paho embeded-c用起来还是挺方便的,但是代码的重要性不高,所以移植起来往往会让人无从下手。但深放研究就会发现其实使用起来是非常简单的。 转载自TsonTec:测量解决方案提供者 (mbbeetchina)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !