简介
这里都是比较官方的解释了,大概理解就可以了。
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
相关角色说明
这里介绍下mqtt中三个比较重要的角色
- 消息代理服务器:类似消息中转站。
- 订阅者:向消息代理服务器订阅自己需要的主题,当代理服务器收到该主题消息时,会将该消息推送给自己。
- 发布者:向代理服务器(mosquitto)发送指定主题的消息。
消息传输大概过程
上面说了mqtt是一个轻量级的消息通讯协议,那么消息的传输过程大概是什么样的呢?首先需要启动消息代理服务器,然后订阅者向消息代理服务器订阅指定主题的消息。当发布者将相关主题的消息发送到消息代理服务器,消息代理服务器将该消息推送给订阅了该主题的订阅者。大概过程就是这样,下面有使用过程和示例代码帮助理解其过程。
安装相关的库
开始使用之前,需要安装两个相关库
mosquitto:消息代理服务器,可以使用yum安装
yum install -y mosquitto
paho-mqtt:使用mqtt协议的python包,可以使用pip安装
pip install paho-mqtt
使用
为了方便测试,示例代码都是使用python写的。在我本地使用单机测试的,订阅者和发布者都跑在本机。实际使用中订阅者和发布者可以分别跑在自己的服务器上的。
第一步,启动消息代理服务器
/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
第二步,订阅者向消息代理服务器订阅指定主题
运行订阅者程序,向消息代理服务器订阅自己关心的主题消息
python client.py <指定的主题> # 比如python client.py hello就表示订阅了主题为hello的消息
client.py代码如下所示:
# coding=utf-8
import paho.mqtt.client as mqtt
import json
import sys
SUBJECT = '' # 要订阅的主题
def usage():
print "usage: python client.py <subject>"
print " subject: subscribe subject."
sys.exit(1)
def on_connect(client, userdata, flags, rc):
"""
向消息服务器订阅指定的主题
"""
client.subscribe(SUBJECT)
def on_message(client, userdata, msg):
topic = msg.topic
datas = json.loads(msg.payload)
# datas就是发布者发布的消息数据,具体消息内容是由发布者指定的
# 这里收到消息之后可以根据自己的业务进行消息处理
if __name__ == '__main__':
args = sys.argv
if len(args) != 2:
usage()
SUBJECT = args[1]
client = mqtt.Client()
client.on_connect = on_connect # 连接消息服务器成功之后回调on_connect函数
client.on_message = on_message # 收到消息服务器的消息之后回调on_message函数
try:
# 因为我的消息代理服务器跑在本机,所以这里连接消息代理服务器的IP使用的是127.0.0.1,可以根据实际的消息代理服务器IP地址填写
client.connect('127.0.0.1', port=1883)
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()
发布者向消息代理服务器发布指定主题消息
运行发布者程序,向消息代理服务器发布指定的主题消息
python server.py <指定的主题>
比如python server.py hello就表示发布了主题为hello的消息,具体的消息内容见发布者程序,server.py代码如下所示:
#coding: utf-8
import paho.mqtt.publish as mqtt
import json
import sys
if __name__ == '__main__':
args = sys.argv
subject = args[1] # 需要发布消息的主题
# msg就是消息体内容,可以根据实际需求更改
msg = {
'action': 'btn-0'
}
msg = json.dumps(msg)
# 发送指定主题的消息
mqtt.single(subject, msg,hostname="localhost", port=1883)
上面我们简单的介绍了mqtt协议及其使用。更多的相关的知识点可以google下,有很多资料的。