物聯(lián)網(wǎng)云平臺應(yīng)用開發(fā) 課件 項目二 基于MQTT協(xié)議的智能家居系統(tǒng)_第1頁
物聯(lián)網(wǎng)云平臺應(yīng)用開發(fā) 課件 項目二 基于MQTT協(xié)議的智能家居系統(tǒng)_第2頁
物聯(lián)網(wǎng)云平臺應(yīng)用開發(fā) 課件 項目二 基于MQTT協(xié)議的智能家居系統(tǒng)_第3頁
物聯(lián)網(wǎng)云平臺應(yīng)用開發(fā) 課件 項目二 基于MQTT協(xié)議的智能家居系統(tǒng)_第4頁
物聯(lián)網(wǎng)云平臺應(yīng)用開發(fā) 課件 項目二 基于MQTT協(xié)議的智能家居系統(tǒng)_第5頁
已閱讀5頁,還剩193頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

認(rèn)識MQTT協(xié)議物聯(lián)網(wǎng)云平臺開發(fā)實踐(第2版)01認(rèn)識MQTT協(xié)議02數(shù)據(jù)流模型目錄CONTENTS03設(shè)備鑒權(quán)

第一部分

認(rèn)識MQTT協(xié)議PART0101什么是MQTT協(xié)議?IBM針對物聯(lián)網(wǎng)設(shè)備特點在1999年發(fā)布了一種“輕量級”協(xié)議——MQTT協(xié)議。MQTT(MessageQueuingTelemetryTransport,消息隊列遙測傳輸協(xié)議),是一種基于發(fā)布/訂閱(Publish/Subscribe)模式的通信協(xié)議,該協(xié)議構(gòu)建于TCP/IP協(xié)議之上。MQTT協(xié)議的最大優(yōu)點在于,可以以極少的代碼和有限的帶寬,為連接遠(yuǎn)程設(shè)備提供實時、可靠的消息服務(wù)。MQTT協(xié)議在物聯(lián)網(wǎng)、小型設(shè)備、移動應(yīng)用等方面具有較廣泛的應(yīng)用。MQTT協(xié)議特點特點:1、訂閱/發(fā)布2、一對多3、輕量級4、三種等級QoSQoS:服務(wù)質(zhì)量QoS服務(wù)質(zhì)量QoS0:最多發(fā)送一次消息。QoS1:最少發(fā)送一次消息,確保消息到達(dá)用戶QoS2:收到消息且只收到一次。工作過程工作過程1、建立/斷開連接——CONNECT、CONNACT、DISCONNECTMQTT協(xié)議是建立在TCP/IP之上,客戶端與服務(wù)器建立連接。連接過程如下圖所示:工作過程PUBACK報文,表示對PUBLISH報文的響應(yīng),表示確認(rèn)收到PUBREC報文表示發(fā)布收到PUBREL報文表示發(fā)布釋放PUBCOMP報文表示發(fā)布完成2、發(fā)布信息——PUBLISH工作過程3、訂閱主題——SUBSCRIBE、UNSUBSCRIBESUBACKUNSUBACK4、心跳機(jī)制——PINGREQPINGRESP

第二部分

數(shù)據(jù)流模型PART0202數(shù)據(jù)流模型采用數(shù)據(jù)流模型需定義數(shù)據(jù)流模板來進(jìn)行功能定義,使用數(shù)據(jù)流與數(shù)據(jù)點來組織設(shè)備數(shù)據(jù)上下行。設(shè)備上傳并存儲數(shù)據(jù)時,必須以key-value的格式上傳數(shù)據(jù)。key即為數(shù)據(jù)流(stream)名稱value為實際存儲的數(shù)據(jù)點(point)value格式可以為int、float、string、json等多種自定義格式在實際應(yīng)用中,數(shù)據(jù)流可以被用于分類描述設(shè)備的某一類屬性數(shù)據(jù),例如溫度,濕度,坐標(biāo)等信息,用戶可以自定義數(shù)據(jù)流的數(shù)據(jù)范圍,將相關(guān)性較高的數(shù)據(jù)歸類為一個數(shù)據(jù)流。數(shù)據(jù)流中的數(shù)據(jù)平臺會默認(rèn)以時序存儲,用戶可以查詢數(shù)據(jù)流中的不同時間的數(shù)據(jù)點的值。數(shù)據(jù)流模型示意圖

第三部分

設(shè)備鑒權(quán)PART0303設(shè)備鑒權(quán)方式常見的鑒權(quán)方式包括使用靜態(tài)設(shè)備密鑰、動態(tài)設(shè)備密鑰等。靜態(tài)設(shè)備密鑰的安全風(fēng)險較大,在信息傳輸過程中通過抓包等方式可以截獲靜態(tài)設(shè)備密鑰,導(dǎo)致核心密鑰泄露。token是在計算機(jī)身份認(rèn)證中的一種動態(tài)令牌,計算token的算法非可逆,且過期時間這一屬性由用戶自定義,安全度較高。在OneNET平臺中,MQTT協(xié)議采用token認(rèn)證方式。物聯(lián)網(wǎng)云平臺開發(fā)實踐(第2版)謝謝您的觀看!Thankyou!基于模擬器的MQTT協(xié)議調(diào)試物聯(lián)網(wǎng)云平臺開發(fā)實踐(第2版)01新建產(chǎn)品和設(shè)備02token計算方法目錄CONTENTS03建立連接04JSON數(shù)據(jù)格式05信息發(fā)布06主題訂閱07命令接收

第一部分

