链接--->http://blog.csdn.net/zhou6343178/article/details/51182623

1、准备条件: 
a)硬件:ATMEGA644PA 8位单片机 ENC28J60 
b)下载MQTT C语言的包: 
C/C++ MQTT Embedded clients 
https://www.eclipse.org/paho/clients/c/embedded/ 
c)MQTT基础知识 
http://mqtt.org/ 
http://download.csdn.net/detail/zhou6343178/9495445

2、移植MQTTPacket到项目里: 
复制文件夹MQTTPacket到工程,复制MQTTPacket\samples里面的transport.c、transport.h到工程 

3、修改已经transport.c里面的四个接口:

int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen);
int transport_getdata(unsigned char* buf, int count);
int transport_open(char* host, int port);
int transport_close(int sock);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

看接口名称就知道,该四个接口实现的是TCP数据的收发,具体修改需要根据已经实现的TCP接口来定。(单片机上常用的TCP/IP协议栈主要有uip、LwIP) 
注意:MQTT是tcp/ip的应用层,传输层需要自己实现,这四个接口分别对应TCP的连接、收、发和关闭。

4、实现订阅/发布,查看MQTTPacket\samples下的pub0sub1.c。 
下面为参数的意义: 
MQTTPacket_connectData data = MQTTPacket_connectData_initializer; //连接参数 
data.clientID.cstring = “me2”; //客户ID,唯一 
data.keepAliveInterval = 200; //保存存活时间200s 
data.cleansession = 1;//重新连接后是否清除以前的信息 0表示不清除,1表示重连清除 
data.username.cstring = “admin”;//如果服务器需要用户名密码,这里设置 
data.password.cstring = “admin”; 
Qos : 
0 表示最多一次 
1 表示至少一次 
2 表示只有一次

MQTTDeserialize_publish(&dup,&qos,&retained,&msgid,&receivedTopic,&payload_in, &payloadlen_in, buf,buflen);
  • 1
  • 1

msgid:该包的ID,paketid,如果需要增加反馈(QoS为1和2需要反馈),需要获取该ID

发送反馈:

MQTTDeserialize_publish(&dup, &qos, &retained, &msgid,&receivedTopic,&payload_in, &payloadlen_in, buf, buflen);
int len = MQTTSerialize_puback(buf,buflen,msgid);
transport_sendPacketBuffer(ack_buf,len);
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

接收服务器的反馈:

if(PUBACK == MQTTPacket_read(buf,buflen,transport_getdata))
{
unsigned char packettype = 0;
unsigned char dup_ack = 0;
unsigned short packetid = 0; MQTTDeserialize_ack(&packettype,&dup_ack,&packetid,buf,buflen);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

比较发送的msgid和反馈获取的packetid,如果一致表示该包发送成功。 
等等,具体看文档

5、服务器实现 mosquitto 
请参考:http://blog.csdn.net/xukai871105/article/details/39252653 
指令举例: 
订阅 mosquitto_sub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic 
-h 服务器域名 
-u 用户名(没有可以省略) 
-P密码(没有可以省略) 
-t topic名称

发布:mosquitto_pub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic -m hello 
-m 发布的内容

以上基本实现单片机与服务器的联调。如果需要手机控制单片机,可下载手机相关的MQTT包进行通讯。

MQTT--单片机实现即时通信的更多相关文章

  1. 即时通信(IM)和实时通信(RTC)的区别

    即时通信(IM=nstant messaging)和实时通信(rtc=Real-time communication)都是一套网络通信系统,其本质都是对信息进行转发.其最大的不同点,是对信息传递的时间 ...

  2. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  3. iOS开发之使用XMPPFramework实现即时通信(三)

    你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...

  4. iOS开发之使用XMPPFramework实现即时通信(二)

    上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...

  5. 基于XMPP协议的Android即时通信系

    以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...

  6. 【原】iOS学习43即时通信之XMPP(2)

    本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...

  7. 【原】iOS学习42即时通信之XMPP(1)

    1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...

  8. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件

    QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...

  9. (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案

    一.前言.提出问题 公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让 ...

  10. (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案

    在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...

随机推荐

  1. jquery全部版本

    http://www.jb51.net/zt/jquerydown.htm 这个地方实时更新jquery版本

  2. ios UIImageView异步加载网络图片2

    //1. NSData dataWithContentsOfURL // [self.icon setImage:[UIImage imageWithData:[NSData dataWithCont ...

  3. SparkSQL ThriftServer服务的使用和程序中JDBC的连接

    SparkSQL ThriftServer服务的使用和程序中JDBC的连接 此时要注意版本问题,我第一次用的是hive2.1.1的,因为要用sparksql的hive服务,但是sparksql默认的是 ...

  4. Linux 进程间通信(posix消息队列 简单)实例

    Linux 进程间通信(posix消息队列 简单)实例 详情见: http://www.linuxidc.com/Linux/2011-10/44828.htm 编译: gcc -o consumer ...

  5. nginx下基于ThinkPHP框架的网站url重写

    http { upstream phpfastcgi { server 127.0.0.1:9000 } } server { location / { if (!-e $request_filena ...

  6. 怎样在IIS下配置PHP

    首先下载Windows的PHP安装包.随后将该包解压至C:\PHP.完成上面的步骤后,将C:\php目录下的php.ini-dist文件改名为php.ini,然后拷到C:\Windows目录下. 用记 ...

  7. ubuntu rails3.2.16 提示gem mysql adapter

    把database.yml的adapter改为mysql2 把Gemfile文件中的gem mysql改为gem mysql2

  8. 关于在Android中访问和使用到上下文变量

    在监听器内部实现类中要引用上下文变量this的时候 一.采用类名.this的方法 FActivity.this 二.采用全局变量当做中间变量 1.先定义一个全局变量 private Context m ...

  9. 【从0開始Tornado建站】整体设计

    Tornado是一个非堵塞的webserver,也是python的web框架中很优秀的一款.网上关于django的tutorial许多并且具体,关于tornado的使用就很少了.我想以我从0開始的方式 ...

  10. 浮点纹理 opengl

    原文地址:http://wangqingyun84.blog.163.com/blog/static/790836172010323113604/ 因为 glsl部分 绑定fbo 看到要用浮点纹理,搜 ...