搜索
bottom↓
回复: 66

【eBox生态圈】移植超级火的MQTT物联网协议,进攻物联网

  [复制链接]

出0入17汤圆

发表于 2015-11-24 00:42:51 | 显示全部楼层 |阅读模式
本帖最后由 shentqlf 于 2015-11-24 01:28 编辑

这个互联网的年代,如果你不支持物联网就不要出来混啦!

科普:

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,将成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:
●网络代价昂贵,带宽低、不可靠。
●在嵌入设备中运行,处理器和内存资源有限。
该协议的特点有:
使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
●对负载内容屏蔽的消息传输。
●使用 TCP/IP 提供网络连接。
●有三种消息发布服务质量:
    ▲“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    ▲“至少一次”,确保消息到达,但消息重复可能会发生。
    ▲“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
●小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
●使用 Last Will和 Testament 特性通知有关各方客户端异常中断的机制。
库文件:Embedded MQTT C/C++ Client Libraries
版本:移植的是目前最新稳定版本3.1.1
下载地址:http://git.eclipse.org/c/paho/or ... mbedded-c.git/refs/
在此网页的左下角有三个下载链接,文件格式不同而已,选择第一个。
移植简介:
初看MQTT库文件觉得不知道从哪里下手。第一步就是选取自己需要的文件,解压后会看到MQTTPacket文件夹,移植到新的平台,这个文件夹就够用了。MQTTClient这个文件夹下面有已经移植好的接口,是在Linux、arduino、mbed平台上运行的。没有支持eBox,说明eBox还不够火,那咱们就自己移植吧。
MQTTPacket文件夹下面有src文件夹。这个就是MQTT的核心代码,不用,也不要做任何修改。Samples文件夹下面的transport.c和.h是MQTT的基本数据传输函数。老外做的就是好,接口文件完全独立于本身的逻辑部分。transport.c这个文件就是移植的最重要部分!要实现基本的四个函数,只填充发送、接收、打开、关闭,不要对函数名称做任何修改,除了这四个函数外,用户也可以添加自己的接口,比如状态判断,需要初始化的东西。

在eBox平台下,我吧transport.c改为.cpp,这要做是为了能让他使用eBox自带的tcp协议,而不必再去基于socket实现传输函数的移植。这一步大大的简化了填充过程。上代码:

  1. #include "tcp.h"

  2. TCPCLIENT mqtt_tcp;
  3. //我自己添加的接口
  4. int transport_init(int local_sock,int local_port)
  5. {
  6.     mqtt_tcp.begin(local_sock,local_port);
  7.     return 0;
  8. }
  9. /*
  10. @return  sended data size for success else 0.
  11. */
  12. int transport_sendPacketBuffer(unsigned char* buf, int buflen)
  13. {
  14.         int rc = 0;
  15.     rc = mqtt_tcp.send(buf,buflen);
  16.         return rc;
  17. }

  18. /*
  19. @return  received data size for success else 0.
  20. [size=4][b]非阻塞式接收[/b],需要在应用层,做好循环控制。我选择这个模式,
  21. 主要是为了,让stm32除了干这个事情外还能兼顾其他的程序,如果使用阻塞式的就会产生长时间等待。[/size]
  22. */
  23. int transport_getdata(unsigned char* buf, int count)
  24. {
  25.         return mqtt_tcp.recv(buf,count);
  26. }
  27. ///*
  28. //@return  received data size for success else 0.
  29. [size=4]//[b]阻塞式接收[/b],用户不需要在应用层做循环控制。缺点就是STM32会一直傻傻的等着。。。[/size]
  30. //*/
  31. //int transport_getdata(unsigned char* buf, int count)
  32. //{
  33. ////×èÈûʽ½ÓÊÕ
  34. //    int rc = 0;
  35. //    uint32_t last_time = millis();
  36. //   
  37. //    while(rc == 0 ){
  38. //        rc = mqtt_tcp.recv(buf,count);       
  39. //        if(millis() - last_time > 1500)
  40. //            return 0;
  41. //        }
  42. //        return rc;
  43. //}

  44. /*
  45. @return  received data size for success else 0.
  46. 这个函数我没有调试,应用程序中使用不到
  47. */
  48. int transport_getdatanb(void *sck, unsigned char* buf, int count)
  49. {
  50.     int rc;
  51.     while(rc == 0)
  52.     {
  53.         rc = mqtt_tcp.recv(buf,count);
  54.     }
  55.         return rc;
  56. }

  57. /**
  58. return >=0 for a socket descriptor, <0 for an error code
  59. @todo Basically moved from the sample without changes, should accomodate same usage for 'sock' for clarity,
  60. removing indirections
  61. @return  1 for success else 0:time out.
  62. */
  63. int transport_open(char* addr, int port)
  64. {   
  65.         return mqtt_tcp.connect((unsigned char *)addr,port);   
  66. }
  67. /*
  68. @return  1 for success else 0:time out.
  69. */

  70. int transport_close(int sock)
  71. {
  72.     mqtt_tcp.stop();
  73.         return 1;
  74. }
  75. //我自己添加的接口
  76. int transport_connnected()
  77. {
  78.     return mqtt_tcp.is_connected();

  79. }
