




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2相關(guān)知識34任務(wù)小結(jié)與練習(xí)1任務(wù)實施任務(wù)引入與目標(biāo)物聯(lián)網(wǎng)APP的MQTT變量與函數(shù)一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)任務(wù)4介紹MQTT需要定義的變量,并在MQTT方法的基礎(chǔ)上,編寫初始化、連接、重連接、發(fā)布消息、關(guān)閉連接函數(shù)。使用的Activity文件為SecondActivity.java,通信時需要使用Handler實現(xiàn)消息的傳遞。任務(wù)引入APP的頁面2使用MQTT通信,包括通過APP發(fā)送MQTT消息(控制命令),以及接收MQTT消息并顯示。任務(wù)3通過MQTT的配置,已經(jīng)可以在Android工程中使用MQTT相關(guān)的基礎(chǔ)方法了,如執(zhí)行連接、訂閱消息、發(fā)布消息。因為是網(wǎng)絡(luò)通信,所以MQTT現(xiàn)有的方法還需要考慮各種異常的處理,才能夠正常使用。二、相關(guān)知識為什么需要Handler類當(dāng)多個線程并發(fā)操作UI組件,可能導(dǎo)致線程不安全,故Android并不允許在UI線程(主線程)外操作UI。正確的做法是:Android應(yīng)用啟動后默認(rèn)開啟一個主線程;如果其他子線程要更新UI,可以將要更新的內(nèi)容通過Handler傳遞給主線程,在主線程中完成UI更新。Handler執(zhí)行流程如圖3-19所示,Handler執(zhí)行流程如下:首先,在主線程中直接創(chuàng)建Handler對象;然后,子線程想修改Activity中的UI組件時,可以通過Handler對象向主線程發(fā)送消息;最后,發(fā)送的消息會先到主線程的MessageQueue(消息隊列)等待,由Looper按先入先出順序取出,再由Handler根據(jù)message對象的what屬性對應(yīng)進(jìn)行處理。圖3-19Handler執(zhí)行流程二、相關(guān)知識課堂討論Android并不允許我們在UI線程外操作UI,如果嘗試的話,能夠成功嗎?三、任務(wù)實施實施設(shè)備安裝了AndroidStudio開發(fā)環(huán)境的計算機,部署了MQTT服務(wù)器的云服務(wù)器。1.變量與對象在SecondActivity.java中定義以下變量與對象:ActivitySecondBindingbinding2;//創(chuàng)建activity_second布局類對象privateStringhost="tcp://69:1883";//EMQX物聯(lián)網(wǎng)服務(wù)器privateStringusername="user";//EMQX服務(wù)器未設(shè)MQTT客戶端登錄密碼,所以可以空著;假如設(shè)置了客戶端訪問的賬號密碼,就必須輸入privateStringpassword="";privateStringmqtt_id=;//獨一無二的,可以用手機號、qq號等privateStringmqtt_sub_topic="my_FX/post";//:/手機號/my_FX/post,代表MQTT.fx上報的消息privateStringmqtt_pub_topic="my_APP/set";//:/手機號/my_APP/set,代表APP發(fā)布的命令privateintLedStatus=0;//APP發(fā)布的消息為{"LedStatus":0},{"LedStatus":1},將用于控制網(wǎng)關(guān)所接Led實施過程三、任務(wù)實施privateintLedStatus=0;//APP發(fā)布的消息為{"LedStatus":0},{"LedStatus":1},將用于控制網(wǎng)關(guān)所接LedprivateScheduledExecutorServicescheduler;privateMqttClientclient;privateMqttConnectOptionsoptions;//MQTT連接時的參數(shù)privateHandlerhandler;其中定義了MQTT服務(wù)器IP地址、服務(wù)器端口號、客戶端用戶名,客戶端登錄密碼、客戶端ID、客戶端發(fā)布消息主題、客戶端訂閱消息主題等。注意:創(chuàng)建的MQTT客戶端ID不能和其他MQTT客戶端ID沖突。以上代碼還創(chuàng)建了binding、調(diào)度器、MQTT客戶端、MQTT參數(shù)、Handler等對象。三、任務(wù)實施2.函數(shù)onCreate函數(shù)后面復(fù)制5個函數(shù)。(1)初始化函數(shù)。//1-Mqtt初始化函數(shù)privatevoidMqtt_init(){try{//host主機名,clientid連接MQTT的客戶端ID,MemoryPersistence設(shè)置clientid保存形式,默認(rèn)以內(nèi)存保存client=newMqttClient(host,mqtt_id,newMemoryPersistence());//MQTT的連接設(shè)置options=newMqttConnectOptions();//設(shè)置是否清空session,false表示服務(wù)器會保留客戶端連接記錄,true表示每次都以新身份連接服務(wù)器options.setCleanSession(false);//設(shè)置連接的用戶名options.setUserName(username);//設(shè)置連接密碼options.setPassword(password.toCharArray());//設(shè)置超時時間,單位為秒options.setConnectionTimeout(10);三、任務(wù)實施//設(shè)置會話心跳時間options.setKeepAliveInterval(60);//設(shè)置回調(diào)client.setCallback(newMqttCallback(){@OverridepublicvoidconnectionLost(Throwablethrowable){//連接丟失后,一般在這里進(jìn)行重新連接System.out.println("ConnectionLost");//startReconnect();}@OverridepublicvoiddeliveryComplete(IMqttDeliveryTokeniMqttDeliveryToken){//publish后會執(zhí)行到這里System.out.println("deliveryComplete"+iMqttDeliveryToken.isComplete());}@OverridepublicvoidmessageArrived(Strings,MqttMessagemqttMessage)throwsException{//subscribe后得到的消息會執(zhí)行到這里面System.out.println("MessageArrived");Messagemsg=newMessage();msg.what=3;//收到消息標(biāo)志位msg.obj=s+""+mqttMessage.toString();handler.sendMessage(msg);//hander回傳}});}catch(Exceptione){e.printStackTrace();}}三、任務(wù)實施通過初始化函數(shù),完成MQTT的初始化。例如:將MQTT客戶端client實例化,設(shè)置MQTT連接的參數(shù)options,通過setCallback方法設(shè)置回調(diào)?;卣{(diào)中最關(guān)鍵的是messageArrived函數(shù)。當(dāng)MQTT客戶端client收到訂閱的消息后,會將消息的主題、內(nèi)容拼接在一起作為obj,再增加標(biāo)志位what,回傳給UI線程的handler對象,handler處理后可以用于更新UI。//2-Mqtt初始化函數(shù)privatevoidMqtt_connect(){newThread(newRunnable(){@Overridepublicvoidrun(){try{if(!(client.isConnected())){//如果還未連接client.connect(options);Messagemsg=newMessage();msg.what=31;handler.sendMessage(msg);}(2)連接函數(shù)。三、任務(wù)實施因為連接網(wǎng)絡(luò)耗時,所以需要開啟子線程。MQTT連接函數(shù)是在重連接函數(shù)中被調(diào)用的。如果連接成功,那么回傳給handler的標(biāo)志位what為31;如果連接失敗,那么回傳給handler的標(biāo)志位what為30。UI線程的handler處理后可以用于更新UI。}catch(Exceptione){e.printStackTrace();Messagemsg=newMessage();msg.what=30;handler.sendMessage(msg);}}}).start();}三、任務(wù)實施(3)重連接函數(shù)。//3-MQTT重連privatevoidstartReconnect(){scheduler=Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate(newRunnable(){@Overridepublicvoidrun(){if(!client.isConnected()){Mqtt_connect();}}},0*1000,10*1000,TimeUnit.MILLISECONDS);}在重連接函數(shù)中,實現(xiàn)了一個定時任務(wù),該任務(wù)會在一次任務(wù)執(zhí)行完畢的間隔時間后,才會執(zhí)行下一次任務(wù)。任務(wù)就是調(diào)用連接函數(shù),實現(xiàn)客戶端對MQTT服務(wù)器的連接。三、任務(wù)實施(4)發(fā)布消息函數(shù)。//4-MQTT重連privatevoidpublishmessageplus(Stringtopic,Stringmessage2){if(client==null||!client.isConnected()){return;}MqttMessagemessage=newMqttMessage();message.setPayload(message2.getBytes());try{client.publish(topic,message);}catch(MqttExceptione){e.printStackTrace();}}publishmessageplus函數(shù)會調(diào)用client對象的publish方法,發(fā)布一條消息到MQTT服務(wù)器。publishmessageplus函數(shù)的第一個參數(shù)是消息topic(主題),第二個參數(shù)是消息的payload(載荷)。MQTT服務(wù)器收到消息后,會轉(zhuǎn)發(fā)消息給所有訂閱了消息topic的MQTT客戶端。三、任務(wù)實施(5)關(guān)閉連接函數(shù)。//5-MQTT重連publicvoiddisconnect(){try{if(client!=null){if(client.isConnected())client.unsubscribe(mqtt_sub_topic);client.disconnect();client.close();client=null;}}catch(Exceptione){e.printStackTrace();}}在關(guān)閉連接函數(shù)中,分為3步:取消訂閱,斷開連接,關(guān)閉客戶端。三、任務(wù)實施3.OnCreate方法(1)調(diào)用初始化和重連接函數(shù)。在OnCreate方法中,調(diào)用MQTT初始化和重連接函數(shù),如圖3-20所示。圖3-20調(diào)用MQTT初始化和重連接函數(shù)圖3-21調(diào)用disconnect()函數(shù)跳轉(zhuǎn)到下一頁時,如果MQTT客戶端還在連接的話,需要釋放掉資源,可以在btn21的事件監(jiān)聽中調(diào)用disconnect()函數(shù)實現(xiàn),如圖3-21所示。三、任務(wù)實施(2)Handler處理。對象handler是在UI線程創(chuàng)建的,重寫了處理消息的方法:handleMessage。處理時,根據(jù)message對象的what屬性值分別進(jìn)行處理:①如果回傳的標(biāo)志位是3(收到訂閱消息),則在屏幕上Toast消息內(nèi)容(UI刷新);②如果回傳的標(biāo)志位是30(連接失敗),則在屏幕上Toast“連接失敗”(UI刷新);③如果回傳的標(biāo)志位是31(連接成功),則在屏幕上Toast“連接成功”(UI刷新)。代碼如下:handler=newHandler(){@SuppressLint("SetTextI18n")publicvoidhandleMessage(Messagemsg){super.handleMessage(msg);switch(msg.what){case1://開機校驗更新回傳,未用到break;case2://反饋回傳,未用到break;三、任務(wù)實施
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海普陀區(qū)2025年高三壓軸卷化學(xué)試卷含解析
- 康復(fù)運動訓(xùn)練培訓(xùn)課件
- 工程供應(yīng)鏈管理概述
- 福建省泉州市2023年第29屆WMO競賽六年級數(shù)學(xué)下學(xué)期競賽試卷
- 2025屆福建省永安市一中高考化學(xué)三模試卷含解析
- 手工燈具制作課件
- 截癱定位診斷
- 2025屆江蘇省橫林高級中學(xué)高考化學(xué)考前最后一卷預(yù)測卷含解析
- 勞動安全教育小班
- 山東省濰坊市示范中學(xué)2025年高三第一次模擬考試化學(xué)試卷含解析
- 滬教版三年級下冊數(shù)學(xué)第二單元 用兩位數(shù)乘除 測試卷附完整答案(典優(yōu))
- 酒店安全隱患排查獎懲制度
- 發(fā)生治療錯誤的應(yīng)急預(yù)案
- 廢舊家電拆解與零件再制造工藝
- 農(nóng)產(chǎn)品食品檢驗員(高級)職業(yè)技能鑒定考試題庫
- 【MOOC】模擬電子電路實驗-東南大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年注冊會計師考試稅法科目試卷與參考答案
- 《大壩安全監(jiān)測培訓(xùn)》課件
- 2024年全國中學(xué)生生物學(xué)聯(lián)賽試題含答案
- 大學(xué)藻類課件教學(xué)課件
- 報關(guān)實務(wù)-教學(xué)課件 第一章 海關(guān)概念
評論
0/150
提交評論