mqtt通信模式必须要把连接设备写死吗

物联网高层通讯协议揭秘1:MQTT_物联网老范_新浪博客
物联网高层通讯协议揭秘1:MQTT
【版权声明:本文为“物联网老范”原创作品,转载须经作者书面授权。请留言联系。】
为了便于读者快速确认本文是否合您口味,将目录列示如下:
MQTT是个什么鬼?
​MQTT为什么会诞生?
MQTT牛什么牛?​
MQTT​背后的大佬?​
MQTT怎么玩​——服务器端
MQTT怎么玩​——客户端
​​MQTT怎么玩​——云部署
MQTT宁有种乎?
​在线资源​​
什么是MQTT
​MQTT 是&Message Queuing
Telemetry Transport
的缩写,中文翻译为:消息队列遥测传输。一直没人解释什么是“遥测”,大家也呵呵一下就似懂非懂过去了。实际上遥测就是远程测量的意思,对于路途遥远的(比如卫星上的信息)、环境恶劣的(比如核反应堆的信息),不得不进行远程测量。同样的,我们现在考虑的物联网环境中,大量分布式存在的传感器,也自然以远程测量为宜。所以这个MQTT单从字面意义上就可以看出为物联网量身定做的理念来。
该协议面向M2M和物联网的连接,采用轻量级的“发布和订阅”消息传输机制。一般有三方参与,发布方、订阅方(可以有多个实体)、代理方。三方会有一个共同的主题作为整个通讯的识别基础,然后当发布方将信息发送给代理后,代理方会推送给所有订阅了该主题的客户端。要想感受这种体验,可以想想微信上订阅号的行为方式——公众号就是发布方,他将当天的信息发送给微信的服务器,微信服务器则将该信息推送给所有订阅了该公众号的用户,在这个例子里面,公众号ID就类似于MQTT的订阅主题。​
​MQTT是怎么诞生的
早在1999年,IBM的Andy
Stanford-Clark博士以及Arcom公司ArlenNipper博士就提出了
MQTT&即时通讯协议。在这个协议之前,物联网应用中的主流做法是不断轮询传感器才能得到想要的数据,这种做法耗时、耗电,简单而粗暴。两位博士正是在这种背景下提出了MQTT——一个真正支持推送的物联网传输协议。
MQTT牛什么牛
​MQTT协议是为大量“计算能力有限,带宽较低、工作在不可靠网络中”的远程传感器和控制设备而设计的通讯协议,它的特点也因此而非常鲜明:
1、使用发布/订阅消息模式,所以天然支持一对多的发布形式,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;​
3、使用 TCP/IP
提供网络连接;​
4、有三种消息发布服务质量:“至多一次”——可能丢失但不敏感;“至少一次”——确保消息到达但可能重复;“只有一次”——确保消息到达一次,且不重复;​
5、小传输,小开销(头部固定为&2
字节),协议交换最小化,降低网络流量;​
6、使用 Last Will 和 Testament
特性通知有关各方客户端异常中断的机制;​
​和CoAP等其他物联网协议相比,MQTT的最大优势在于其公共订阅消息队列机制以及多对多广播能力。有了指向MQTT代理端的长效TCP连接的支持,以有限带宽进行消息收发变得简单而轻松。
MQTT​得到了谁的支持
​结构化信息标准促进组织OASIS在2013年就宣布将MQTT作为新兴的物联网消息传递协议的首选标准。同时,该标准出自IBM,一堆的盟友已经加入到支持的行列。下文中可以看到服务器侧的产品已经非常丰富,这些信息足以显示出其受欢迎的程度。
MQTT怎么玩​——服务器端
先来介绍一个“懒汉”方案。如果不想自己搭建服务器,可以采用Eclipse为了支持MQTT发展而设立的公共MQTT服务器:test.mosquitto.org。访问十分方便,对设计物联网应用很有帮助。
其他可以自己搭建的服务端,或者叫代理(Broker),有很多产品,参见下图。这些服务端有重有轻,有些是开源的,有些是企业的收费产品。
MQTT服务器/代理
下面这一节讲述了如何利用Mosquitto软件来构造MQTT通讯实验。内容参考了​CSDN上署名为xukai871105的博文《》。
Mosquitto是一款实现了
协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。​一个完整的MQTT示例包括一个代理器,一个发布者和一个订阅者。测试分为以下几个步骤:
【1】启动服务mosquitto。
【2】订阅者通过mosquitto_sub订阅指定主题的消息。
【3】发布者通过mosquitto_pub发布指定主题的消息。
【4】代理服务器把该主题的消息推送到订阅者。
MQTT原理与操作步骤
如果不想止步于简单的理解,而欲亲自实验全过程,可以通过阅读前文提到的原文链接进行实践操作。
MQTT怎么玩​——客户端
​Eclipse有一个开源项目叫Paho,实现MQTT协议客户端。已经实现多种语言的客户端封装,包括对嵌入式的支持,还有一些工具(utilities),以及完善的文档,所以只要按照其实例开发即可。
​网上有个非常不错的Demo——《》,使用的是Paho的MQTT库和Python语言。主要场景如下:“病人一旦启动血压测量,数据由主机的mqtt-paho客户端发布至test.mosquitto.org服务器。只要是订阅了相应病人血压主题的医生,都可以及时掌握病人的血压变化情况。例如,在自己的Android手机上像QQ、微信消息那样及时显示出病人当前的血压情况,甚至可以实现远程诊断。”作者用华科电子的HKB-08B血压模块做示例,该模块支持USB串口(cp2102),可以直接连接在树莓派上。原文附有完整的实例代码和环境说明。​
MQTT怎么玩——​云部署
上面介绍的服务器和客户端可以满足物联网极客开发的需要和企业中等规模部署的需求。如果要构建大型的、商用化的云部署方案,则还需要进一步考虑组网、设备管理、账号管理、数据分析等系统性问题。​
​AbleCloud宣称“作为国内首家智能硬件PaaS平台,提出了PaaS+MQTT方案,即使用MQTT作为设备接入协议,由PaaS平台提供服务的物联网整体解决方案。设备端使用MQTT客户端接入云平台,设备可以在特定的主题上发布消息,也可以通过订阅特定的主题以接收其他设备或者用户发布的消息,从而实现M2M,M2P,P2M的通信。”
AbleCloud的云架构
根据AbleCloud的介绍,上图中,“MQTT-SN 用于非IP
设备。云网关gateway负责设备的接入,协议适配,这样设备就可以和使用不同传输协议的设备或者终端进行通信,如果要支持海量设备的接入,gateway集群是必须的。设备管理负责设备接入认证,设备与用户绑定,操作授权等相关的功能。账号管理负责用户账号安全认证,授权认证等相关的功能,同时也支持第三方账号安全认证。云服务Cloud
Service负责设备业务逻辑。不同的设备厂商都有一套自己的业务逻辑和服务,这种服务可以很容易的运行在云端的docker容器中,使用基于容器的微服务使得应用程序能够更快地进行创建,并且更易于维护,同时又能够得到更高的质量。而数据的存储和分析使用云平台提供的通用的存储服务和大数据分析引擎。用户只要注册账号,绑定设备,就可以通过手机APP,微信或者web等客户端轻松实现与设备的交互。”
MQTT宁有种乎
​好了,说了一堆好话,也该说说缺点了。实际上也不能说是缺点,只能说每个协议都有适用的场景,而一些不适用的地方,这里要稍作提醒。
MQTT始终存在的连接,限制了设备进入休眠状态的整体时长。如果相关设备在运行中多数处于休眠状态,我们不妨优先选择另一种MQTT协议——MQTT-S,其利用UDP取代原始协议中的TCP。
MQTT缺少基础协议层面的加密机制。MQTT被设计为一种轻量化协议,而内置加密的方式会给传输连接增加很大负担。虽然我们也能够在应用程序层级添加定制化安全机制,但这可能需要进行大量的调整工作。​
MQTT官方首页:http://www.mqtt.org/​
协议文本:http://public./software/dw/webservices/ws-mqtt/mqtt-v3r1.html​
​客户端/代理/服务器开源代码:http://mqtt.org/software
MQTT协议及拓展​:http://blog.wuzx.me/archives/102
调试工具一枚:/archives/mqtt-debugger.html
物联网老范
博客等级:
博客积分:0
博客访问:6,456
关注人气:0
荣誉徽章:主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》研发主编,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:
翻译:安翔
审校:苏宓
当今世界有数十亿的智能设备,畅想一下,假如这些设备都相互连接并且能够像它的用户一样互相交流,同时形成一个全球化的网络,会是怎样的情形呢?这其实就是通常所说的物联网,或者叫 IoT。物联网已经彻底改变了 IT 世界以及我们的创新方式。在探索物联网的时候必须考虑它的性能和安全问题。消息队列遥测传输协议(MQTT)MQTT是TCP / IP协议之上的基于发布/订阅模式的机器到机器(M2M)通信的轻量级消息协议。该协议提供遥测技术,MQTT 开发人员正在努力连接不断壮大的互联网世界,预计将会产生更多样化的智能设备。 MQTT 协议的第一个版本由 IBM 的 Stanford-Clark 和 Arlen Nipper 撰写。选择 MQTT 的理由MQTT 已经用于 ,它可以在不消耗太多电量的情况下和服务器保持长连接;它仅仅需要很低的网络带宽,同时代码的占用的空间也很小;它通过广泛分布和有时间间歇的网络传输数据。这些特点使得 MQTT 应用在小内存、弱处理能力的远程设备上具有很大的优势。此外,MQTT 还有如下一些非常显著的特点:
开源、免费、易用
遵循一对多、发布/订阅模式
精简的消息头
提供多个不同质量、等级的服务
简单的消息指令
不强求传输数据的类型与格式,保持灵活性
消息可保留
干净的会话和持久的连接
MQTT 和 HTTP 的对比:
以数据为中心
以文档为中心
简单的命令
很小,2字节的紧凑二进制消息头
比较大,消息头是文本格式
具有3个 QoS 级别
只有一个消息服务等级
消息发布方式
MQTT 拓扑结构的一个例子:MQTT 消息类型为了更好地理解消息级别,我们先了解一下 MQTT 的消息类型。MQTT 具有14中消息类型:
客户端连接到MQTT代理
新发布消息
新发布消息确认,是QoS 1给PUBLISH消息的回复
QoS 2消息流的第一部分,表示消息发布已记录
QoS 2消息流的第二部分,表示消息发布已释放
QoS 2消息流的第三部分,表示消息发布完成
客户端订阅某个主题
对于SUBSCRIBE消息的确认
UNSUBSCRIBE
客户端终止订阅的消息
对于UNSUBSCRIBE消息的确认
DISCONNECT
客户端终止连接前优雅地通知MQTT代理
服务质量等级QoS 值决定了每个消息将如何传递,每个发送的消息都需要强制性设置 QoS 值。级别0(最多一个消息传递)当消息的 QoS 值设置为 0 时,不需要响应,并且不会定义重传机制。消息要么一次性成功到达 broker(MQTT 代理),要么就无法到达。如果客户端断开连接或服务器发生故障,则QoS 0消息将会丢失,MQTT 层不会尝试消息重传。从性能的角度来看,这是使用 MQTT 发送消息的最快方法。级别0中只使用 MQTT 命令 PUBLISH,其他命令均不会被使用。级别1(至少一个消息传递)MQTT 客户端或服务器将尝试至少传递一次消息,但可能存在重复的消息。当代理收到消息时,将发送确认指令 PUBACK。在没有收到 PUBACK 的情况下,发送方会再次使用 DUP(重复)发送消息。在接收到设置了 DUP 位的消息时,代理将向所有订阅者重新发布消息,并再次发送确认指令 PUBACK 给发送方。级别1的通信机制通过 MQTT 消息持久化来实现。发生 PUBLISH 时,消息将存储在持久化层(比如磁盘)中,并在接收到 PUBACK 时将其删除。QoS 1 的消息在消息头中具有消息 ID 。级别2(正好一个消息传递)在 QoS 1 的基础上通过额外的控制流确保消息正好传递一次,不会重复。消息在PUBLISH 流中发送,由客户端存储在持久层中。作为对 PUBLISH 的响应会发送 PUBREC 消息。同时,消息被锁定在服务器上。在接收到 PUBREC 时,将 PUBREL 发送到服务器。接收到 PUBREL 时,代理发送消息,返回 PUBCOMP 并丢弃存储状态。QoS 2 的消息在消息头中具有消息 ID。MQTT 的安全性MQTT 旨在为为物联网提供轻量级的通信,但是安全性是以增加处理器使用率和通信开销为代价的。这是为什么在协议中只有少数几个安全机制的原因。但是许多 MQTT的实现都使用了SSL / TLS等安全标准。MQTT 中的安全性分为多个层级:网络层:使用物理安全网络或 VPN 为通信提供安全连接。传输层:使用 TLS / SSL 进行传输加密,确保通信加密、身份验证。应用层:该协议具有客户端ID,用户名/密码凭证提供设备认证。另一种方式是在没有广泛传输加密的情况下进行有效负载加密。MQTT 实践 - 家庭监控家庭监控系统是基于 MQTT 的应用程序的典型示例。例如,室内加热器的当前温度可根据要求发送到设备。像任何其他应用程序一样,当涉及到两个应用程序或者设备之间的通信时,就会有通信失败的可能,监视应用程序以确保应用程序的有效运行和良好的用户体验显得非常重要。Catchpoint 目前可以使用 MQTT 协议监视 IoT 设备的性能和可用性。MQTT 测试可用于通过发布和订阅指定主题的消息的方式来使用MQTT的发布/订阅模式,并且可以测量通信时间。.NET实现模拟MQTT通信(业务逻辑以及关键实现) - CSDN博客
.NET实现模拟MQTT通信(业务逻辑以及关键实现)
许久不更新了,最近这段时间发生挺多事,说破了也就应届生那点破事,什么技术方向,等待offer,签约毁约的。最终还是老老实实回到公司继续实习,为了以后再拼搏一次吧。
最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽。MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备。
长话短说,作为一名兢兢业业的实习生一直在为组里的大拿们提供各种服务,我们组的业务是围绕一个以MQTT协议进行Community Server 与Box的通信实现的,为了辅助我们团队在实体盒子数量有限或者环境受限制的情况下任然能进行各种消息的测试工作或者更新工作,我也就结合我们的业务用.net开发了一个基于MQTT通信的模拟工具。
一. 配置MQTT信息
MQTT的官网:。其中里面提供了官方推荐的各种服务器和客户端使用的各种语言版本的API。
在VS工程中将MQTT相关类库导入后,根据官网的说明做好相关配置。注意的是有一些参数要根据自己的业务来配置。
例如这些:
private static int maxRetryC
private static ushort sessionS
private static int retryC
private static int
private static int
private static string MqttS
private static int MqttP
private static string MqttUserN
private static string MqttP
private static string MqttClientI
private static ushort MqttKeepAliveP
private static string DefaultBoxI
private static string VersionN
private static MqttC
private static bool IsMQTTC
**需要注意的是:**
想要实现不同程序端的通信,MqttClientId 在不同的程序端注册连接的时候必须取不同的值,不然即便是不同的程序端在MQTT里代表的也是相同的云端或者相同的盒子,则不能实现相互通信。
二. 连接到MQTT
if (client == null) client = new MqttClient(MqttServer, MqttPort, false, null);
if (!IsMQTTConnected)
IsMQTTConnected = Connect();
RegisterEvents();
这里要注意的是:
RegisterEvents()即为注册的过程,然而在注册的时候会默认订阅所有消息,这就导致在后面要实现“订阅/发送”功能的时候会出现信息不对称的情况,即无论是否进行订阅操作只要MQTT收到任何消息发送请求,那么都会收到消息并作出反应,这样对于我要实现的一对一订阅/发送的目的造成了很大影响。
解决的办法是在各个项目订阅的同时标记上相关的全局变量,只有在Client_MqttMsgPublishReceived方法里检测到对应的全局变量才会对发送的消息进行反应。
连接函数connect()的核心代码:
client.Connect(clientId, user, password, false, keepAlivePeriod);
三. 订阅/发送
client.Subscribe(new string[] { selTopic }, new byte[] { 1 });
其中selTopic是根据业务定制的订阅主题,是MQTT消息结构一个很重要的部分。
client.Publish(topic, payload, MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false);
四.事件相应的类库
public class MqttMsgPublishEventArgs : EventArgs
public MqttMsgPublishEventArgs(string topic, byte[] message, bool dupFlag, byte qosLevel, bool retain);
public bool DupFlag { get; set; }
public byte[] Message { get; }
public byte QosLevel { get; }
public bool Retain { get; }
public string Topic { get; }
我们一般根据自己的Topic和Message来对业务消息进行响应。即,MQTT只要收到消息,我们就可以获取以上结构里的消息信息。在代码的`private void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)函数中编写相应的响应代码即可。
要做好一个MQTT的通信过程除了对整个通信流程有所了解,一定要清楚消息结构各个变量代表的含义,加以运用。
本文已收录于以下专栏:
相关文章推荐
本篇是介绍我们完成数据库接口层和业务逻辑层的接口的设计和实现。
废话不多讲,还是怎么一步一步做。
第一步:设计IDao层。在MyWeb.WebTemp.IDao项目中添加IUserDao接口。代码...
今天要给大家分享的就是这么一个业务逻辑:
我创建一个课程体系的时候就关联了好几个课程,现在我需要在前端页面显示我所关联的课程并进行修改和保存。页面如下:
思路就是我利用控制器返回数的数组格式:
基于Android的小巫新闻客户端开发--主界面业务逻辑实现
 上一篇介绍了主界面的UI设计,现在直接进入主题,业务逻辑的实现,由于项目的开发总是在不断的完善的,最初实现的效果,总会随项目的进度而做...
五、业务逻辑的实现:数据如何处理
重点是数据如何处理:Riak Core提供了一个统一的接口以控制分布在ring上的数据的计算(操作)。
Riak Core的数据控制接口
如前所述,...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)如何利用TLINK-MQTT云平台实现设备间的通信
www.tlink.io 物联网
来源:TLINK物联网
TLINK是一个开放的并且专注于物联网服务的物联网接入平台,目的是为了服务所有的工业、农业、环境类传感器使用者,使传感器数据的接入、存储和展现变得轻松简单。
TLINK云平台可以接入多种无线网关设备,包括采用TCP协议的DTU,采用MQTT协议的网关,以及采用ModbusTCP的RTU。下面介绍利用HL-GPRS-MQTT网关实现设备间点对点通信的实现过程。
HL-GPRS-MQTT&是北京浩联迅通科技有限公司研发生产的MQTT通信网关设备,它基于GPRS无线传输技术,完全符合MQTT3.1.1协议。通过MQTT的消息发布和订阅机制可轻松实现设备与设备间的通讯,成为实现物联网互联互通的利器。
图1&设备点对点通信
MQTT是IBM为物联网设计的消息传递技术,旨在为低带宽、不稳定网络环境中的物联网提供可靠的网络服务。目前已经被国际标准化组织采用,成为物联网行业的一个标准。相比采用TCP转发方式,MQTT&协议无疑更适合用于设备间的通信。
二、 TLINK云平台
本应用基于TLINK平台的MQTT接入,首先登录平台网址www.tlink.io,点击注册账号,根据提示完成账号注册。
接下来,添加两个设备,协议类型选择”MQTT”,如下图所示:
图2&添加设备
图3 &所有设备
点“设置连接”查看设备的序列号:
图4 &设备1序列号
图5 &设备2序列号
三、 HL-GPRS-MQTT网关
网关模块在使用前需要进行参数配置,配置过程如下:
l&根据不同的接口,选择采用USB转RS232或USB转RS485和电脑连接。
l&运行配置软件后,选择串口,然后点击“连接模块”,即可对网关模块进行配置:
图6&模块配置
配置说明:
l&工作串口:波特率、、3、115200;数据位5、6、7、8;停止位1、2;校验位ODD、EVEN、NO
l&服务地址:服务器地址
l&服务端口:服务器端口
l&用户名:连接服务器需要的用户名
l&密&码:连接服务器需要的密码
l&设备ID:设备的序列号
l&订阅主题:另一台设备的序列号
l&发布主题:设备的序列号
l&心跳间隔:keep Alive&连接保持时长,单位为秒
四、 通信测试
连接实际设备前,可以先用串口调试助手观察通信过程。网关的串口分别连接不同的串口调试程序,两边互相收发数据的过程如下:
图7 &设备1收发数据
图8 &设备2收发数据
l&设备1发送“abcdefg” 给设备2;
l&设备2发送“123456” 给设备1;
l&在串口调试工具的数据窗口中,可以观察到数据完全透明传输的过程
现在,接入实际设备,就可以进行两个设备的远程通信了。通过 WebSphere MQ 遥测传输 (MQTT) 将 Android 手机引入物联网
MQTT 简介以及适用场景用IBM® WebSphere® MQ Telemetry Transport(简称 MQTT)是一种基于 TCP/IP 的轻量级发布 / 预订协议,用于连接大量的远程传感器和控制设备。在必须允许低带宽和不可靠的通信并且占用较少内存的设备上,专业化的应用程序就使用 MQTT 协议。用户可以编写自己的客户机以使用已发布的协议。MQTT 产品作为 WebSphere MQ 产品的扩展,使用了 MQTT V3.1 版本的协议。它提供了一些小型客户机库,可以将这些客户机库嵌入到运行于不同设备平台上的智能设备中。使用客户机构建的应用程序使用 MQ Telemetry Transport(MQTT) 和 WebSphere MQ Telemetry 服务并借助 WebSphere MQ 来可靠地发布和预订消息。一个高级 MQTT 客户机(即设备的 WebSphere MQ Telemetry 守护程序)可以运行于多种平台上。它可以充当一个网络集中器,能够将更多的 MQTT 客户机连接至单个队列管理器。对于在网络发生短暂中断期间无法缓存消息的小型设备,它还可以为这些小型设备提供存储转发功能。物联网,即 Internet-of-Things, 简称 IOT。它和能源、电子信息、医疗、交通、零售、物流、工业制造等行业息息相关。要实现物联网,首先需要将具备信息感知和通信能力的设备嵌入到我们关心的物品中,使其能连接到因特网或企业网络之上,实现互联互通。之后,互通的物品不仅要通过设备采集信息、实现智能的感知,更要结合一切先进的信息处理、数据挖掘等手段,与业务应用相结合,从后台到前端设备,实现智能的控制。MQTT 结合物联网应用,它可以将各种移动设备连接至因特网和企业,降低了为智能设备构建应用程序的成本,从而为物联网应用构建连通的平台。Android 开发方法简介Android 是一个基于 Linux 平台的开源手机操作系统,它包括操作系统、用户界面中间件和一些重要的应用程序。Android SDK 为在 Android 平台上使用 Java 语言开发应用程序提供了工具和 API。本文将介绍如何在 Eclipse 中开发 Android 应用程序,为此我们需要安装 Android SDK 以及在 Eclipse 中开发 Android 项目的插件 ADT。本文使用 Android SDK 2.2 版本进行开发。场景开发MQTT 的安装WebSphere MQ Telemetry 运行时是 WebSphere MQ 队列管理器的扩展。在 Windows 平台上安装 MQ 以及 MQTT,首先需要确保您的用户必须是 Administrators 组的成员。在 Linux 系统上安装的话需要确保您的用户必须具有 root 权限。本文将以 Windows 平台为例进行介绍。首先参考 WebSphere MQ 产品的 InfoCenter,安装 MQ 运行时以及 MQ Explorer。之后安装 MQTT,MQTT 作为 MQ 的扩展,可以在 MQ 安装好后进行扩展安装。安装好 MQTT 后,通过开始菜单启动 WebSphere MQ 资源管理器,也可以使用 strmqcfg 命令来启动。在 WebSphere MQ 资源管理器的 Navigator 选项卡中,单击 Queue Managers & Queue Manager 名称 & Advanced & Telemetry,打开 Welcome to MQ Telemetry 面板,单击 Define sample configuration。图 1. “Welcome to MQ Telemetry”面板Define a sample configuration 窗口打开,它展示了将要对队列管理器进行的配置,我们可以浏览这些信息以查看具体需要哪些配置。查看后点击 Finish,MQTT 将会被自动配置。图 2. “Define a sample configuration”面板配置完成后,MQTT Client Utility 将被弹出,我们可以用这个工具进行测试,这个工具模拟了 MQTT 的客户端,可以用其测试连接刚刚配置好的 MQTT 服务器,以及尝试发布一些消息。图 3. “MQTT Client Utility”测试工具MQTT 服务器端的配置运行 MQ 安装目录 \mqxr\samples 目录下的 SampleMQM.bat 批处理文件即可完成对 MQTT 服务器端的配置,其中包括创建队列管理器、创建本地队列、开启监听服务等。清单 1. SampleMQM.bat 文件内容 crtmqm QM1
strmqm QM1
echo DEFINE QLOCAL('SYSTEM.MQTT.TRANSMIT.QUEUE') USAGE(XMITQ) MAXDEPTH(100000)
| runmqsc QM1
echo ALTER QMGR DEFXMITQ('SYSTEM.MQTT.TRANSMIT.QUEUE') | runmqsc QM1
// Allow guest to send messages to clients attached to the MQTT Listener.
setmqaut -m QM1 -t q -n SYSTEM.MQTT.TRANSMIT.QUEUE -p guest -all +put
// Allow guest to publish and subscribe on any topic.
setmqaut -m QM1 -t topic -n SYSTEM.BASE.TOPIC -p guest -all +pub +sub
// Install the service into the QMgr
type "%SAMPLESDIR%\installMQXRService_win.mqsc" | runmqsc QM1
// Start the service
echo START SERVICE(SYSTEM.MQXR.SERVICE) | runmqsc QM1
"%SAMPLESDIR%\..\bin\controlMQXRChannel.bat" -qmgr=QM1
-mode=newchannel -chlname=PlainText -port=1883 -mcauser=guest其中,crtmqm 和 strmqm 命令创建并开启了名为 QM1 的队列管理器。使用命令 runmqsc 可以进入 MQ 的脚本命令控制台 MQSC,在其中可以进行一些对 MQ 的配置,比如我们用 DEFINE QLOCAL 命令新建了一个传输队列用来进行消息的传输,并通过 ALTER QMGR 命令将其设置为缺省的传输队列。在这里,传输队列负责暂存 MQTT 服务器端与 MQTT 客户端(下面要介绍的 Android 手机)之间即将进行通信的消息。之后,使用了两条 setmqaut 语句为 MQTT 通信添加了一些必要的权限。然后通过 type installMQXRService_win.mqsc 以及 START SERVICE 两条语句向队列管理器 QM1 中安装并启动了 MQTT 服务。这样,我们当前的队列管理器 QM1 就可以支持 MQTT 扩展了。最后一条语句调用了 controlMQXRChannel.bat 批处理文件创建并开启了一个连接通道,这样客户端就可以通过 1883 端口连接到我们刚刚配置好的 MQTT 服务器了。至此,MQTT 服务器端的配置已经完成。但我们为了使其可以接收到某一个特定主题的消息,我们还必须加入对这个主题的定义。在控制台通过 runmqsc 命令进入 MQSC,在这里我们可以定义 MQ 的对象,如本地队列、主题等。清单 2. 添加 MQTTExamples 主题 DEFINE TOPIC('MQTTExamplesTopic') TOPICSTR('MQTT Example') REPLACE
DEFINE QLOCAL('MQTTExampleQueue') REPLACE
DEFINE SUB('MQTTExampleSub') DEST('MQTTExampleQueue') TOPICOBJ('MQTTExampleTopic')
REPLACE在这里我们定义了一个名为 MQTTExamplesTopic 的主题,它将接受所有主题字符串为“MQTT Example”字样的消息,并可以通过名为 MQTTExampleSub 的订阅(MQTT 中的一种订阅关系),将这些消息存储到名为 MQTTExampleQueue 的本地队列中。Android 开发环境配置本章将介绍如何使用 Android SDK 2.2 进行开发。首先,需要下载并安装 Java 的 JDK,本文的示例使用了 JDK 6 update 24 版本的 JDK。之后,下载并安装新版本的 Eclipse 开发工具,本文的示例使用了 Helios Service Release 2 版本的 Eclipse( 即 Eclipse 3.6.2)。然后下载并安装 Android 的 SDK,新版本的 Android SDK 需要由 Google 官方提供的 Android SDK Tools 进行统一的安装管理。从以下网址下载 Windows 平台的 Android SDK Tools 并安装:安装好后运行 Android SDK Tools 安装目录下的 SDK Manager.exe。图 4. Android SDK Tools 的安装目录SDK Manager 启动后,在其 Available Packages 选项卡中选择组件进行安装。图 5. 选择组件进行安装安装好的组件会被显示在 Installed packages 选项卡中。本文将使用 Android SDK 2.2 进行开发,因此请确保 2.2 版本的 SDK 安装妥当,2.2 版本的 SDK 对应的 API 版本是 API 8。之后,我们还需要为 Eclipse 安装开发 Android 项目的插件 ADT。在 Eclipse 中选择 Help-&Install New Software,在弹出窗口中点 Add 按钮添加 ADT 的安装网址:https://dl-/android/eclipse/图 6. 安装 ADT选择所有包,点 Next,安装向导会自动下载并安装这些组件。Eclipse 重启后,选择 Windows-&Preferences-&Android,在 SDK Location 中选择 Android SDK 的路径,点 Apply。图 7. 选择 Android SDK 路径在这里,我们可以通过查看 Build、DDMS、Editors 等子选项浏览 Android SDK 的属性。对于本文的示例,保留默认值即可。最后,我们需要添加一个模拟器设备以便于调试。在 Eclipse 中选择 Windows-&Android SDK and AVD Manager,在 Virtual devices 中通过 New 按钮添加一个 Android 2.2 设备,在这里我们还可以选择设备的屏幕尺寸、内存大小等参数。图 8. 添加一个模拟器设备场景开发:Android 客户端向 MQ 服务器发送消息在 Eclipse 中新建一个 Android Project,如下图所示填写项目名称、默认的 Activity 名称和 package 名等信息。另外请注意,在这里选择使用版本为 2.2 的 Android SDK。图 9. 新建 Android Project点 Finish 键完成新项目的创建,Eclipse 帮我们生成了如下结构的项目。图 10. Android Project 的项目结构我们来介绍一下生成的文件:HelloWorld.java – Android 项目的默认 Activity 类,继承自 android.app.Activity,整个程序的起点就是这个类里面的 onCreate() 方法。R.java – Android 系统需要的资源文件,在 Eclipse 中会自动生成及更新,无需手动修改。里面存储了图片、布局、界面元素、字符串等资源的索引。三个 drawable 文件夹及 icon.png 文件 – Android 应用程序的图标,针对目标设备的不同分辨率,最终将会有一个被采用。layout 文件夹及 main.xml 文件 – Android 程序的界面布局。values 文件夹及 strings.xml – 用来存储文本信息的资源文件。AndroidManifest.xml – 记录和 Android 程序相关的配置信息,是一个非常重要的文件,比如我们后面将要介绍的授予应用程序访问网络的权限,就是在这个文件中修改的。项目生成后,我们首先需要添加 MQTT 的客户端 API 包。在 MQ 安装目录 \mqxr\lib 目录下找到名为 com.ibm.micro.client.mqttv3.jar 的 jar 包,将其复制到 Android 项目下的 assets 目录中,并在项目属性中的 Java Build Path-&Libraries 中通过 Add Jar 添加这个 jar 包,这样我们就可以在这个 Android 项目中使用 MQTT 的客户端 API 了。现在,我们就可以进行 MQTT 客户端程序的编写了。MQTT 的 InfoCenter 上有一些简单的示例程序可以参考,在此我们将程序简化以便于理解。新建一个名为 PubSync 的类。清单 3. PubSync.java 的内容 package com.ibm.websphere.
import com.ibm.micro.client.mqttv3.*;
public class PubSync {
public String doTest(){
MqttClient client = new MqttClient("tcp://9.119.154.32:1883","java_client", null);
MqttTopic topic = client.getTopic("MQTT Example");
MqttMessage message = new MqttMessage("Hello World. Hello IBM".getBytes());
message.setQos(1);
client.connect();
MqttDeliveryToken token = topic.publish(message);
while (!token.isComplete()){
token.waitForCompletion(1000);
client.disconnect();
} catch (Exception e) {
e.printStackTrace();
return "failed";
return "success";
}在上面的程序代码中,我们首先创建了一个 MqttClient 对象 client 用于连接到远程的 MQTT 服务器,在这里我们的 MQTT 服务器位于 IP 为 9.119.154.32 的机器上,正如我们之前配置的那样,MQTT 服务器的监听端口为 1883。"java_client"用来标识客户端名称。之后我们创建了一个名为"MQTT Example"的主题,对象名为 topic。还记得我们在 MQTT 服务器端的配置章节中定义的 MQTTExampleTopic 吗?它的主题字符串同样为"MQTT Example",这样可以保证我们现在创建的主题消息可以被服务器正确地订阅并接收。并且根据服务器端的配置,将接收到的消息存储在对应的本地队列中(MQTTExampleQueue)。接下来我们又创建了一条消息,并将消息的服务质量级别 (QoS) 设置为 1。消息内容为我们将向服务器发送的一条文本信息。服务质量 (QoS) 确定消息在 MQTT 客户机与队列管理器之间传递时的可靠程度,MQTT 客户机提供了三种服务质量:至多一次(QoS=0)、至少一次 (QoS=1,默认值)和刚好一次 (QoS=2)。三种 QoS 的区别请参考 MQTT 的 InfoCenter,在此我们使用默认的 1,以避免出现网络权限或文件读写权限不足等问题引发的异常。然后我们调用了 client 对象的 connect() 方法进行真正的网络连接,并调用 topic 对象的 publish() 方法将我们定义好文本内容的消息发送给订阅者,也就是服务器端。通过查询 publish() 方法返回的 MqttDeliveryToken 类型的对象 token,我们即可得知操作是否顺利完成。最后,当得知操作完成后,不要忘记关闭网络连接释放资源:client.disconnect()。至此,MQTT 的客户端程序就完成了,我们注意到上述程序并没有用到 Android 的 API,所以这段程序理论上可以在任何 Java 客户端执行,为了调试的方便我们可以在开发这段代码的机器上使其调试通过。现在,我们使用一种最简单的办法使这段程序能被 Android 应用调用到。在 HelloWorld.java 的 onCreate() 方法的最后,加入以下几行代码:清单 4. onCreate() 方法中添加的代码 String strResult = PubSync.doTest();
TextView tv = new TextView(this);
tv.setText(strResult);
setContentView(tv);我们在这里直接调用了用于向 MQTT 服务器发布消息的 doTest() 方法,并将返回结果显示在一个界面控件文本框中。Android 应用程序打包部署及测试由于本程序需要联网才可以运行,因此我们需要授予该程序网络访问的权限。在 Android 程序中修改 AndroidManifest.xml 文件来进行权限的修改。在 Eclipse 中打开该文件,在 Permissions 选项卡中列出了该程序的所有权限,Android 程序默认没有任何权限。通过 Add 按钮我们添加下图中的几种权限,以使应用程序可以访问网络。图 11. 添加权限这些权限的修改都会被写入到 AndroidManifest.xml 文件中,随程序一起部署到 Android 设备里。Android 程序对于权限的要求十分严谨,如网络操作、文件操作、对手机硬件的操作等都需要特殊的权限,因此在开发 Android 程序的时候一定要注意手否授予了适当的权限,否则调试起来会很麻烦。设置完权限后,我们可以调用之前配置好的模拟器设备进行调试。选中 Activity 类,即 HelloWorld.java,点运行,选择运行为 Android Application。等待一段时间后,模拟器设备将会被启动,Eclipse 会将我们的项目打包部署在这个模拟器设备中并运行它。此过程可能等待的时间较长。图 12. 模拟器中的运行结果从运行结果中我们看到,有一条文本信息显示操作成功,这就是我们添加的唯一界面控件—— TextView。调试完成后,我们就可以将程序打包部署了。在 Eclipse 中右键单击项目,点 Export。在这里我们看到已经可以将项目导出为 Android 的应用程序了。图 13. 导出项目选择好项目之后,在 Keystore selection 窗口选择 keystore 文件或生成新的 keystore 文件,并输入密码。这里的 keystore 是作为将来把应用程序发布到 Google Android 市场时的唯一标识的。图 14. 选择 keystore在最后的窗口选择一个目标 APK 文件生成。将这个 APK 文件复制到 Android 手机,运行它即可安装。请注意由于我们开发的是基于 Android SDK 2.2 的应用程序,因此请确保手机支持 Android 2.2 版本。首先将手机连入局域网,我们采用 wifi 连接的方式,将手机连入和 MQTT 位于同一局域网的路由器。由于我们的程序没有做任何错误处理,因此请务必确保手机和 MQTT 服务器之间的网络畅通。然后在手机上运行这个程序,我们得到了同模拟器一致的结果。图 15. 运行结果同时,在 MQTT 服务器端看到收到了一条消息。Current queue depth 为 1,说明 MQTTExampleQueue 中有一条未读消息。图 16. MQ Explorer使用工具 RFHUtil 可以查看收到的消息的内容。图 17. RFHUtil 查看消息内容除了 RFHUtil 工具以外,也可以使用 MQ 自带的查看队列内容的工具 amqsget 查看队列内容,amqsget 为 C 语言编写,随 MQ 一起部署,直接在命令行模式下就可以运行。运行结果如下。清单 5. amqsget 运行结果 C:\&amqsget MQTTExampleQueue QM1
Sample AMQSGET0 start
MQGET ended with reason code 2110
message &Hello World. Hello IBM&
no more messages
Sample AMQSGET0 end另外,一旦某条消息被 RFHUtil 或 amqsget 读走,它将从队列中被删除,同时队列的 current queue depth 将减 1。场景开发:Android 监听并接收外界发来的消息我们刚刚完成了 Android 手机设备向 MQTT 服务器发送消息的程序,现在我们来实现 Android 手机设备监听某一特定主题,并获取这个主题的消息的程序。首先我们实现了一个名为 Subscribe 的类。清单 6. Subscribe.java 的内容 package com.ibm.websphere.
import android.os.H
import com.ibm.micro.client.mqttv3.MqttC
import com.ibm.micro.client.mqttv3.MqttConnectO
public class Subscribe {
public static String doTest(Handler handler) {
MqttClient client = new MqttClient("tcp://9.119.154.32:1883", "java_client", null);
CallBack callback = new CallBack("java_client", handler);
client.setCallback(callback);
MqttConnectOptions conOptions = new MqttConnectOptions();
conOptions.setCleanSession(false);
client.connect(conOptions);
client.subscribe("MQTT Example", 1);
Thread.sleep(10000);
client.disconnect();
} catch (Exception e) {
e.printStackTrace();
return "failed";
return "success";
}和 PubSync 一样,我们创建了一个 MqttClient 对象 client 用于连接到远程的 MQTT 服务器。然后我们构造了一个 CallBack 对象用来接收消息。在构建这个 CallBack 对象的时候我们传入了一个 Handler 对象用于更新主界面 UI ——将消息内容显示在主界面上。这个 Handler 对象是由 Activity 类(即 Helloworld 类)生成的,由于 Android 程序不可以在子线程更新 Activity 线程创建的界面控件,因此我们采用 Handler 的机制,由子线程(即 Callback 线程)向 Activity 线程发送 UI 更新的消息,并最后由 Activity 完成 UI 更新。之后我们通过调用 client 对象的 subscribe() 方法使其订阅主题字符串为"QTT Example"的消息。为了便于演示,本示例程序将等待 10 秒钟 (10000 毫秒 ),我们将在这段时间内在 MQTT 服务器端发送若干条消息。在这 10 秒内,CallBack 线程会持续监听主题字符串为"MQTT Example"的消息,如果有这样的消息,它将通知主线程(Activity 类 HellowWorld 所运行的线程)在界面显示这些消息。您也可以修改您的程序以使这个时间更长。现在让我们来看看 Callback 类的内容。清单 7. Callback.java 的内容 package com.ibm.websphere.
import android.os.*;
import com.ibm.micro.client.mqttv3.*;
public class CallBack implements MqttCallback {
private String instanceData = "";
public CallBack(String instance, Handler handler) {
instanceData =
this.handler =
public void messageArrived(MqttTopic topic, MqttMessage message) {
Message msg = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("content", message.toString());
msg.setData(bundle);
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
public void connectionLost(Throwable cause) {}
public void deliveryComplete(MqttDeliveryToken token) {}
}Callback 类继承自 MqttCallback,需要实现 messageArrived()、connectionLost() 和 deliveryComplete() 三个方法以响应不同的事件。messageArrived() 方法负责响应收到消息后的事件,在本示例中我们只用到了这个方法。我们将消息的内容放到一个 Bundle 对象中并由它构建了一个 Message 对象,最后把这个包含了消息内容的 Message 对象通过 Handler 发送给主线程 HellowWorld,委托其将消息内容更新到主界面 UI。最后我们再来看一下修改后的主线程 HellowWorld 类。清单 8. 的内容 package com.ibm.websphere.
import android.app.A
import android.widget.TextV
import android.os.*;
public class HelloWorld extends Activity {
private TextV
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = new TextView(this);
String strResult = Subscribe.doTest(mHandler);
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
String strContent = tv.getText().toString();
strContent += "\n" + msg.getData().getString("content");
tv.setText(strContent);
setContentView(tv);
}在这里我们新建了一个内部类对象 mHandler,它的 handleMessage() 方法接收 Callback 类通过 mHandler 对象发来的消息。根据前文的介绍可知,mHandler 对象包含了 MQ 消息的内容。handleMessage() 方法将这些 MQ 消息的内容更新在 UI 控件 TextView 中,这样用户就可以在程序的界面看到 MQTT 服务器端发送过来的消息内容了。按照前文的介绍,在模拟器中安装并运行程序。我们可以事先在 MQTT 服务器端发送出几条主题字符串为"MQTT Example"的消息,或者在程序运行中等待的 10 秒内发出这样的消息。在 MQ Explorer 中选中 MQTTExampleTopic,点右键选中 Test Publication。图 18. Test Publication输入测试消息并点 Publish message 发送。在这里我们可以发送多条消息。图 19. 发送测试消息019.jpg程序的运行结果如下,收到了三条消息,并显示出消息内容。图 20. 运行结果显示收到的消息程序改进及未尽事宜Android 开发的一大优势是 SDK 中已经预先定义了非常多的界面 UI 控件,我们可以非常方便地为程序添加 UI 效果。比如我们为 PubSync 程序添加一个界面,使其可以接收来自于用户输入的参数,从而避免了将 MQTT 服务器的连接信息及消息内容写死在程序里面。打开 layout 目录下的 main.xml 文件,Eclipse 会默认将其打开为界面元素,通过拖拽左边的控件,我们可以快速地构建一个界面。图 21. 为 Android 程序添加界面我们在界面上加入了一些文本框供用户输入数据,并且添加了一个按钮。一旦点击这个按钮,程序将执行一个定义好的方法进行后续的操作。为此,我们需要在 onCreate() 方法中为这个按钮添加一个单击事件的响应函数。清单 9. 修改后的 onCreate() 方法 public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnSend = (Button) findViewById(R.id.btnSend);
btnSend.setOnClickListener(listener_Button_Start);
}之后我们要实现这个响应函数。首先通过 readConfiguration() 方法读入界面参数,这个方法是我们自己实现的内部方法,通过界面控件的 id 定位到控件对象并读取用户输入的数据。然后调用 PubSync 的 doTest() 方法执行发送消息的操作,在这里我们已经对 doTest() 方法进行了改造,它不再通过写死的参数连接 MQTT 服务器,而是通过 readConfiguration() 方法从界面获得这些信息。最后将执行结果显示在名为 txtResult 的 TextView 界面控件中。清单 10. Send 按钮的单击事件响应函数 private OnClickListener listener_Button_Start = new OnClickListener() {
public void onClick(View v) {
MyProperties myProperties = readConfiguration();
String result = PubSync.doTest(myProperties);
TextView tvResult = (TextView) findViewById(R.id.txtResult);
tvResult.setText(result);
};这样,我们的程序就变得比较美观了,用户在执行该程序的时候可以选择连接到某一台 MQTT 服务器,而且可以自定义消息的内容。当然,该程序还是相当不完善的,我们还没有为其加入任何容错处理、网络控制、移动设备的电源控制等功能。尤其是没有网络控制功能,使程序的适用性很小,如果在执行改程序前手机并没有通过 wifi 网络连接到 MQTT 服务器所在的网络,则程序将出错。一个比较好的解决方案是程序在被执行时自动判断设备的网络状态,如果没有网络连接,则程序自动尝试连接到网络。读者如果有兴趣,可以自行参考 Android 的开发文档设计这些内容使程序更加健壮。
参考 developerWorks 文章 ,查看详细的 Android 开发介绍。
参考 ,下载 Android SDK 以及查看 API 和技术文章。
参考 ,查看 MQ 以及 MQTT 相关介绍和示例程序。
参考 ,查看有关 MQ 的 developerWorks 文章。
参考 developerWorks 资源 ,查看 Android 开发的技术文章。:为使用 WebSphere 产品的开发人员准备的技术信息和资料。这里提供产品下载、how-to 信息、支持资源以及免费技术库,包含 2000 多份技术文章、教程、最佳实践、IBM Redbook 和在线产品手册。:下载关键 WebSphere 产品的免费试用版。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=WebSphereArticleID=760918ArticleTitle=通过 WebSphere MQ 遥测传输 (MQTT) 将 Android 手机引入物联网publish-date=}

我要回帖

更多关于 js实现mqtt通信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信