使用Python版Paho框架開發原生MQTT接口
說明:閱讀該文檔之前需要對Mqtt有一定的了解,這里不對Mqtt知識作介紹,對Mqtt的了解請自行搜索學習。主要說明一下用一個簡單的Demo樣例,實現和IoT平臺的對接,上報數據,下發命令等
一、注冊設備
產品信息中的 協議類型 必須為MQTT
設備管理—>新增真實設備—>選擇上面開發好的產品—>接入方式選擇 直連
保存設備ID和密鑰,利用其構建clientID
進入設備管理界面—>產品模型
如果沒有產品模型,可以點擊右上角,從產品中心導入或者是本地導入
注意:產品的協議類型必須為MQTT
進入設備管理界面—>設備—>設備注冊—>創建
保存設備ID和密鑰,利用其構建clientID
注冊設備(密碼方式)
https://support.huaweicloud.com/api-IoT/iot_06_0005.html
二、IoT平臺提供的原生MQTT接口
https://support.huaweicloud.com/api-IoT/iot_06_3002.html
本篇文檔基于eclipse的paho框架,該框架網上資料較多,可自行百度搜索學習。
Python
庫: paho_mqtt-1.4.0-py3.7.egg-info
(1) 主要是證書的配置,ca_certs就是證書的路徑
(2) 其他參數的配置請參考源碼:)
Python
#?連接地址每個局點不一樣,比如開發中心是:iot-acc-dev.huaweicloud.com host?=?"xx.xx.xx.xx" port?=?8883 #?注冊直連設備的時候返回的設備ID deviceId?=?"9a57a-***-***-816b3e" #?注冊直連設備的時候返回的秘鑰 DeviceSecret?=?"cbd*******3abv" ca_certs?=?'../rootcert.pem' para?=?get_para.Getpara(deviceId,?DeviceSecret) paras?=?para.get_para() clientId?=?paras[0] username?=?paras[1] password?=?paras[2] mqtt?=?mqtt.Client(clientId,?clean_session=True) def?connect(): ????#?callback ????mqtt.on_connect?=?on_connect ????mqtt.on_disconnect?=?on_disconnect ????mqtt.on_publish?=?on_publish ????mqtt.on_message?=?on_message ????mqtt.username_pw_set(username,?password) ????mqtt.tls_set(ca_certs,?cert_reqs=ssl.CERT_NONE) ????mqtt.connect(host,?port,?60) ????mqtt.loop_forever()
數據上報就是往平臺指定的topic上發布數據
Python
def?publish(): ????pubTopic?=?"/huawei/v1/devices/"?+?deviceId?+?"/data/json" ????payload?=?{ ????????"msgType":?"deviceReq", ????????"data":?[ ????????????{ ????????????????"serviceId":?"Storage", ????????????????"serviceData":?{ ????????????????????"storage":?"1" ????????????????} ????????????} ????????] ????} ????message?=?json.dumps(payload) ????mqtt.publish(pubTopic,?message,?1)
命令接收就是訂閱平臺指定的topic,平臺往該topic發送命令時,設備端就能收到
Python
def?subscribe(): ????subtopic?=?"/huawei/v1/devices/"?+?deviceId?+?"/command/json" ????mqtt.subscribe(subtopic)def?on_message(client,?userdata,?msg): ????print("\n=====?The?command?is?received?from?the?platform?=====?\n",?msg.payload.decode("utf-8")) ????receiveMes=?json.loads(msg.payload.decode("utf-8")) ????mid?=?receiveMes['mid'] ????commandRsp(mid)
應用服務器要需要調用“訂閱平臺業務數據”API訂閱“commandRsp”類型的通知后,才能接收到設備對控制命令的應答;
先訂閱topic(/huawei/v1/devices/{deviceId}/command/{codecMode})接收到命令,然后往另外一個topic(/huawei/v1/devices/{deviceId}/data/{codecMode})發數據響應給平臺,就視為對這條命令的響應,但是要注意,數據上報和命令響應的topic雖然是相同的,但是他們上報的結構體是有區別的
Python
def?commandRsp(mid): ????RspTopic?=?"/huawei/v1/devices/"?+?deviceId?+?"/data/json" ????payload?=?{ ????????"msgType":?"deviceRsp", ????????"mid":?mid, ????????"errcode":?0, ????????"body":?{ ????????????"result":?0 ????????} ????} ????message?=?json.dumps(payload) ????mqtt.publish(RspTopic,?message,?1)
生成 clientId, username, password
class?Getpara(): ????def?__init__(self,?deviceId,?deviceSecret): ????????self.DeviceId?=?deviceId ????????self.DeviceSecret?=?deviceSecret????def?get_para(self): ????????ClientId?=?self.DeviceId ????????DeviceId?=?self.DeviceId ????????DeviceSecret?=?self.DeviceSecret ????????timestamp?=?time.strftime('%Y%m%d%H',?time.localtime(time.time())) ????????#?clientID參考API文檔拼裝 ????????clientId?=?"".join((ClientId,?"_0",?"_0",?"_",?timestamp)) ????????username?=?DeviceId ????????deviceSecret?=?DeviceSecret.encode('utf-8') ????????password?=?hmac.new(timestamp.encode('utf-8'),?deviceSecret,?????????????digestmod=hashlib.sha256).hexdigest() ????????return?clientId,?username,?password
附件: 證書.zip 1.08KB 下載次數:8次
IoT IoT MQTT
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。