MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。

好用,好使:
它的底层工作协议分两种:一种是webscoket,一种是TCP。
websocket协议主要用于移动端与服务端及Web端的发布订阅。
tcp主要用于非以上的发布订阅。

先看看web端的mqtt订阅端Demo吧:
需要引入的JS:
<script src=“static/js/mqttws31.js” type=“text/javascript”></script>
要的找我,上传不了

var client;

function MQTTconnect(out_trade_no) {
    client = new Paho.MQTT.Client(mqtthost, mqttport, "ai");
    client.onMessageArrived = onMessageArrived;
    client.connect({
        onSuccess: function () {
            console.log("Host=" + mqtthost + ", port=" + mqttport);
            client.subscribe('+/+/+/+/+/'+out_trade_no);    //以订单号订阅频道
            console.log("onConnect succeeds");
        }
    });
};

function onMessageArrived(message) {
    var topic = message.destinationName;
    var payload = message.payloadString;
    console.log("onMessageArrived:" + payload);
    insert_order(JSON.parse(payload));
    remove_load();
    clear();
    $('#submit').html('支付成功');
    $('#submit').addClass('paySuccess');
    setTimeout(function () {
        $('#submit').html('收款');
        $('#submit').removeClass('paySuccess');
    }, 3000);
    off_alert = false;
    iziToast.success({
                    message: '金额:'+parseFloat(JSON.parse(payload).receipt_amount)/100,
                    position: 'bottomRight',
                    transitionIn: 'bounceInRight',
                    color:'green',
                    title:'到账提醒'+new Date().toLocaleString(),
                    timeout:5000
                });
    client.unsubscribe(out_trade_no);
    client.disconnect();


}

再看看服务端的MQTT发布订阅吧:

#-*- coding:utf-8 -*-

client 端

# 当连接上服务器后回调此函数
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    # 放在on_connect函数里意味着
    # 重新连接时订阅主题将会被更新
    client.subscribe("qrcode")
# 从服务器接受到消息后回调此函数
def on_message(client, userdata, msg):
    res=str(msg.payload,'utf-8')
    print("主题:" + msg.topic + " 消息:" + res)
'''
client = mqtt.Client(transport='webscoket')  transport默认为tcp协议
'''
client = mqtt.Client()
client.on_connect = on_connect  # 设置连接上服务器回调函数
client.on_message = on_message  # 设置接收到服务器消息回调函数
client.connect("mqtt.ahtyt.com", 1883)  # 连接服务器,端口为1883,维持心跳为60秒
client.loop_forever()

服务端:
client = paho.Client()
client.connect("xxx.xxx.com", port=1883)
client.publish(topic="qrcode", payload=json.dumps("hello cy", ensure_ascii=False), qos=1)

关于qos消息等级的说明,百度下就知道了。
另外Mqtt协议支持多级通道推送,类似这样:
client.publish(topic="q1/q2/q3/q4", payload=json.dumps("hello cy", ensure_ascii=False), qos=1)

客户端需要以通配符的形式进行订阅类似这样:

+/+/+/+/+/q2
这样才能收听到q2的频道