MQTT--单片机实现即时通信
链接--->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--单片机实现即时通信的更多相关文章
- 即时通信(IM)和实时通信(RTC)的区别
即时通信(IM=nstant messaging)和实时通信(rtc=Real-time communication)都是一套网络通信系统,其本质都是对信息进行转发.其最大的不同点,是对信息传递的时间 ...
- java即时通信小例子
学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...
- iOS开发之使用XMPPFramework实现即时通信(三)
你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...
- iOS开发之使用XMPPFramework实现即时通信(二)
上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...
- 基于XMPP协议的Android即时通信系
以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...
- 【原】iOS学习43即时通信之XMPP(2)
本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...
- 【原】iOS学习42即时通信之XMPP(1)
1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...
- QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件
QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...
- (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案
一.前言.提出问题 公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让 ...
- (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案
在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...
随机推荐
- android从Dialog对话框中取得文本文字
android中Dialog对话框获取文本文字,只需要使用editor的getText方法就可以获得,示例如下:final EditText et = new EditText(this); et.s ...
- java web hello world(一)
首先在eclipse 里面创建一个java 动态项目, 记住路径,这里是直接通过根目录直接访问的webContent目录下面 的文件, 创建好后 ,在本地配置Tomcat服务器, 将server加入到 ...
- 自定义maven变量以及maven内置常量
本文转自:http://zheng12tian.iteye.com/blog/1770909 在创建Maven工程后,插件配置中通常会用到一些Maven变量,因此需要找个地方对这些变量进行统一定义,下 ...
- 【SVN/Visual Studio】清除/更换AnkhSVN的用户登录信息
问题: 在VS开发环境下,使用SVN做版本控制,用了TortoiseSVN和插件AnkhSVN.提交代码到SVN服务器时,发现用的是别人的SVN帐号,不是自己的号(比如该电脑之前是别人在使用).想要清 ...
- C语言 · s01串
算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) ...
- vsftp移植(待续)
1. 下载sftp包,解压.如vsftpd-2.3.5.tar.gz2. 编译 进入目录后,修改交叉编译工具(vi Makefile) CC = arm-none-linux-gnueabi ...
- 如何打一手好Log
如果项目上过线的话,那你一定知道Log是多么重要. 为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出 ...
- vmware下ubuntu不能上网 => 恢复默认虚拟网络
1.关闭虚拟机ubuntu 2.打开:编辑=> 虚拟网络编辑器 3.打开后点击左下角恢复默认 4.重启ubuntu就可以了
- Can't connect to MySQL server on '192.168.7.175' (10060)
原因: 1.你的ip没有被授权,无法访问. 2.端口没有打开(如:3306端口没有打开). 解决方法: 授权(http://www.cnblogs.com/SZxiaochun/p/6401424.h ...
- e644. 处理Action事件
Action events are fired by subclasses of AbstractButton and includes buttons, checkboxes, and menus. ...