复制代码

写完这几个函数就可以,看官方提供的例程了。例程在samples文件夹下面。pub0sub1.c/qos0sub.c/pub0sub1_nb.c。打开之后,直接懵了。。。。。。。这是什么代码啊。。。


沉下心来,过一遍就能理解个大概了。多过几遍就没问题了。从这几个例程中了解他的一个基本的通信过程。然后把他这些例程,移植到eBox上就行了。这里要注意的是,官方默认为你的接收函数使用阻塞式接收,而我用的是非阻塞的,要再应用层上做点循环,do ...while。先移植publish(发布消息)。调试协议多了,就会明白发送是一个比接收容易一百倍的事情。过了一天,调通了。。。然后移植接收,又是一天。然后就是优化,两天时间。应用层的移植过程中还需要不断的修改底层的函数bug,中间找到了不少网卡和socket的bug。所以花了比较长的时间。涉及的内容太多,就不贴出来了,看附件就行了。
到此基本上实现了mqtt的qos0模式的发布和订阅消息。实现了断线自动重连。我用了两个eBox的板子,一个发布消息,一个订阅消息,运行一个晚上,第二天依然工作。没有断线。
调试工具:http://m2m.demos.ibm.com/mqttclient/#subscribe怎么是个网页呢?鄙人不会各种高大上的软件平台,就找到了网页版的客户端,然后通过他来调试自己发送的数据,接收的数据。还有一个eclipse平台的服务器m2m.eclipse.org,1883端口可以让用户调试。
强势插入两个图片
发布消息,每隔一段时间会给服务器发一个ping_req告诉服务器我还活着。。。

订阅消息,当服务器向订阅者发布消息后,订阅者接收消息并显示。每隔一段时间会给服务器发一个ping_req告诉服务器我还活着。。。

移植好的文件,里面有mqtt的src文件和我自己的interface文件夹(包含了transport和应用层api)。用户把此文件夹放到eBox工程目录下的network文件夹下面。然后把代码添加到ebox工程中就可以了。


两个API使用的例程

MQTT的全部文件

MQTT_3.1.1中文手册


这段时间,我并没有闲着,而是努力的完善eBox固件库,由于在此之间更新了网络的一些接口,老的版本固件库不能直接使用(缺少DNS解析),今天太晚了,明天更上来最新的工程文件
http://bbs.elecfans.com/jishu_527922_1_1.html
顺便加一句,在调试的过程中会遇到没有网络的情况,希望各位大神谁有MQTT协议的调试工具,就像串口调试助手那样的。给大家共享出来。
求Android平台工具
求Windows平台工具
当然要已经能直接安装的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入17汤圆

 楼主| 发表于 2015-11-24 20:56:41 | 显示全部楼层
经历了半个多月的时间了,把目前最新的固件库和驱动发出来
带了mqtt的例程

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-11-24 03:31:16 | 显示全部楼层
半夜发帖。。搬板凳听课。

出0入0汤圆

发表于 2015-11-24 03:39:16 | 显示全部楼层
OSASIS 的 MQTT 协议 3.1.1 中文版协议文本不错... MDK5 的pack 和 STM32Cube 都在做类似的事... 感觉做技术支持还是不如做产品。

出0入0汤圆

发表于 2015-11-24 04:33:52 | 显示全部楼层
使用websocket 可能需要配置HTTP跨域操作才能登陆 cors_origin=*

出0入0汤圆

发表于 2015-11-24 08:06:08 | 显示全部楼层
战队支持!

出0入0汤圆

发表于 2015-11-24 08:49:28 | 显示全部楼层
看好楼主。

出0入0汤圆

发表于 2015-11-24 09:00:35 | 显示全部楼层

出0入0汤圆

发表于 2015-11-24 09:01:46 | 显示全部楼层
谢谢LZ,这么晚还在发帖...
敬佩

出0入0汤圆

发表于 2015-11-24 09:04:13 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2015-11-24 09:07:19 | 显示全部楼层
刚听说MQTT,正要学习呢,呵呵,感谢楼主!

出0入17汤圆

 楼主| 发表于 2015-11-24 09:07:25 来自手机 | 显示全部楼层
xwiron 发表于 2015-11-24 04:33
使用websocket 可能需要配置HTTP跨域操作才能登陆 cors_origin=*

有没有调试助手之类的工具呢?

出0入0汤圆

发表于 2015-11-24 09:08:08 | 显示全部楼层
mark,学习一下

