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

嘎子 其他开发 2017-05-18 21,434 次浏览 , , , 16条评论

——————写在最前面—————————-

本文基本完全公开了自己怎么处理的STM32和SIM800C的,但有的人不想折腾,我也把我的代码放到淘宝上卖,500块,在相同的平台上包售后。

淘宝链接:

当然,也承接定制开发,价格可以会稍贵一点。

最近恰好有时间,也想把这个程序改成库文件版的,修改完成了也会放到淘宝上。

———————–结果也是新的开始———————————————————-

最近真是的好一个劲的折腾,算是完全搞明白了如何在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

 

原创文章,文章首发于:Riley Ge (@rileyge) — Steemit

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

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

相关主题

  • 在GPRS模块(SIM800C)和STM32芯片上实现MQTT协议(HAL版)2017-12-26 在GPRS模块(SIM800C)和STM32芯片上实现MQTT协议(HAL版) (3)
    自己又勤快起来,把使用SIM800C芯片连接MQTT服务器用HAL库实现一下。现在只是把路子感觉走通了,但还没有调试(手头没有硬件)。先把自己现在做到的东西记 […]
  • 阿里云IoT套件中MQTT协议的使用2017-05-28 阿里云IoT套件中MQTT协议的使用 (0)
    今天,阿里云给我发来邮件,说我申请的IoT套件已经可以申请了,虽然我不记得自己什么时候申请过了,但请我试用就试用一下呗。我看这个阿里云的这个东东有两个节点,一 […]
  • 阿里云/aliyun的IoT套件中MQTT协议的使用(二)2017-12-31 阿里云/aliyun的IoT套件中MQTT协议的使用(二) (1)
    很早之前写过一篇文章,阿里云IoT套件中MQTT协议的使用,现在看了一下觉得还是挺坑的,说白了什么都没写。我本来是一个比较懒的人,也没有什么心情来更新这个文章 […]
  • 通过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使用心得之本地管理两篇文章的基础上进行的,有不明白的可以参照上面两篇文章。 首先给 […]

16
说点什么

avatar
10 Comment threads
6 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
10 Comment authors
123ttsimmonsalanlibaiswet123 Recent comment authors
  Subscribe  
最新 最旧 得票最多
提醒
123tt
游客
123tt

店铺地址咋没看到呢

simmons
游客
simmons

楼主完整的代码在哪啊,没看见呢

alan
游客
alan

没有找到淘宝链接呀

libai
游客
libai

博主,能定制STM32接入阿里云的MQTT+TLS传输吗?

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可以放出来吗

我赚啦
游客

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

回顶部