新建產(chǎn)品和設(shè)備PART0101實驗介紹【實驗?zāi)康摹浚?)掌握MQTT協(xié)議的產(chǎn)品、設(shè)備、數(shù)據(jù)流創(chuàng)建流程(2)掌握整個流程中,各類信息的解讀【實驗設(shè)備】(1)PC一臺【實驗要求】在OneNET平臺注冊MQTT產(chǎn)品,數(shù)據(jù)協(xié)議采用數(shù)據(jù)流,在該產(chǎn)品下注冊設(shè)備。實驗步驟一、新建MQTT產(chǎn)品(1)登陸OneNET平臺,進(jìn)入開發(fā)者中心,單擊左側(cè)“產(chǎn)品開發(fā)”。(2)單擊“創(chuàng)建產(chǎn)品”按鈕,并填寫相關(guān)信息。選定產(chǎn)品品類后,智能化方式選擇“設(shè)備接入”,進(jìn)一步填寫產(chǎn)品名稱、所屬城市、節(jié)點類型、接入?yún)f(xié)議、數(shù)據(jù)協(xié)議、聯(lián)網(wǎng)方式、開發(fā)方案等一系列信息。實驗步驟一、新建MQTT產(chǎn)品(1)登陸OneNET平臺,進(jìn)入開發(fā)者中心,單擊左側(cè)“產(chǎn)品開發(fā)”。(2)單擊“創(chuàng)建產(chǎn)品”按鈕,并填寫相關(guān)信息。選定產(chǎn)品品類后,智能化方式選擇“設(shè)備接入”,進(jìn)一步填寫產(chǎn)品名稱、所屬城市、節(jié)點類型、接入?yún)f(xié)議、數(shù)據(jù)協(xié)議、聯(lián)網(wǎng)方式、開發(fā)方案等一系列信息。接入?yún)f(xié)議選擇MQTT,數(shù)據(jù)協(xié)議選擇數(shù)據(jù)流。(3)記錄新建產(chǎn)品的產(chǎn)品ID。實驗步驟二、新建MQTT設(shè)備(1)在設(shè)備接入管理,單擊“設(shè)備管理”標(biāo)簽,在出現(xiàn)的界面中,添加MQTT設(shè)備。(2)單擊“添加設(shè)備”按鈕,填寫設(shè)備名稱等信息,單擊“添加”按鈕。使用該協(xié)議,在一個產(chǎn)品下,可以有很多設(shè)備,但是設(shè)備名稱不能重復(fù)。建議使用設(shè)備SN號、MAC地址、IMEI等對設(shè)備進(jìn)行命名,保證設(shè)備是唯一的。(3)選擇“設(shè)備列表”標(biāo)簽,出現(xiàn)數(shù)據(jù)流格式可以進(jìn)行的操作選項:設(shè)備詳情、數(shù)據(jù)流、文件管理、命令下發(fā)和SIM卡查詢。單擊“設(shè)備詳情”,記錄設(shè)備名稱、設(shè)備密鑰和產(chǎn)品ID,在后面的實驗中,使用這些參數(shù)計算token,并進(jìn)行設(shè)備鑒權(quán)。

第二部分

Token計算方法PART0202Token計算Token是動態(tài)密碼,有有效期,更安全。由以下多個參數(shù)構(gòu)成:version:參數(shù)組版本號,日期格式,目前僅支持"2018-10-31"res:格式為:父資源類/父資源ID/子資源類/子資源ID示例:設(shè)備連接時,res格式:'products/Product_ID/devices/Device_name'API訪問時,res格式:'products/Product_ID'et:訪問過期時間expirationTime,unix時間。1537255523表示:北京時間2018-09-1815:25:23當(dāng)一次訪問參數(shù)中的et時間小于當(dāng)前時間時,平臺會認(rèn)為訪問參數(shù)過期從而拒絕該訪問version。一般采用當(dāng)前時間+過期時間來表示。示例:當(dāng)前時間+3600,表示當(dāng)前時間后一個小時。Token計算method:簽名方法,支持md5、sha1、sha256三種sign簽名結(jié)果字符串signature。參數(shù)sign的生成算法為:sign=base64(hmac_<method>(base64decode(accessKey),utf-8(StringForSignature)))其中:? accessKey為OneNET為獨立資源(例如,產(chǎn)品)分配的唯一訪問密鑰,其作為簽名算法參數(shù)之一參與簽名計算,為保證訪問安全,請妥善保管? accessKey參與計算前應(yīng)先進(jìn)行base64decode操作?

用于計算簽名的字符串StringForSignature的組成順序按照參數(shù)名稱進(jìn)行字符串排序,以'/n'作為參數(shù)分隔,當(dāng)前版本中按照如下順序進(jìn)行排序:et、method、res、versionStringForSignature組成示例如下:StringForSignature=et+'\n'+method+'\n'+res+'\n'+versionToken計算res格式為:products/{產(chǎn)品id}/devices/{設(shè)備名字},{}及{}內(nèi)的信息用實際設(shè)備信息替換。例如:products/jVL7QeTMr3/devices/HT1表示產(chǎn)品id為jVL7QeTMr3,設(shè)備名稱為HT1的res參數(shù)。et為訪問過期時間:UNIX時間。例如:1709796184表示2024-03-0715:23:04。key為設(shè)備密鑰。method為簽名方法,支持MD5、SHA1、SHA256三種方法。

第三部分

建立連接PART0303實驗介紹【實驗?zāi)康摹浚?)掌握MQTT設(shè)備與云平臺建立連接的方法。(2)掌握整個流程中涉及的參數(shù)及含義?!緦嶒炘O(shè)備】(1)PC一臺(2)MQTT.fx軟件【實驗要求】在已創(chuàng)建的數(shù)據(jù)格式為數(shù)據(jù)流的設(shè)備下,采用MQTT.fx軟件模擬一臺實際設(shè)備,與OneNET平臺建立連接。實驗步驟1、打開MQTT.fx客戶端,進(jìn)入客戶端配置頁面。實驗步驟2、點擊設(shè)置,設(shè)置ProfileName,本實驗中為localmosquitto。本實驗選取加密接口。接入地址:端口:8883ClientID:填寫設(shè)備名稱(不重復(fù))MQTT版本:3.1.1實驗步驟3、參數(shù)設(shè)置。用戶名:產(chǎn)品ID密碼:TokenSSL/TLS:CAcertificatefile,導(dǎo)入證書證書下載:進(jìn)入OneNET平臺,文檔中心——OneNET物聯(lián)網(wǎng)開放平臺——產(chǎn)品開發(fā)——設(shè)備接入——設(shè)備開發(fā)——MQTT協(xié)議接入——MQTT設(shè)備連接。實驗結(jié)果在軟件調(diào)試過程中,會顯示連接結(jié)果,右側(cè)燈變綠。在OneNET平臺“設(shè)備管理”頁面中,會顯示設(shè)備在線狀態(tài)。

第四部分