出0入17汤圆

 楼主| 发表于 2015-11-24 09:08:25 来自手机 | 显示全部楼层
dushanwu522 发表于 2015-11-24 09:07
刚听说MQTT,正要学习呢,呵呵,感谢楼主!

网上好多库,选一个合适的去移植下

出0入0汤圆

发表于 2015-11-24 09:08:34 | 显示全部楼层
mark                                 

出425入0汤圆

发表于 2015-11-24 10:31:10 | 显示全部楼层
让我感觉eBox瞬间高大上起来。

出0入0汤圆

发表于 2015-11-24 10:33:05 | 显示全部楼层
顶起来啊

出0入17汤圆

 楼主| 发表于 2015-11-24 10:43:25 | 显示全部楼层
guolun 发表于 2015-11-24 10:31
让我感觉eBox瞬间高大上起来。

谢谢!后面的路还很长!

出0入17汤圆

 楼主| 发表于 2015-11-24 10:43:48 | 显示全部楼层

谢顶!!!

出0入0汤圆

发表于 2015-11-24 10:48:07 | 显示全部楼层
已将楼主发的 IBM MQTT WEB 客户端搬迁至自己的服务器。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-11-24 10:50:57 | 显示全部楼层
shentqlf 发表于 2015-11-24 09:07
有没有调试助手之类的工具呢?

http://www.eclipse.org/paho/clients/tool/ 这里有一个,我现在在用...
eclipse paho 的库,可能是MQTT的通过标准库。

出0入17汤圆

 楼主| 发表于 2015-11-24 10:59:23 | 显示全部楼层
xwiron 发表于 2015-11-24 10:50
http://www.eclipse.org/paho/clients/tool/ 这里有一个,我现在在用...
eclipse paho 的库,可能是MQTT ...

多谢,多谢!!!

出0入0汤圆

发表于 2015-11-24 11:04:10 | 显示全部楼层
shentqlf 发表于 2015-11-24 10:59
多谢,多谢!!!

https://github.com/kamilfb/mqtt-spy
https://github.com/kamilfb/mqtt-spy/wiki
https://github.com/kamilfb/mqtt-spy/wiki/Downloads
可能mqtt-spy更好用...可以保存主题配置。

出0入17汤圆

 楼主| 发表于 2015-11-24 11:08:02 | 显示全部楼层
xwiron 发表于 2015-11-24 11:04
https://github.com/kamilfb/mqtt-spy
https://github.com/kamilfb/mqtt-spy/wiki
https://github.com/ka ...

有没有在自己电脑搭建服务的工具

出0入0汤圆

发表于 2015-11-24 11:13:50 | 显示全部楼层
shentqlf 发表于 2015-11-24 11:08
有没有在自己电脑搭建服务的工具

我在用apache apollo,WEB 服务器可以用 xampp 测试... 另外 activemq 开发接口很全,apollo 是 activemq 的下一代中间件,都是基于 java 环境,eclipse mosquito C/C++开发的吧,配置不如 apollo 和 activemq 方便,占用资源少一些。。。
https://github.com/mqtt 里面有各种关于 MQTT 的资源:

Brokers/servers
Client libraries
Tools and applications
Plugins to other software
Devices aka MQTT-enabled products that are "Things"

https://github.com/mqtt/mqtt.github.io/wiki/servers
https://github.com/mqtt/mqtt.github.io/wiki/libraries

...

出0入17汤圆

 楼主| 发表于 2015-11-24 11:17:12 | 显示全部楼层
xwiron 发表于 2015-11-24 11:13
我在用apache apollo,WEB 服务器可以用 xampp 测试... 另外 activemq 开发接口很全,apollo 是 activemq ...

不是专业搞软件,网络的看这些还是有点吃力

出0入0汤圆

发表于 2015-11-24 12:49:06 | 显示全部楼层
刚刚加入撸主的众筹,学习一下!

出0入0汤圆

发表于 2015-11-24 12:51:00 | 显示全部楼层
越来越多 这样质量较高 开源项目,  挺好的

出0入17汤圆

 楼主| 发表于 2015-11-24 12:56:31 来自手机 | 显示全部楼层
xivisi 发表于 2015-11-24 12:51
越来越多 这样质量较高 开源项目,  挺好的

大家一起来开发

出0入0汤圆

发表于 2015-11-24 13:27:30 | 显示全部楼层
过来学习学习

出0入0汤圆

发表于 2015-11-24 21:17:58 | 显示全部楼层


MQTT  服务器是不是有开源的?


出0入17汤圆

 楼主| 发表于 2015-11-24 21:37:11 | 显示全部楼层
ljt80158015 发表于 2015-11-24 21:17
MQTT  服务器是不是有开源的?

不会怎么搭建环境。

出0入0汤圆

