链接--->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. FreeRTOS 低功耗之停机模式

    以下转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 如何进入停机模式在 FreeRTOS 系统中,让 STM32 进入停机模式比较容易,调用 ...

  2. ad9 的快捷方式

    TAB:选中元件后,可以显示该元件的属性: PAGEUP:以鼠标所在点为中心,放大视图: PAGEDOWN:以鼠标所在点为中心,缩小视图: HOME:居中,可以从原来光标下的图纸位置,移位到工作区中心 ...

  3. 使用maven创建工程报错Could not resolve archetype org.apache.maven.archetype

    错误: Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart:1.1 from any ...

  4. scala实现彩票算法

    scala实现彩票算法 (1)具体实现代码如下: package hw1 import scala.util.control._ /** * @author BIGDATA */ object Cp ...

  5. kafka+storm+hbase

    kafka+storm+hbase实现计算WordCount. (1)表名:wc (2)列族:result (3)RowKey:word (4)Field:count 1.解决: (1)第一步:首先准 ...

  6. anroid 广播

    广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroa ...

  7. Framework 7 之 Smart select 选择后自动隐藏

    Framework 7官网地址:Framework 7(英文版) Framework 7(中文版) 给“smart-select”添加属性  data-back-on-select="tru ...

  8. ASP.NET MVC 使用 Datatables (2)

    在服务器端实现分页,排序,获取当前页面数据 在上篇的基础上进行改造(datatables的客户端实现) 1.修改View页面代码如下: <div class="row"> ...

  9. 去掉CSS中的表达式Expression

    在IE中,CSS是可以嵌入js表达式的,可以在CSS类中定义,但是将含有表达CSS类从DOM对象中移除,样式表达式是不会失效的. 经过研究找到了答案,需要使用js调用style对象的removeExp ...

  10. 'cl.exe' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    1.首先找到vcvars32.bat文件,一般在C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin文件夹下 2.打开cmd黑窗 ...