JSON數(shù)據(jù)格式PART0404JSON數(shù)據(jù)格式JSON是JaveScriptObjectNotation的縮寫,是一種輕量級數(shù)據(jù)交換格式。它是基于ECMAScript(歐洲計算機(jī)協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得JSON成為理想的數(shù)據(jù)交換語言。JSON數(shù)據(jù)格式易于人閱讀和編寫,同時也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。{"employees":[{"firstName":"Dan","lastName":"Li"},{"firstName":"Lin","lastName":"Ma"}]}JSON數(shù)據(jù)格式1、對象名稱/值對"temp":222、各種標(biāo)點{}對象{"temp":22}"temp":22:分隔名稱/值{"temp":22,"hum":47}“”字符串{"temp":22,"hum":47},名稱/值對分隔{"temp":22,"hum":47}整型數(shù)、浮點數(shù)、字符串、布爾值、數(shù)組、對象、空J(rèn)SON數(shù)據(jù)格式[]數(shù)組,數(shù)組間元素分隔[1,2.4,"3",{"temp":22}]整型數(shù)、浮點數(shù)、字符串、布爾值、也可以是對象或者數(shù)組進(jìn)行嵌套[1,2.4,"3",{"temp":22}][1,2.4,"3",[1,2]]對象間名稱/值對分隔{"temp":22,"hum":47}JSON數(shù)據(jù)格式——例1

{

“flag”:“00”,

“message”:“傳感器”,

“property”:{

“Electricity”:[{“voltage”:“10V”,

“current”:“5A”}],

“Temp”:“temperature”

},

“sensors”:[{

“Date”:“time”,

“id”:1527}]}JSON數(shù)據(jù)格式——例2{"datastreams":[{"id":"Lum","datapoints":[{"at":"2020-02-10T00:35:43","value":"bacd"},{"at":"2020-02-10T00:55:43","value":84}]},{"id":"key","datapoints":[{"at":"2020-02-10T00:35:43","value":{"x":123,"y":123.994}},{"at":"2020-02-10T00:35:43","value":23.001}]}]}{"datastreams":[{"id":"Lum","datapoints":[{"value":50}]}]}JSON編解碼很多編程語言都支持JSON格式,/json-zh.html可以查詢所使用的編程語言是否支持JSON格式。JSONPythonobjectdictarrayliststringstrnumber(int)intnumber(real)floattrueTruefalseFalsenullNone編碼&解碼

第五部分

信息發(fā)布PART0505實驗介紹【實驗?zāi)康摹浚?)掌握MQTT協(xié)議信息發(fā)布的流程(2)掌握整個流程中,各類信息的解讀【實驗設(shè)備】(1)PC一臺(2)MQTT.fx軟件【實驗要求】在已創(chuàng)建的數(shù)據(jù)流下,采用MQTT.fx軟件實現(xiàn)信息發(fā)布。實驗步驟1、成功連接后,MQTT.fx選擇Publish調(diào)用系統(tǒng)topic:$sys/{pid}/{device-name}/dp/post/json該topic表示上傳數(shù)據(jù)點,其中pid用產(chǎn)品ID替換,device-name用設(shè)備名稱替換。示例:

$sys/315511/temp/dp/post/json

上傳數(shù)據(jù)點相關(guān)系統(tǒng)topic系統(tǒng)topic用途QoS訂閱發(fā)布$sys/{pid}/{device-name}/dp/post/json設(shè)備上傳數(shù)據(jù)點0/1√$sys/{pid}/{device-name}/dp/post/json/accepted系統(tǒng)通知"設(shè)備上傳數(shù)據(jù)點成功"0√$sys/{pid}/{device-name}/dp/post/json/rejected系統(tǒng)通知"設(shè)備上傳數(shù)據(jù)點失敗"0√實驗步驟2、在Publish下方,輸入JSON數(shù)據(jù)流示例:{"id":123,"dp":{"temperatrue":[{"v":60,"t":1709797760}]}}id:表示發(fā)布消息的id,可以更改dp:數(shù)據(jù)流temperature:其中一個數(shù)據(jù)流名稱v:數(shù)據(jù)點t:產(chǎn)生該數(shù)據(jù)點的時間,可不上傳。不上傳,平臺默認(rèn)當(dāng)前時間。在設(shè)備端可以在緩存中記錄數(shù)據(jù)采集的時間,并上傳,解決由于網(wǎng)絡(luò)問題導(dǎo)致的無法立即上傳的問題。時間格式采用Unix格式,1709797760表示2024-03-0715:49:20。TIPS:Publish時主題出錯,直接掉線;數(shù)據(jù)流出錯,rejected實驗步驟進(jìn)入OneNET平臺,在“設(shè)備管理”頁面中,選擇相應(yīng)設(shè)備,并單擊該設(shè)備對應(yīng)的“數(shù)據(jù)流”,即可看到該數(shù)據(jù)點。實驗步驟3、MQTT日志前四條日志表示成功登錄;后面的日志表示發(fā)布數(shù)據(jù)。但是本地看不到信息,原因在于未訂閱相關(guān)topic,發(fā)布的過程僅為單向過程。

第六部分

主題訂閱PART0606實驗介紹【實驗?zāi)康摹浚?)掌握MQTT協(xié)議主題訂閱流程(2)掌握整個流程中,各類信息的解讀【實驗設(shè)備】(1)PC一臺(2)MQTT.fx軟件【實驗要求】在OneNET平臺注冊MQTT產(chǎn)品,在該產(chǎn)品下注冊設(shè)備,創(chuàng)建數(shù)據(jù)流。采用MQTT.fx軟件進(jìn)行連接,完成topic訂閱。實驗步驟1、訂閱主題accepted點擊MQTT.fx—Subscribe,輸入主題$sys/{pid}/{device-name}/dp/post/json/accepted表示訂閱系統(tǒng)topic,實現(xiàn)系統(tǒng)通知"設(shè)備上傳數(shù)據(jù)點成功"。點擊Subscribe,下發(fā)出現(xiàn)訂閱條目。

上傳數(shù)據(jù)點相關(guān)系統(tǒng)topic系統(tǒng)topic用途QoS訂閱發(fā)布$sys/{pid}/{device-name}/dp/post/json設(shè)備上傳數(shù)據(jù)點0/1√$sys/{pid}/{device-name}/dp/post/json/accepted系統(tǒng)通知"設(shè)備上傳數(shù)據(jù)點成功"0√$sys/{pid}/{device-name}/dp/post/json/rejected系統(tǒng)通知"設(shè)備上傳數(shù)據(jù)點失敗"0√實驗步驟2、信息發(fā)布點擊MQTT.fx—Publish,輸入$sys/{pid}/{device-name}/dp/post/json,輸入上述數(shù)據(jù)流,點擊Publish。示例:{"id":123,"dp":{"temperatrue":[{"v":60,"t":1581423600}]}}實驗步驟3、訂閱rejected點擊MQTT.fx—Subscribe,輸入以下主題:$sys/{pid}/{device-name}/dp/post/json/rejected表示訂閱系統(tǒng)topic,實現(xiàn)系統(tǒng)通知"系統(tǒng)通知設(shè)備上傳數(shù)據(jù)點失敗"。點擊Subscribe,下發(fā)出現(xiàn)訂閱條目。實驗步驟4、發(fā)布點擊MQTT.fx—Publish,輸入$sys/{pid}/{device-name}/dp/post/json,輸入錯誤數(shù)據(jù)流,點擊Publish。示例:{"id":123,"dp":{"temperatrue":60}}拓展點擊MQTT.fx—Subscribe,輸入以下主題:$sys/{pid}/{device-name}/dp/post/json/+表示同時訂閱了這一級的所有topic,包括:$sys/{pid}/{device-name}/dp/post/json/rejected$sys/{pid}/{device-name}/dp/post/json/accepted

第七部分