发表于 2015-11-24 21:38:05 | 显示全部楼层
正在找这方面的资料,谢谢分享。

出0入0汤圆

发表于 2015-11-24 21:39:56 | 显示全部楼层
我也来参加众筹,支持一下!

出0入17汤圆

 楼主| 发表于 2015-11-24 22:13:03 | 显示全部楼层
error_dump 发表于 2015-11-24 21:39
我也来参加众筹,支持一下!

谢谢支持!!!

出0入0汤圆

发表于 2015-11-25 10:35:33 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2015-11-27 10:59:46 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2015-11-27 13:12:14 | 显示全部楼层
支持下, 有时间也弄下物联网

出0入90汤圆

发表于 2015-11-27 14:47:20 | 显示全部楼层
花了很多功夫,支持一下

出0入0汤圆

发表于 2015-11-27 17:57:01 | 显示全部楼层
这个必须收藏

出0入17汤圆

 楼主| 发表于 2015-11-27 18:01:22 | 显示全部楼层
honami520 发表于 2015-11-27 14:47
花了很多功夫,支持一下

谢谢支持!!!

出0入17汤圆

 楼主| 发表于 2015-11-27 18:02:12 | 显示全部楼层
NoTimer 发表于 2015-11-27 13:12
支持下, 有时间也弄下物联网

大家共同学些。可以加入我的群一起讨论139218853

出0入148汤圆

发表于 2015-11-27 18:04:02 | 显示全部楼层
支持一些哈,最近也在玩mqtt

出0入17汤圆

 楼主| 发表于 2015-11-27 19:03:33 | 显示全部楼层
yplin27 发表于 2015-11-27 18:04
支持一些哈,最近也在玩mqtt

谢顶!!

出0入0汤圆

发表于 2016-7-2 18:31:45 | 显示全部楼层
谢谢楼主无私分享资料!!!

出0入0汤圆

发表于 2016-7-4 09:51:24 | 显示全部楼层
搬张板凳听节课。

出0入17汤圆

发表于 2016-8-1 17:40:31 | 显示全部楼层
谢谢楼主的分享

出0入18汤圆

发表于 2016-9-3 22:17:18 | 显示全部楼层
顶一下  以表 支持

出0入0汤圆

发表于 2016-9-3 23:00:38 | 显示全部楼层
好东西,好好学习下!

出0入0汤圆

发表于 2016-9-5 15:24:34 | 显示全部楼层
楼主,MQTT物联网协议,用在什么总线上面比较合适呢

出0入0汤圆

发表于 2016-9-5 15:30:45 | 显示全部楼层
gzhua20088ssj 发表于 2016-9-5 15:24
楼主,MQTT物联网协议,用在什么总线上面比较合适呢

tcp/ip吧~

出0入0汤圆

发表于 2016-10-25 19:55:59 | 显示全部楼层
关注,哪天心血来潮就看看

出0入0汤圆

发表于 2016-10-25 21:07:50 | 显示全部楼层
外国客户提到过这个东西,还没有研究

出0入0汤圆

发表于 2016-11-2 16:42:05 | 显示全部楼层
这样高质量的文章是一定要顶的,谢谢楼主

出0入0汤圆

发表于 2016-12-9 16:50:20 | 显示全部楼层
底层用的W5500么,不知道支不支持esp8266 wifi呀

出0入0汤圆

发表于 2016-12-9 17:16:22 | 显示全部楼层
楼主辛苦了

出0入0汤圆

发表于 2017-5-23 23:00:41 | 显示全部楼层
楼主辛苦了

出0入0汤圆

发表于 2017-7-1 15:07:07 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2017-11-16 10:53:40 | 显示全部楼层
服务端  直接用阿里云的物联网套件可以的吧

出0入0汤圆

发表于 2017-11-16 10:55:17 | 显示全部楼层
自己玩玩就可以专注于信息的发布和订阅,,

出0入0汤圆

发表于 2017-12-19 09:50:14 | 显示全部楼层
扒坟,移植一下

出0入4汤圆

发表于 2018-3-12 14:48:03 | 显示全部楼层
楼主辛苦了,学习一下~

出0入0汤圆

发表于 2018-10-14 17:21:55 | 显示全部楼层
正需要这个东东

出0入0汤圆

发表于 2018-10-15 08:40:21 | 显示全部楼层
很厉害,刚好在学习,谢谢。

出0入0汤圆

发表于 2019-4-19 22:31:23 | 显示全部楼层
楼主辛苦了           

出0入0汤圆

发表于 2020-2-21 12:02:29 | 显示全部楼层
xiexie,学习了

出0入4汤圆

发表于 2020-3-13 15:23:18 | 显示全部楼层
学习了,正准备做物联网方面的

出0入0汤圆

发表于 2020-3-13 15:38:25 | 显示全部楼层
辛苦了楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 11:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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