初次听说MQTT还是在学习Android消息推送的时候,只是粗浅的了解,未曾深究。最近专注于IOT开发,在信息传递方面自然就想到了它。
相关资料:
MQ 遥测传输 (MQTT) V3.1 协议规范:http://www.ibm.com/developerworks/cn/webservices/ws-mqtt/index.html
开源的mosquitto项目地址:http://mosquitto.org/
MQTT client for Node.js: https://github.com/mqttjs/MQTT.js
MQTT broker for Node.js: https://github.com/mcollina/mosca
以下内容来自于http://mosquitto.org/man/mqtt-7.html 算是对MQTT协议的一个简短的介绍。
MQTT是一个轻量级的发布/订阅消息协议。对低功率传感很有用,并且已经应用到了很多领域。
MQTT协议基于发布消息和订阅主题的原则,多个客户端连接到一个代理器上并且订阅他们感兴趣的主题,一个客户端连接到代理器上并且在一个主题上发布消息,其他的客户端可以订阅相同的主题并且接收到他们请求的信息。MQTT代理器充当了一个简单的共同的接口供其他设备去连接。也就是说,你可以用一个Client dump订阅的消息到数据库、Twitter或者其他简单的文本文件中,那么增加一个新的传感器或者其他数据到数据库、Twitter等就变得非常简单。
MQTT中,消息根据主题来发送,这不需要你配置一个主题,只需要发布他就够了。主题是由斜杠(/)来划分层次。这就容许来明智的安排创建共同的主题,就跟文件系统一样。例如,各种的Computers会发布他们的硬件驱动的温度信息在如下的主题上,他们Compuer和硬件的名字被适当的替换。
sensors/COMPUTER_NAME/temperature/HARDDRIVE_NAME
客户端可以通过创建一个订阅来接收消息。订阅必须要指明主题,并且只能接收到指定主题的消息,或者可以在主题中使用通配符,MQTT容许 + 和 # 两个通配符。
作为一层的通配符。它可以如下面操作来订阅上文中提到的所有Computers和Hardware Driver的信息
+ sensors/+/temperature/+
另外,如主题”a/b/c/d”,以下给出的订阅是符合的:
+ a/b/c/d
+ +/b/c/d
+ a/+/c/d
+ a/+/+/d
+ +/+/+/+
以下的示例是不符合的:
+ a/b/c
+ b/+/c/d
+ +/+/+
#可以作为所有剩下的层的通配符。这意味着它必须在主题的最后一个字符。对于”a/b/c/d”主题,以下的示例订阅是符合的:
a/b/c/d
+ #
+ a/#
+ a/b/#
+ a/b/c/#
+ +/b/c/#
零长度的主题层是有效的,但是会导致一些不明显的行为。例如,主题”a//topic”会被匹配到一个相反的”a/+/topic”主题上。零长度的主题层可以存在在一个主题字符串的开头和结尾,所以, “/a/topic”会匹配到”+/a/topic”、”#”或者”/#”主题;”a/topic/”主题会匹配到其他相反的”a/topic/+” or “a/topic/#”主题。
MQTT定义了3个服务质量(QoS)等级。QoS等级决定了代理器/客户端确保信息能够收到的努力程度。信息可以在任何QoS等级上发送,客户端也可以在任何QoS等级上订阅主题 。这就意味着 This means that the client chooses the maximum QoS it will receive。例如:一条消息被发布到QoS 2,一个客户端用QoS 0订阅,这条消息会用QoS 0传递到客户端,如果第二个客户端用QoS 2订阅了相同的主题,那么他会接收到相同的消息通过QoS 2。另外一个例子,如果一个客户端用QoS 2订阅主题,消息是通过QoS 0发布,客户端会接受消息在QoS 0.
高等级的QoS更加可靠,但是会有更高的延迟并且对带宽要求更高。
+ 0: The broker/client will deliver the message once, with no confirmation.
+ 1: The broker/client will deliver the message at least once, with confirmation required.
+ 2: The broker/client will deliver the message exactly once by using a four step handshake.
Retained Messages
所有的消息都会被保留。就是说代理器会甚至在发送消息到所有当前订阅者后还会保存消息。如果一个新的订阅和保留的消息主题匹配,然后消息会被送到客户端。如果一个主题经常更新,没有保留消息,一个新的订阅客户端可能必须要等等待很长时间去接收一条更新。使用保留消息,客户端会接收到即时更新。
在连接的时候,一个客户端设置”clean session”标记,它有时候也被叫做”clean start”标记。如果”clean session”设置为false,然后连接会被持久的对待,意思是说当客户端断开连接,任何订阅了它的会保持连接,并且随后的QoS 1 或者2消息会被存储,直到它在将来再次连接。如果Clean session 是true,那么在断开连接后,所有的订阅会被删除。
当一个Client连接到Broker,他会通知Broker它有一个Will。这是它希望在Client意外断开连接后Broker发送的消息。该Will信息有一个topic,QoS和保持状态,就和其他消息一样。
通过在网络上搜索,使用的最多的是mosquitto这个开源项目。
简单的了解后,在http://mosquitto.org/download/ 下载mosquitto-1.3.5
make sudo make install
在运行mosquitto_pub的时候会提示
mosquitto_pub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
解决:sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
或者通过环境变量 LD_LIBRARY_PATH 指定动态库搜索路径。
OK,现在可以测试mosquitto了按照官方给的实例运行最简单的测试,打开三个终端,第一个用来开启代理服务
$ mosquitto
第二个用来订阅
$ mosquitto_sub -t sensors/temperature -q 1
第三个用来发布
$ mosquitto_pub -t sensors/temperature -m 32 -q 1
OK,可以在订阅的终端看到发送的32。
PS:IBM的云平台Bluemix最近正在做市场推广,注册即有30天试用期(虽然我没用),如果自己又会那么一点点web开发,不妨去玩玩,反正又不要钱。
原文地址:http://blog.csdn.net/yixuaning/article/details/46050641