命令接收PART0707實驗介紹【實驗?zāi)康摹浚?)掌握MQTT協(xié)議接收平臺命令的工作流程(2)掌握整個流程中,各類信息的解讀【實驗設(shè)備】(1)PC一臺(2)MQTT.fx軟件【實驗要求】在OneNET平臺注冊MQTT產(chǎn)品,在該產(chǎn)品下注冊設(shè)備,創(chuàng)建數(shù)據(jù)流。采用MQTT.fx軟件進(jìn)行連接,從OneNET平臺進(jìn)行命令下發(fā)。命令下發(fā)相關(guān)系統(tǒng)topic系統(tǒng)topic用途QoS訂閱發(fā)布$sys/{pid}/{device-name}/cmd/request/{cmdid}系統(tǒng)向設(shè)備下發(fā)命令0√$sys/{pid}/{device-name}/cmd/response/{cmdid}設(shè)備回復(fù)命令應(yīng)答0/1√$sys/{pid}/{device-name}/cmd/response/{cmdid}/accepted系統(tǒng)回復(fù)"設(shè)備命令應(yīng)答成功"0√$sys/{pid}/{device-name}/cmd/response/{cmdid}/rejected系統(tǒng)回復(fù)"設(shè)備命令應(yīng)答失敗"0√

難點:cmdid未知實驗步驟MQTT是雙向的,設(shè)備端可以向平臺發(fā)送數(shù)據(jù),平臺也可以向數(shù)據(jù)段下發(fā)命令。與EDP設(shè)備不同的是,對于MQTT設(shè)備,信息發(fā)送并不能直接到設(shè)備端,需要設(shè)備端訂閱相應(yīng)的主題。因此,調(diào)試過程分設(shè)備端和平臺端。1、成功連接后,打開MQTT.fx,訂閱

$sys/{pid}/{device-name}/cmd/request/+,表示系統(tǒng)向設(shè)備下發(fā)命令。只有模擬器軟件MQTT.fx訂閱了該topic,才可以接收到OneNET平臺下發(fā)的命令。推薦設(shè)備采用通配符方式+或#進(jìn)行多個命令請求消息訂閱,+表示單層的所有消息,#表示多層的所有消息。實驗步驟2、訂閱完成后,從OneNET平臺進(jìn)行數(shù)據(jù)下發(fā),選擇該設(shè)備下——下發(fā)命令。設(shè)置命令下發(fā)的參數(shù),包括“命令內(nèi)容”和“響應(yīng)時間”。命令內(nèi)容有兩種形式,可以是字符串,也可以是十六進(jìn)制數(shù)。本實驗發(fā)送命令內(nèi)容為字符串hello。超時時間范圍為5~30秒,在這一時間范圍內(nèi),平臺接收來自設(shè)備的反饋信息,若未收到反饋信息,則會提示錯誤,但并不表示命令下發(fā)一定未成功。實驗步驟$sys/{pid}/{device-name}/cmd/request/{cmdid}在平臺端查看,則顯示響應(yīng)超時的錯誤提示,具體如下。{"errno":15,"error":"cmdtimeout"}實驗步驟當(dāng)平臺向設(shè)備下發(fā)命令后,模擬器收到了一條以命令id為結(jié)尾的信息$sys/315511/temp/cmd/request/e2371e2d-0f3a-4e0b-8f76-21d1c16e946dcmdid:e2371e2d-0f3a-4e0b-8f76-21d1c16e946d在publish中,輸入以該id為結(jié)尾的信息發(fā)布命令$sys/315511/temp/cmd/response/e2371e2d-0f3a-4e0b-8f76-21d1c16e946d此時,在OneNET平臺中進(jìn)行查看,可以看到如下響應(yīng):

{"errno":0,"error":"success","data":{"cmd_uuid":"e2371e2d-0f3a-4e0b-8f76-21d1c16e946d","cmd_resp":null}}物聯(lián)網(wǎng)云平臺開發(fā)實踐(第2版)謝謝您的觀看!Thankyou!認(rèn)識Python物聯(lián)網(wǎng)云平臺開發(fā)實踐(第2版)01Python開發(fā)環(huán)境搭建02認(rèn)識Python編程方法目錄CONTENTS03認(rèn)識Python基本語法04認(rèn)識Python變量和數(shù)據(jù)類型05認(rèn)識Python常見語句06函數(shù)

第一部分

Python開發(fā)環(huán)境搭建PART0101Python發(fā)展趨勢Python語言特點1、代碼簡單2、可讀性強(qiáng)3、易維護(hù)4、免費、開源、5、豐富的庫資源、活躍的社區(qū)6、可移植性。7、面向?qū)ο?、解釋型語言9、可嵌入Pythonprint(“Hello”)C語言#include<stdio.h>intmain(void){Printf(“Hello”);}實驗內(nèi)容【實驗?zāi)康摹浚?)掌握Python3.10和Pycharm的安裝流程(2)掌握開發(fā)環(huán)境的配置【實驗設(shè)備】(1)PC一臺(2)Python安裝軟件(3)Pycharm安裝軟件【實驗要求】任何語言離不開開發(fā)環(huán)境,在Windows端,Python語言的開發(fā)需要集成開發(fā)環(huán)境和解釋器。比較常見的集成開發(fā)環(huán)境是Pycharm,解釋器目前常見的是Python3.6以上的版本。本實驗在安裝軟件的基礎(chǔ)上,完成軟件的配置。PyCharm安裝軟件包的下載地址為/pycharm/download/#section=windows,Python安裝軟件包可以在Python官網(wǎng):/下載。實驗步驟一、安裝Python3.101、雙擊Python安裝軟件包2、點擊Customizeinstallation開始安裝Python軟件實驗步驟記得勾選“AddPython3.xtoPATH”選項安裝完成后可以打開Windows的“命令行提示符”工具并輸入python--version或python-V來檢查安裝是否成功實驗步驟二、安裝開發(fā)環(huán)境Pycharm1、雙擊Pycharm安裝軟件包。2、點擊Next。實驗步驟第一次打開,選擇新建項目,選擇項目保存路徑及環(huán)境變量的設(shè)置,點擊創(chuàng)建。項目路徑Python環(huán)境(自動識別)

第二部分

認(rèn)識Python編程方法PART0202交互式開發(fā)環(huán)境交互式編程不需要創(chuàng)建腳本文件,通過Python解釋器的交互模式進(jìn)來編寫代碼,類似cmd.exe中輸入代碼。在Windows系統(tǒng)中直接打開Python解釋器即可進(jìn)行編程。在Linux系統(tǒng)中,打開命令行,輸入Python命令即可進(jìn)行編程。腳本式開發(fā)環(huán)境交互式編程不太適合較長的、邏輯復(fù)雜的代碼,腳本式編程在使用過程中應(yīng)用更多。不同的操作系統(tǒng)均可以安裝Python語言的集成開發(fā)環(huán)境,例如ThonnyPythonIDE、PyCharmCommunity。在集成開發(fā)環(huán)境中打開.py文件,執(zhí)行源文件中的代碼即可獲取運行結(jié)果。安裝注意點:1、Pycharm中選擇解釋器2、記住安裝路徑,后期安裝庫文件需要腳本式開發(fā)流程1、新建項目Interpreter:解釋器。點擊框選處,AddLocal,選擇Python安裝文件夾下的python.exe文件。解釋器配置與后續(xù)代碼是否能正常允許、庫文件能否正常使用都有關(guān)。腳本式開發(fā)流程2、新建文件3、編寫代碼4、運行

