MQTT开发小记(一)
最近在协助公司硬件组进行MQTT协议的嵌入式SDK包开发。
简述一下MQTT
MQTT简单的来说是一种订阅/发布模式的通信形式,一般分为客户端和服务器端。
MQTT服务器端可以简单理解为一个消息中转站,也可称作“消息中间件”。
MQTT是在TCP层面上封装出的一种消息协议,所以如果从网络底层看,依然是现需要建立基本的TCP连接,然后在进行MQTT的连接、消息传递等。
常规的通信形式是这样的:
1、客户端通过MQTT协议与服务器进行连接
2、客户端告知服务端,自己需要监听(订阅)何种消息来源(主题)的信息
3、服务器收到客户端的订阅,进行记录
4、如果客户端需要主动告诉服务端一些信息,则发送自定义的指定主题,与相对应的消息告知服务器,服务器端的处理逻辑再进行相应处理
5、服务端如果想给客户端发送消息,则向客户端订阅的主题发送相应的信息
由如上可知,MQTT的服务端可以实现,一次发送,告知多个订阅相同主题的客户端。即常见的手机信息推送。
手机推送可以理解为,某个APP向服务端订阅了指定“主题”,服务端需要告知所有客户端消息时候,只需要发送相应主题的信息即可。
非常的类似组播。
如果想实现两个客户端的相互通信,也可以使用MQTT,这是MQTT服务端类似与一个消息转发器,接收两边的信息,并按照指定逻辑相互传递。
由于存在MQTT服务器这个消息中间商,所以在一般的网络通信中,只要保证MQTT服务器的稳定在线,就可以保证所有客户端之间的通信或者消息的推送。
所以,在实际的物联网工程中,存在很多利用GPRS传输的设备或者恶劣的网络条件,如果采用实时双工通信的方式,很可能会遗漏实时数据。
如果采用了MQTT,设备即可在网络恢复的情况下,补发历时实时数据,由MQTT服务器进行储存,并在网络良好的情况下传递个下一个需要该数据的客户端。
以上是对MQTT的粗浅理解。
附上这几天的坑:
1、MQTT的客户端发送的publish数据包如果存在“0000”,服务端会拒绝数据并且主动关闭连接
2、MQTT的服务器不能同时接到同一客户端的两次连接请求,否则会在连接第二次的时候主动关闭连接
3、千万不要给板子的GPRS等装置设置两次MQTT服务端的IP端口,否则会出现坑2的情况,并会造成publish的数据包严重错误
4、善用wireshark,能帮你快速从tcp层面找到问题的所在
以上
转自:http://www.xjdsz.net/archives/28.html
MQTT开发小记(一)的更多相关文章
- NodeJS+Express+MySQL开发小记(2):服务器部署
http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...
- 使用Surging Mqtt 开发基于WS的MqttClient客户端
原文:使用Surging Mqtt 开发基于WS的MqttClient客户端 最近一段时间由于要做一套智能设备系统,而有幸了解到Surging中的Mqtt broker,学习了很多东西本篇文章基于Su ...
- 带农历日历的DatePicker控件!Xamarin控件开发小记
原文:带农历日历的DatePicker控件!Xamarin控件开发小记 闲来无事开发了个日期选择控件,感兴趣的同学前往: https://github.com/MatoApps/Mato.DatePi ...
- MQTT开发笔记之《MQTT Server》
MQTT SERVER 性能测试报告 : http://w3yyb.sinaapp.com/archives/1601各个MQTT SERVER功能列表: http://blog.lenix.xyz/ ...
- 漫谈LiteOS-端云互通组件-MQTT开发指南(上)
1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...
- 漫谈LiteOS-端云互通组件-MQTT开发指南(下)
1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...
- Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用
前话 项目需求,需要使用到mqtt协议,之前编译QtMqtt库,不支持队列模式queue(点对点),只支持订阅/发布者模式.,所以使用C++ ActiveMQ实现. MQTT协议 简介 M ...
- Electron Angular 开发小记
一介绍 electron分为主进程和渲染进程,主进程负责和原生交互,控制窗口等. 渲染进程就是普通网页.主进程和渲染进程可以通过ipcMain(主进程使用)及ipcRenderer(渲染进程用)通信 ...
- 微软颜龄Windows Phone版开发小记
随着微软颜龄中文网cn.how-old.net的上线,她也顺势来到了3大移动平台. 用户在微软颜龄这一应用中选择一张包含若干人脸的照片,就可以通过云计算得到他们的性别和年龄. 今天我们就和大家分享一下 ...
随机推荐
- 16g u盘变 成1g u盘 解决方案,使用驱动器中的光盘之前需要将其格式化
1\ 计算机----管理------磁盘管理 有一个黑色区域是未分配的 2\ 1)进入cmd 命令行窗口2)输入 diskpart,并回车.弹出系统提示,选是即可.3)输入 list disk,并回 ...
- Blocks 推出矩阵公式。矩阵快速密
Blocks 设涂到第I块时,颜色A,B都为偶数的数量为ai,一奇一偶的数量为bi,都为奇数为ci, 那么涂到第i+1快时有 a[i+1]=2*a[i]+b[i]+0*c[i]; b[i+1]=2* ...
- [Javascript] Try...Catch和异常处理
在JavaScript可以使用try...catch来进行异常处理.例如: try { foo.bar(); } catch (e) { alert(e.name ...
- Java SortedSet接口
该SortedSet的接口扩展集Set并声明了一组按升序排序的行为.除了通过集定义的那些方法中,SortedSet接口声明总结于下表的方法: 有几种方法没有任何条目包含在调用Set的时候抛出一个NoS ...
- 11. Android框架和工具之 Logger(调试代码)
1. Logger Logger是android是一个简单.漂亮.功能强大的Android日志程序. 日志程序提供了 : 线程信息Thread information 类信息Class informa ...
- 用bootstrapValidator来验证UEditor
我们的项目使用了bootstrapValidator来作为前端校验,但是表单里面有一个UEditor,它用bootstrapValidator是没有效果的,为了页面风格统一,只好修修改改咯 首先来看一 ...
- mina 字节数组编解码器的写法 I
mina 服务器与 mina 客户端通讯的话, 一.传递 String 时编解码工厂使用 mina 自带的 TextLineCodecFactory 即可: 二.传递 java 对象或 byte[] ...
- IIS与JIRA的反向代理配置
JIRA配置修改 JIRA与IIS ARR的集成,除了上篇(Visual SVN IIS反向代理设置)中讲到的基本的ARR配置之外,还需要在JIRA安装目录的conf\server.xml文件中做一个 ...
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...
- hdu 3804 树链剖分
思路:将边权排序,然后插入线段树,这样就可以直接用二分查找确定答案. #pragma comment(linker, "/STACK:1024000000,1024000000") ...