在GPRS模块(SIM800C)和STM32芯片上实现MQTT协议

嘎子 其他开发 2017-05-18 5,999 次浏览 , , , 12条评论

最近真是的好一个劲的折腾,算是完全搞明白了如何在STM32上实现MQTT协议了。

一、本教程中说明的内容

先说说本文化的适用范围吧:

一、使用的芯片是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

MQTTGRPSEthernet.cpp

主程序

client的yield函数中用调用messageArrived函数,之前的示例给出的是100,可能是由于间太短的缘故,总是调用不了回调函数,所以我将其改的非常大,便于调试。实际使用时可以使用1000。

四、总结

其实paho embeded-c用起来还是挺方便的,但是代码的重要性不高,所以移植起来往往会让人无从下手。但深放研究就会发现其实使用起来是非常简单的。

—————————–可爱的分割线——————————————————

有路过的吃瓜群众说想要StringHelper这个类,当时这个类用处不大,里面多数功能都可以用std::string中的功能来实现。不过自己刚从C转过来自己并不太了解,所以自己又写了一个,功能并不是很完善。也分享给大家:StringHelper

 

原创文章,转载请注明: 转载自TsonTec:测量解决方案提供者

本文链接地址: 在GPRS模块(SIM800C)和STM32芯片上实现MQTT协议

相关主题

  • 阿里云IoT套件中MQTT协议的使用2017-05-28 阿里云IoT套件中MQTT协议的使用 (0)
    今天,阿里云给我发来邮件,说我申请的IoT套件已经可以申请了,虽然我不记得自己什么时候申请过了,但请我试用就试用一下呗。我看这个阿里云的这个东东有两个节点,一 […]
  • 通过Paho客户端接入OneNet2017-05-12 通过Paho客户端接入OneNet (1)
    首先说本文想要说明一个什么问题:OneNet平台支持MQTT协议,但给的资料非常有限。而Paho是一个开源的,MQTT的各种服务器、客户端的集成。本文要做的就 […]
  • 使用代理(有验证)连接TcpClient2016-02-07 使用代理(有验证)连接TcpClient (2)
    先分享代码给大家: static TcpClient connectViaHTTPProxy( string targetHost, […]
  • Git使用心得之在线管理2016-03-01 Git使用心得之在线管理 (0)
    本文是在Git使用心得之Git与GitHub的关系和Git使用心得之本地管理两篇文章的基础上进行的,有不明白的可以参照上面两篇文章。 首先给 […]
  • Git使用心得之本地管理2016-03-01 Git使用心得之本地管理 (2)
    如果对Git没有完整的概念,大家可以参考:Git使用心得之Git与GitHub的关系 首先把所有工具都安装上去: 1、Git:h […]
  • VisualGDB项目的移植问题2017-05-15 VisualGDB项目的移植问题 (0)
    很多人可能还不知道VisualGDB是什么东东,我给大家普及一下(自己的理解,不对勿喷): 1、VisualGDB是一个Visual […]

说点什么

12 评论 在 "在GPRS模块(SIM800C)和STM32芯片上实现MQTT协议"

提醒
avatar
排序:   最新 | 最旧 | 得票最多
swet123
游客
swet123

博主, 很牛啊, STM32也会玩哦~~

test3
游客
test3

很好的文章,学习了,
StringHelper::EndWith函数
if (strcmp(str + l1 - l2, end) == 0) {
result = true;
}

是不是写错了?

jack
游客
jack

初次接触MQTT ,读完文章有些疑问,MQTT协议是在STM32上实现的?还是SIM900上面实现的?还是两者都实现了?

路过的吃瓜群众
游客
路过的吃瓜群众

哈哈 被lz坑到了 lz的文件名MQTTGRPSEthernet.h误导我 你拼错了 是MQTTGPRSEthernet.h

路过的吃瓜群众
游客
路过的吃瓜群众

StringHelper这个类 lz可以放出来吗

我赚啦
游客

古人日三省其身,我从博客里吸收养分!

wpDiscuz
回顶部