第三部分

認(rèn)識Python基本語法PART0303輸入輸出不同的編程語言都有各自的輸入輸出固定格式,在Python語言中,輸入一般使用input語句,輸出則使用print語句。

N=input('Enteranumber')print(N)執(zhí)行上述代碼,輸出以下結(jié)果:Enteranumber:22其中,第一個2是通過輸入的數(shù)字,第二個2是輸出的數(shù)字。代碼塊在常見的高級編程語言中,習(xí)慣使用{}來表示一個函數(shù)或一段邏輯關(guān)系,但是在Python語言中,利用縮進(jìn)來表示。示例:

ifTrue:

print("Correct")else:

print("Wrong")ifTrue:

print("Correct")

else:

print("Wrong")縮進(jìn)的空白數(shù)量是可變的所有代碼塊語句必須包含相同的縮進(jìn)空白數(shù)量,在if…else…語句中,if和else是一對代碼,必須保持相同的縮進(jìn)量。代碼塊常見代碼塊:if/else、for、函數(shù)定義……defcal(a,b):

returna+b

a=1b=2print(cal(a,b))注釋Python的注釋有三種形式,注釋單行,一般采用#;注釋多行可以采用前后各三個雙引號或者單引號。如下所示:

'''print("D")print("E")'''"""print("Hello")print("Hello")"""print("HelloSiit!")#print("A")格式1、分隔Python語句中,直接換行表示進(jìn)入下一句代碼,與一般C語言中,使用分號表示分隔不同。如果碰到語句特別長的情況,為了方便閱讀,會人為進(jìn)行換行,這時常見的處理方式是通過\來表示。

print("HelloSiit!\Suzhou")

2、空行為了方便閱讀及維護(hù),在代碼中常常會使用空行分割函數(shù)、類等??招械脑黾硬⒉挥绊戇\行結(jié)果,空行也不屬于Python語法。3、同一行顯示多條語句:分號分隔print("Hello");print("Siit")

第四部分

認(rèn)識Python變量和數(shù)據(jù)類型PART0404Python變量1、變量是存儲在內(nèi)存中的值。創(chuàng)建變量時,內(nèi)存會為該變量分配存儲空間。2、對于Python語言來說,其變量不需要預(yù)先進(jìn)行類型聲明。每個變量在內(nèi)存中創(chuàng)建,都包括變量的標(biāo)識,名稱和數(shù)據(jù)這些信息。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創(chuàng)建。當(dāng)執(zhí)行以下命令時:

A=2A=2.4

主要按以下步驟進(jìn)行:1、創(chuàng)建變量A2、創(chuàng)建整型數(shù)字23、將變量指向整型數(shù)字24、創(chuàng)建浮點數(shù)2.45、將變量指向浮點數(shù)2.4變量本身沒有類型,它指向的對象才有數(shù)據(jù)類型,變量中存儲的是對象的地址。一個變量可以有很多賦值,它可以指向int、string等各種數(shù)據(jù)類型。Python變量——數(shù)據(jù)類型1、Number——數(shù)字Number指數(shù)字,Python支持四種不同的數(shù)字類型:int(整型)整型數(shù)字不包含小數(shù)部分。整型不僅可以用十進(jìn)制表示,也可以用十六進(jìn)制表示,在十六進(jìn)制數(shù)前增加0x。float(浮點數(shù))浮點數(shù)可以包含小數(shù)部分。bool(布爾值)布爾值只有兩個數(shù):True和False。complex(復(fù)數(shù))復(fù)數(shù)由實數(shù)部分和虛數(shù)部分組成。Python變量——數(shù)據(jù)類型2、String——字符串String指字符串,通常由數(shù)字、字母、下劃線組成的一串字符。字符串用雙引號或者單引號表示。字符串從0開始索引,也可以采用[頭下標(biāo)

尾上標(biāo)]截取其中部分位。執(zhí)行以下代碼:

str='HelloSiit!'print(str)#輸出完整字符串print(str[0])#輸出字符串中的第一個字符print(str[2:5])#輸出字符串中第三個至第5個字符print(str[2:])#輸出從第三個字符開始的所有字符print(str*2)#輸出字符串兩次print(str+"SZ")#輸出連接的字符串Python變量——數(shù)據(jù)類型3、List——列表List指列表,是Python中使用最頻繁的數(shù)據(jù)類型。列表可以完成大多數(shù)集合類的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。它支持字符,數(shù)字,字符串等多種類型,也可以嵌套列表。列表通常用方括號進(jìn)行標(biāo)識,采用逗號分割列表內(nèi)的各元素。列表可以索引和切割,方式與字符串類似。執(zhí)行以下代碼:

list=['Hello',2020,2,'Siit',6]tinylist=[1,'OneNET']print(list)#輸出完整列表print(list[0])#輸出列表的第一個元素print(list[1:3])#輸出第二個至第三個元素print(list[2:])#輸出從第三個開始至列表末尾的所有元素print(tinylist*2)#輸出列表兩次print(list+tinylist)#打印組合的列表

list[1]=2019#修改列表中的元素print(list)#打印新的列表Python變量——數(shù)據(jù)類型4、Tuple——元組Tuple指元組,與列表類似都表示元素的集合,可以被索引和截取。但是存在以下幾方面差異:元組采用小括號進(jìn)行標(biāo)識,而列表通常用方括號進(jìn)行標(biāo)識。元組不允許修改元組內(nèi)的元素,相當(dāng)于只讀文件;而列表可以被修改。執(zhí)行以下代碼:tp1=('Hello',2020,2,'Siit',6)tp2=(1,'OneNET')print(tp1)#輸出完整元組print(tp1[0])#輸出元組的第一個元素print(tp1[1:3])#輸出第二個至第三個元素print(tp1[2:])#輸出從第三個開始至元組末尾的所有元素print(tp2*2)#輸出元組兩次print(tp1+tp2)#打印元組的列表tp1[1]=2019#修改元組中的元素Python變量——數(shù)據(jù)類型5、Dictionary——字典Dictionary指字典,通常用大括號進(jìn)行標(biāo)識。在Python語言里,字典是除列表以外最靈活的內(nèi)置數(shù)據(jù)結(jié)構(gòu)類型。列表是有序的對象集合,字典是無序的對象集合。列表通過索引存取元素,字典則通過鍵存取元素。鍵和鍵對應(yīng)的值是一一對應(yīng)的。同樣的,字典元素也是可以修改的。執(zhí)行以下代碼:dict={}#使用{}定義空字典dict['one']="Thisisone"dict[2]="Thisistwo"dict1={'name':'CY','code':1234,'dept':'ee'}print(dict['one'])#輸出鍵為'one'的值print(dict[2])#輸出鍵為2的值print(dict1)#輸出完整的字典print(dict1.keys())#輸出所有鍵print(dict1.values())#輸出所有值dict1['dept']='eg'#修改鍵為dept對應(yīng)的值print(dict1['dept'])#輸出鍵為dept對應(yīng)的值字典的結(jié)構(gòu)與JSON數(shù)據(jù)結(jié)構(gòu)類似,一般會先定義字典格式,再將其轉(zhuǎn)換成JSON數(shù)據(jù)流。

