基於Python通過MQTT協議連接OneNet簡例

一、MQTT簡介

    MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成爲物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和制動器(比如通過Twitter讓房屋聯網)的通信協議。

二、MQTT特點

MQTT協議是爲大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性:

1、使用發佈/訂閱消息模式,提供一對多的消息發佈,解除應用程序耦合;

2、對負載內容屏蔽的消息傳輸;

3、使用 TCP/IP 提供網絡連接;

4、有三種消息發佈服務質量:

  • “至多一次”,消息發佈完全依賴底層 TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因爲不久後還會有第二次發送。

  • “至少一次”,確保消息到達,但消息重複可能會發生。

  • “只有一次”,確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重複或丟失會導致不正確的結果。

5、小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量;

6、使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制;

三、OneNet平臺MQTT接入說明點擊查看

四、python代碼完整簡例:(上傳初始化值,實時接收服務端數值變化)

#前期準備,註冊OneNet物聯網平臺,並創建好項目,創建數據流


from __future__ import print_function

import paho.mqtt.client as mqtt
import struct
import json

# CONNECT 方式:
# client_id:     DEV_ID
# username:  PRO_ID
# password:   AUTHINFO(鑑權信息)
# 可以連接上設備雲,CONNECT 和 CONNACK握手成功
# temperature:已創建的一個數據流
#更多請查閱OneNet官方mqtt文檔與paho-mqtt開發文檔

#修改成自己的即可
DEV_ID = "29455901" #設備ID
PRO_ID = "12555524" #產品ID
AUTH_INFO = "JHFDJF55586jhk"  #APIKEY


TYPE_JSON = 0x01
TYPE_FLOAT = 0x17

#定義上傳數據的json格式  該格式是oneNET規定好的  按格式修改其中變量即可
body = {
        "datastreams":[
                {
                    "id":"wendu",  #對應OneNet的數據流名稱
                    "datapoints":[
                        {
                            "at":"2016-08-15T14:47:00", #數據提交時間,這裏可通過函數來獲取實時時間
                            "value":55   #數據值
                            }
                        ]
                    }
                ]
            }


def build_payload(type, payload):
    datatype = type
    packet = bytearray()
    packet.extend(struct.pack("!B", datatype))
    if isinstance(payload, str):
        udata = payload.encode('utf-8')
        length = len(udata)
        packet.extend(struct.pack("!H" + str(length) + "s", length, udata))
    return packet

# 當客戶端收到來自服務器的CONNACK響應時的回調。也就是申請連接,服務器返回結果是否成功等
def on_connect(client, userdata, flags, rc):
    print("連接結果:" + mqtt.connack_string(rc))
    #上傳數據
    json_body = json.dumps(body)
    packet = build_payload(TYPE_JSON, json_body)
    client.publish("$dp", packet, qos=1)  #qos代表服務質量


# 從服務器接收發布消息時的回調。
def on_message(client, userdata, msg):
    print("溫度:"+str(msg.payload,'utf-8')+"°C")


#當消息已經被髮送給中間人,on_publish()回調將會被觸發
def on_publish(client, userdata, mid):
    print("mid:" + str(mid))


def main():
    client = mqtt.Client(client_id=DEV_ID, protocol=mqtt.MQTTv311)
    client.on_connect = on_connect
    client.on_publish = on_publish
    client.on_message = on_message

    client.username_pw_set(username=PRO_ID, password=AUTH_INFO)
    client.connect('183.230.40.39', port=6002, keepalive=120)

    client.loop_forever()

if __name__ == '__main__':
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章