第五部分

認(rèn)識Python常見語句PART0505Python常用語句——條件語句條件語句通過對條件的判斷,決定執(zhí)行哪條語句。如果結(jié)果為真,則執(zhí)行語句一;如果結(jié)果不為真,則執(zhí)行語句二。常見格式如下:a=1ifa==1:print("A")elifa==2:print("B")else:print("C")

循環(huán)語句指的是重復(fù)執(zhí)行某語句或代碼塊。常見的循環(huán)語句有for語句和while語句。1、for語句:for語句采用以下格式:for元素in序列,該序列可以是列表也可以是字符串。for循環(huán)可以遍歷序列中的項目。以下給出for函數(shù)示例:forletterin'Siit':print('當(dāng)前字母:',letter)c=['OneNET','Siit','SZ']forcinc:print('當(dāng)前單詞:',c)Python常用語句——循環(huán)語句2、while語句:while語句用于循環(huán)執(zhí)行程序,在某條件下,循環(huán)執(zhí)行某段程序,以處理需要重復(fù)處理的相同任務(wù)。采用以下格式:while判斷條件(condition):

執(zhí)行語句(statements)執(zhí)行語句可以是單個語句或代碼塊。判斷條件可以是任何表達(dá)式,任何非零、或非空(null)的值均為true。當(dāng)判斷條件假false時,循環(huán)結(jié)束。以下給出while函數(shù)示例:

count=0while(count<8):print('Thecountis:',count)count=count+2Python常用語句——循環(huán)語句中斷用于打斷循環(huán),最常用的方式是break語句。在多層嵌套的循環(huán)語句中,break將中止最深層的循環(huán)。以下給出示例代碼:forletterin'OneNET':#第一個實例

ifletter=='N':breakprint('當(dāng)前字母:',letter)Python常用語句——中斷

第六部分

函數(shù)PART0606函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。Python提供了諸如print()的許多內(nèi)建函數(shù)。除此以外,用戶可以自定義函數(shù)。以下給出自定義函數(shù)示例:defsum(a,b):#返回2個參數(shù)的和."total=a+bprint("和:",total)returntotalPython函數(shù)任務(wù):定義子函數(shù),函數(shù)名自定義子函數(shù)功能:當(dāng)變量a等于5時,輸出b-c的結(jié)果否則,輸出b+c的結(jié)果外部輸入變量a的值,變量b,c分別賦值8,2,打印子函數(shù)計算結(jié)果Python小任務(wù)對于Python而言,豐富的庫函數(shù)是其優(yōu)勢之一。安裝現(xiàn)有庫函數(shù)后,可以通過調(diào)用庫函數(shù),用簡單的語句實現(xiàn)目標(biāo)功能。以使用HTTP協(xié)議必需的requests庫函數(shù)為例:這一庫函數(shù)可用于向指定目標(biāo)網(wǎng)站的后臺服務(wù)器發(fā)起請求,并接收服務(wù)器返回的響應(yīng)內(nèi)容,是常見的HTTP請求模塊。調(diào)用requests.post()函數(shù),可以采用POST方式,將符合OneNET平臺要求的信息發(fā)送給服務(wù)器。Python庫函數(shù)Python安裝庫文件注意點:1、盡量不要同時安裝多個版本的Python軟件。2、當(dāng)安裝的Python版本高于3時,可采用pip3installrequests命令。3、如果采用Pycharm作為開發(fā)環(huán)境,在開發(fā)環(huán)境的配置中,設(shè)置解釋器Interpreter需要配置正確,在Python安裝文件夾中選擇Python.exe。打開cmd,進(jìn)入Scripts文件夾文件夾地址看安裝路徑importrequests#導(dǎo)入庫函數(shù)

requests.post()#完善調(diào)用函數(shù)信息后,調(diào)用requests庫函數(shù)中的post功能Python庫函數(shù)調(diào)用調(diào)用包含兩部分:導(dǎo)入庫函數(shù),調(diào)用函數(shù)的某個功能物聯(lián)網(wǎng)云平臺開發(fā)實踐(第2版)謝謝您的觀看!Thankyou!基于Python的MQTT協(xié)議實現(xiàn)物聯(lián)網(wǎng)云平臺開發(fā)實踐(第2版)01庫文件02token計算參考代碼目錄CONTENTS03建立連接04發(fā)布信息05訂閱主題/取消訂閱06接收平臺下發(fā)指令

第一部分

庫文件PART01011、開始菜單輸入cmd,回車3、打開cmd,進(jìn)入Scripts文件夾。2、文件夾地址看python安裝路徑填入:cd+空格+安裝路徑C:\Users\admin\AppData\Local\Programs\Python\Python310\Scripts庫函數(shù)安裝庫函數(shù)安裝5、根據(jù)提示進(jìn)行更新,輸入:mpipinstall-upgradepip安裝完畢后,提示Successfully

installed提示有新版的pip6、再次輸入:pip3

install

paho-mqtt4、輸入:pip3

install

paho-mqtt安裝完的庫函數(shù)文件在\Python36\Lib\site-packages\paho\mqtt文件夾中庫函數(shù)安裝

第二部分

token計算參考代碼PART0202Token計算Token是動態(tài)密碼,有有效期,更安全。由以下多個參數(shù)構(gòu)成:version:參數(shù)組版本號,日期格式,目前僅支持"2018-10-31"res:格式為:父資源類/父資源ID/子資源類/子資源ID示例:設(shè)備連接時,res格式:'products/Product_ID/devices/Device_name'API訪問時,res格式:'products/Product_ID'et:訪問過期時間expirationTime,unix時間。1537255523表示:北京時間2018-09-1815:25:23當(dāng)一次訪問參數(shù)中的et時間小于當(dāng)前時間時,平臺會認(rèn)為訪問參數(shù)過期從而拒絕該訪問version。一般采用當(dāng)前時間+過期時間來表示。示例:當(dāng)前時間+3600,表示當(dāng)前時間后一個小時。Token計算method:簽名方法,支持md5、sha1、sha256三種sign簽名結(jié)果字符串signature。參數(shù)sign的生成算法為:sign=base64(hmac_<method>(base64decode(accessKey),utf-8(StringForSignature)))其中:? accessKey為OneNET為獨立資源(例如,產(chǎn)品)分配的唯一訪問密鑰,其作為簽名算法參數(shù)之一參與簽名計算,為保證訪問安全,請妥善保管? accessKey參與計算前應(yīng)先進(jìn)行base64decode操作?

用于計算簽名的字符串StringForSignature的組成順序按照參數(shù)名稱進(jìn)行字符串排序,以'/n'作為參數(shù)分隔,當(dāng)前版本中按照如下順序進(jìn)行排序:et、method、res、versionStringForSignature組成示例如下:StringForSignature=et+'\n'+method+'\n'+res+'\n'+versionToken計算若token參數(shù)如下et=1537255523method=sha1res=products/123123version=2018-10-31則用于計算簽名的字符串StringForSignature為(按照et、method、res、version的順序)StringForSignature="1537255523"+"\n"+"sha1"+"\n"+"products/123123"+"\n"+"2018-10-31"計算出sign后,將每個參數(shù)均采用key=value的形式表示,并用'&'作為分隔符token示例如下:version=2018-10-31&res=products/123123&et=1537255523&method=sha1&sign=ZjA1NzZlMmMxYzIOTg3MjBzNjYTI2MjA4Yw=Token計算代碼#定義token計算函數(shù)deftoken(product_id,access_key,auth_info=None):version='2018-10-31'ifauth_info:res='products/%s/devices/%s'%(product_id,auth_info)else:res='products/%s'%(product_id)et=str(int(time.time())+3600)method='sha1'key=base64.b64decode(access_key)org=et+'\n'+method+'\n'+res+'\n'+versionb=hmac.new(key=key,msg=org.encode(),digestmod=method)sign=base64.b64encode(b.digest()).decode()sign=quote(sign,safe='')res='res=%s'%ressign='sign=%s'%signet='et=%s'%etmethod='method=%s'%methodversion='version=%s'%version

list_token=[res,sign,et,method,version]token='&'.join(list_token)returntokenToken計算代碼

if__name__=='__main__’:access_key=‘xxxxx’#設(shè)備keyauth_info=‘temp’#client_id設(shè)備名稱product_id=‘xxxxxx’#username產(chǎn)品ID#調(diào)用token計算函數(shù)api_token=token(product_id,access_key,auth_info)print(api_token)

第三部分

建立連接PART0303連接參數(shù)建立客戶端連接前,首先需要新建一個MQTT的客戶端,導(dǎo)入pahomqtt庫函數(shù)后,可以通過調(diào)用以下函數(shù)新建客戶端:client=mqtt.Client(client_id=auth_info,

clean_session=True,userdata=None,protocol=mqtt.MQTTv311,

transport=“tcp”)其中,各參數(shù)含義如下:client_id:客戶端ID,此處一般采用設(shè)備名稱。clean_session:表示客戶端類型的布爾值。值為True時,服務(wù)器將在斷開連接時刪除有關(guān)此客戶端的所有信息。值為False時,則表示客戶端是持久客戶端,當(dāng)客戶端斷開連接時,將保留訂閱信息和排隊消息。userdata:用戶定義的任何類型的數(shù)據(jù)。protocol:MQTT協(xié)議版本,可以是MQTTv31或MQTTv311transport:連接方式,可以設(shè)置為websockets或tcp,默認(rèn)值為TCP。安全鑒權(quán)客戶端建立后,調(diào)用安全設(shè)置相關(guān)函數(shù),包括證書及用戶名、密碼進(jìn)行鑒權(quán)和加密。采用證書進(jìn)行SSL/TLS加密,需要將證書文件放入同一項目下,與程序文件在相同文件夾內(nèi),采用如下代碼進(jìn)行證書導(dǎo)入:client.tls_set(ca_certs='serverCert.pem',cert_reqs=CERT_REQUIRED)client.tls_insecure_set(True)除了采用證書外,網(wǎng)站需要通過用戶名、密碼對設(shè)備進(jìn)行認(rèn)證,本項目均采用產(chǎn)品ID和token的組合進(jìn)行鑒權(quán)

client.username_pw_set(username=product_id,password=api_token)值得注意的是,計算token有不同的方式,在具體執(zhí)行前,一般需要查閱開發(fā)者文檔,明確token計算方式后,進(jìn)行計算?;卣{(diào)函數(shù)當(dāng)建立連接后,服務(wù)器會給客戶端反饋信息,此時會調(diào)用on_connect函數(shù)。在調(diào)用前,首先需要對函數(shù)功能進(jìn)行定義,一般回調(diào)函數(shù)中,可以打印系統(tǒng)反饋信息,便于不登陸OneNET平臺的情況下,了解連接建立情況,以下給出示例:defon_connect(client,userdata,flags,rc):print(mqtt.connack_string(rc)+'rc:%s'%rc)函數(shù)包含四個參數(shù),其中client和rc為常用參數(shù):client:表示回調(diào)的客戶端。rc:表示連接結(jié)果。一般rc為0表示連接成功。1~5表示連接失敗,1表示協(xié)議版本有錯,2表示客戶端標(biāo)識符無效,3表示服務(wù)器不可用,4表示用戶名密碼錯誤,5表示未授權(quán)。定義函數(shù)后,通過以下代碼調(diào)用回調(diào)函數(shù)。client.on_connect=on_connect注意:回調(diào)函數(shù)在使用過程中,一旦行為發(fā)現(xiàn)就執(zhí)行函數(shù),類似中斷。此處,一旦連接行為發(fā)生,就執(zhí)行回調(diào)函數(shù),打印連接結(jié)果。保持連接在建立連接后,一般采用loop()來保持時刻處于工作狀態(tài)。常用的保持連接的函數(shù)包括以下幾個:loop(timeout=1.0,max_packets=1)通常會調(diào)用該函數(shù)來等待網(wǎng)絡(luò)連接可用后,來處理與網(wǎng)絡(luò)的數(shù)據(jù)交互。其中,timeout表示等待時間,單位秒,該時長不超過client的keepalive值。loop_start()/loop_stop()調(diào)用loop_start(),會在建立一個線程,在連接后自動調(diào)用loop()。通過調(diào)用loop_stop()來停止后臺線程。loop_forever()/disconnect()調(diào)用loop_forever()會自動處理重新連接,在調(diào)用disconnect()之前一直保持工作狀態(tài)。本文中,通過調(diào)用client.loop_start()來維持工作狀態(tài)。軟件代碼if__name__=='__main__':host='6'port=8883access_key=‘xxxxx’#設(shè)備keyauth_info=‘temp’#設(shè)備名稱client_idproduct_id=‘xxxxxx’#產(chǎn)品IDusername#計算token

api_token=token(product_id,access_key,auth_info)print(api_token)#創(chuàng)建客戶端

client=mqtt.Client(client_id=auth_info,protocol=mqtt.MQTTv311)#調(diào)用連接回調(diào)函數(shù)

client.on_connect=on_connect#設(shè)置證書認(rèn)證

client.tls_set(ca_certs='serverCert.pem',cert_reqs=CERT_REQUIRED)client.tls_insecure_set(True)#設(shè)置用戶名、密碼

client.username_pw_set(username=product_id,password=api_token)#建立連接

client.connect(host=host,port=port,keepalive=30)client.loop_start()whileTrue:time.sleep(1)importpaho.mqtt.clientasmqttimporttimeimportbase64importhmacfromurllib.parseimportquotefrom_sslimportCERT_NONE,CERT_OPTIONAL,CERT_REQUIRED

#定義token計算函數(shù)deftoken(product_id,access_key,auth_info=None):…..#此處省略代碼#定義回調(diào)函數(shù)defon_connect(client,userdata,flags,rc):#打印連接狀態(tài)

print(mqtt.connack_string(rc)+'rc:%s'%rc)

第四部分

發(fā)布信息PART0404實驗介紹【實驗?zāi)康摹浚?)掌握MQTT協(xié)議發(fā)布信息的Python語言移植方法(2)掌握Python語言的常用指令及代碼解讀【實驗設(shè)備】(1)PC一臺(2)Python軟件、Pycharm編程環(huán)境【實驗要求】針對OneNET平臺現(xiàn)有的MQTT設(shè)備,使用Python語言實現(xiàn)設(shè)備端信息發(fā)布。發(fā)布函數(shù)調(diào)用如下函數(shù),實現(xiàn)數(shù)據(jù)點發(fā)布:publish(topic,payload,qos,retain)函數(shù)包含四個參數(shù),重點設(shè)置前三項參數(shù):topic:表示發(fā)布信息的主題。payload:表示要發(fā)布的具體信息qos:服務(wù)質(zhì)量,分別為0、1、2三種級別以下給出示例:client.publish(pub_topic,json.dumps(body),qos=0)軟件代碼importpaho.mqtt.clientasmqttimporttimeimportbase64importhmacfromurllib.parseimportquotefrom_sslimportCERT_NONE,CERT_OPTIONAL,CERT_REQUIREDimportjsonimportrequests#定義token計算函數(shù),此處省略token定義函數(shù)具體代碼,與上述相同deftoken(product_id,access_key,auth_info=None):……#定義連接回調(diào)函數(shù)defon_connect(client,userdata,flags,rc):print(mqtt.connack_string(rc)+'rc:%s'%rc)軟件代碼if__name__=='__main__':host='6'port=8883access_key='xxxxx'#devicekeyauth_info='temp'#client_idproduct_id='xxxxxx'#username#計算tokenapi_token=token(product_id,access_key,auth_info)print(api_token)#新建MQTT連接

client=mqtt.Client(client_id=auth_info,protocol=mqtt.MQTTv311)#調(diào)用連接回調(diào)函數(shù)

client.on_connect=on_connect#設(shè)置證書認(rèn)證

client.tls_set(ca_certs='serverCert.pem',cert_reqs=CERT_REQUIRED)client.tls_insecure_set(True)#設(shè)置用戶名、密碼

client.username_pw_set(username=product_id,password=api_token)#建立連接

client.connect(host=host,port=port,keepalive=30)client.loop_start()whileTrue:num=20#定義數(shù)據(jù)流,id為123,數(shù)據(jù)流名稱為temperature,值為numbody={"id":123,"dp":{"temperature":[{"v":num,}]}}#定義發(fā)布信息的topic

pub_topic='$sys/%s/%s/dp/post/json'%(product_id,auth_info)

print(pub_topic)print('dp:temperature->%s'%num)#發(fā)布信息

client.publish(pub_topic,json.dumps(body),qos=0)

time.sleep(10)

第五部分

訂閱主題/取消訂閱PART0505實驗介紹【實驗?zāi)康摹浚?)掌握MQTT協(xié)議訂閱主題/取消訂閱的Python語言移植方法(2)掌握Python語言的常用指令及代碼解讀【實驗設(shè)備】(1)PC一臺(2)Python軟件、Pycharm編程環(huán)境【實驗要求】針對OneNET平臺現(xiàn)有的MQTT設(shè)備,使用Python語言實現(xiàn)設(shè)備端訂閱平臺開放權(quán)限的主題訂閱。訂閱主題1、選擇topic為了能在底層程序端直接查看數(shù)據(jù)上傳是否成功,可訂閱如下topic:$sys/{pid}/{device-name}/dp/post/json/accepted$sys/{pid}/{device-name}/dp/post/json/rejected上述topic分別表示系統(tǒng)通知"設(shè)備上傳數(shù)據(jù)點成功"。訂閱主題2、訂閱topic調(diào)用如下函數(shù),實現(xiàn)訂閱主題:subscribe(topic,qos)函數(shù)包含兩個參數(shù):topic:表示訂閱的主題。qos:服務(wù)質(zhì)量,分別為0、1、2三種級別以下給出示例:client.subscribe('$sys/%s/%s/dp/post/json/+'%(product_id,auth_info),qos=0)該示例中,用通配字符+表示訂閱該層多個主題。回調(diào)函數(shù)在收到客戶端訂閱主題的消息后,通常會調(diào)用on_message函數(shù)來打印接收到的反饋信息。在調(diào)用前,會對該函數(shù)具體執(zhí)行內(nèi)容進(jìn)行定義:defon_message(client,userdata,msg):print('ON_MESSAGE:'+msg.topic+"",msg.payload)函數(shù)包含三個參數(shù):client:表示回調(diào)的客戶端。userdata:表示設(shè)置的私有數(shù)據(jù)。msg:接收到的消息的具體信息。定義函數(shù)后,通過以下代碼進(jìn)行函數(shù)調(diào)用。client.on_message=on_message取消訂閱調(diào)用如下函數(shù),實現(xiàn)數(shù)據(jù)點發(fā)布:unsubscribe(topic,qos)函數(shù)包含四個參數(shù),重點設(shè)置前三項參數(shù):topic:表示訂閱的主題。qos:服務(wù)質(zhì)量,分別為0、1、2三種級別以下給出示例:client.unsubscribe('$sys/%s/%s/dp/post/json/+'%(product_id,auth_info),qos=0)軟件代碼importpaho.mqtt.clientasmqttimporttimeimportbase64importhmacfromurllib.parseimportquotefrom_sslimportCERT_NONE,CERT_OPTIONAL,CERT_REQUIREDimportjsonimportrequests#定義token計算函數(shù),此處省略token定義函數(shù)具體代碼,與上述相同deftoken(product_id,access_key,auth_info=None):……#定義連接回調(diào)函數(shù)defon_connect(client,userdata,flags,rc):print(mqtt.connack_string(rc)+'rc:%s'%rc)#當(dāng)連接成功后,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論