項(xiàng)目3任務(wù)4-物聯(lián)網(wǎng)APP中的變量與函數(shù)_第1頁
項(xiàng)目3任務(wù)4-物聯(lián)網(wǎng)APP中的變量與函數(shù)_第2頁
項(xiàng)目3任務(wù)4-物聯(lián)網(wǎng)APP中的變量與函數(shù)_第3頁
項(xiàng)目3任務(wù)4-物聯(lián)網(wǎng)APP中的變量與函數(shù)_第4頁
項(xiàng)目3任務(wù)4-物聯(lián)網(wǎng)APP中的變量與函數(shù)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(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,通信時(shí)需要使用Handler實(shí)現(xiàn)消息的傳遞。任務(wù)引入APP的頁面2使用MQTT通信,包括通過APP發(fā)送MQTT消息(控制命令),以及接收MQTT消息并顯示。任務(wù)3通過MQTT的配置,已經(jīng)可以在Android工程中使用MQTT相關(guān)的基礎(chǔ)方法了,如執(zhí)行連接、訂閱消息、發(fā)布消息。因?yàn)槭蔷W(wǎng)絡(luò)通信,所以MQTT現(xiàn)有的方法還需要考慮各種異常的處理,才能夠正常使用。二、相關(guān)知識(shí)為什么需要Handler類當(dāng)多個(gè)線程并發(fā)操作UI組件,可能導(dǎo)致線程不安全,故Android并不允許在UI線程(主線程)外操作UI。正確的做法是:Android應(yīng)用啟動(dòng)后默認(rèn)開啟一個(gè)主線程;如果其他子線程要更新UI,可以將要更新的內(nèi)容通過Handler傳遞給主線程,在主線程中完成UI更新。Handler執(zhí)行流程如圖3-19所示,Handler執(zhí)行流程如下:首先,在主線程中直接創(chuàng)建Handler對(duì)象;然后,子線程想修改Activity中的UI組件時(shí),可以通過Handler對(duì)象向主線程發(fā)送消息;最后,發(fā)送的消息會(huì)先到主線程的MessageQueue(消息隊(duì)列)等待,由Looper按先入先出順序取出,再由Handler根據(jù)message對(duì)象的what屬性對(duì)應(yīng)進(jìn)行處理。圖3-19Handler執(zhí)行流程二、相關(guān)知識(shí)課堂討論Android并不允許我們?cè)赨I線程外操作UI,如果嘗試的話,能夠成功嗎?三、任務(wù)實(shí)施實(shí)施設(shè)備安裝了AndroidStudio開發(fā)環(huán)境的計(jì)算機(jī),部署了MQTT服務(wù)器的云服務(wù)器。1.變量與對(duì)象在SecondActivity.java中定義以下變量與對(duì)象:ActivitySecondBindingbinding2;//創(chuàng)建activity_second布局類對(duì)象privateStringhost="tcp://69:1883";//EMQX物聯(lián)網(wǎng)服務(wù)器privateStringusername="user";//EMQX服務(wù)器未設(shè)MQTT客戶端登錄密碼,所以可以空著;假如設(shè)置了客戶端訪問的賬號(hào)密碼,就必須輸入privateStringpassword="";privateStringmqtt_id=;//獨(dú)一無二的,可以用手機(jī)號(hào)、qq號(hào)等privateStringmqtt_sub_topic="my_FX/post";//:/手機(jī)號(hào)/my_FX/post,代表MQTT.fx上報(bào)的消息privateStringmqtt_pub_topic="my_APP/set";//:/手機(jī)號(hào)/my_APP/set,代表APP發(fā)布的命令privateintLedStatus=0;//APP發(fā)布的消息為{"LedStatus":0},{"LedStatus":1},將用于控制網(wǎng)關(guān)所接Led實(shí)施過程三、任務(wù)實(shí)施privateintLedStatus=0;//APP發(fā)布的消息為{"LedStatus":0},{"LedStatus":1},將用于控制網(wǎng)關(guān)所接LedprivateScheduledExecutorServicescheduler;privateMqttClientclient;privateMqttConnectOptionsoptions;//MQTT連接時(shí)的參數(shù)privateHandlerhandler;其中定義了MQTT服務(wù)器IP地址、服務(wù)器端口號(hào)、客戶端用戶名,客戶端登錄密碼、客戶端ID、客戶端發(fā)布消息主題、客戶端訂閱消息主題等。注意:創(chuàng)建的MQTT客戶端ID不能和其他MQTT客戶端ID沖突。以上代碼還創(chuàng)建了binding、調(diào)度器、MQTT客戶端、MQTT參數(shù)、Handler等對(duì)象。三、任務(wù)實(shí)施2.函數(shù)onCreate函數(shù)后面復(fù)制5個(gè)函數(shù)。(1)初始化函數(shù)。//1-Mqtt初始化函數(shù)privatevoidMqtt_init(){try{//host主機(jī)名,clientid連接MQTT的客戶端ID,MemoryPersistence設(shè)置clientid保存形式,默認(rèn)以內(nèi)存保存client=newMqttClient(host,mqtt_id,newMemoryPersistence());//MQTT的連接設(shè)置options=newMqttConnectOptions();//設(shè)置是否清空session,false表示服務(wù)器會(huì)保留客戶端連接記錄,true表示每次都以新身份連接服務(wù)器options.setCleanSession(false);//設(shè)置連接的用戶名options.setUserName(username);//設(shè)置連接密碼options.setPassword(password.toCharArray());//設(shè)置超時(shí)時(shí)間,單位為秒options.setConnectionTimeout(10);三、任務(wù)實(shí)施//設(shè)置會(huì)話心跳時(shí)間options.setKeepAliveInterval(60);//設(shè)置回調(diào)client.setCallback(newMqttCallback(){@OverridepublicvoidconnectionLost(Throwablethrowable){//連接丟失后,一般在這里進(jìn)行重新連接System.out.println("ConnectionLost");//startReconnect();}@OverridepublicvoiddeliveryComplete(IMqttDeliveryTokeniMqttDeliveryToken){//publish后會(huì)執(zhí)行到這里System.out.println("deliveryComplete"+iMqttDeliveryToken.isComplete());}@OverridepublicvoidmessageArrived(Strings,MqttMessagemqttMessage)throwsException{//subscribe后得到的消息會(huì)執(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í)施通過初始化函數(shù),完成MQTT的初始化。例如:將MQTT客戶端client實(shí)例化,設(shè)置MQTT連接的參數(shù)options,通過setCallback方法設(shè)置回調(diào)。回調(diào)中最關(guān)鍵的是messageArrived函數(shù)。當(dāng)MQTT客戶端client收到訂閱的消息后,會(huì)將消息的主題、內(nèi)容拼接在一起作為obj,再增加標(biāo)志位what,回傳給UI線程的handler對(duì)象,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ù)實(shí)施因?yàn)檫B接網(wǎng)絡(luò)耗時(shí),所以需要開啟子線程。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ù)實(shí)施(3)重連接函數(shù)。//3-MQTT重連privatevoidstartReconnect(){scheduler=Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate(newRunnable(){@Overridepublicvoidrun(){if(!client.isConnected()){Mqtt_connect();}}},0*1000,10*1000,TimeUnit.MILLISECONDS);}在重連接函數(shù)中,實(shí)現(xiàn)了一個(gè)定時(shí)任務(wù),該任務(wù)會(huì)在一次任務(wù)執(zhí)行完畢的間隔時(shí)間后,才會(huì)執(zhí)行下一次任務(wù)。任務(wù)就是調(diào)用連接函數(shù),實(shí)現(xiàn)客戶端對(duì)MQTT服務(wù)器的連接。三、任務(wù)實(shí)施(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ù)會(huì)調(diào)用client對(duì)象的publish方法,發(fā)布一條消息到MQTT服務(wù)器。publishmessageplus函數(shù)的第一個(gè)參數(shù)是消息topic(主題),第二個(gè)參數(shù)是消息的payload(載荷)。MQTT服務(wù)器收到消息后,會(huì)轉(zhuǎn)發(fā)消息給所有訂閱了消息topic的MQTT客戶端。三、任務(wù)實(shí)施(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ù)實(shí)施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)到下一頁時(shí),如果MQTT客戶端還在連接的話,需要釋放掉資源,可以在btn21的事件監(jiān)聽中調(diào)用disconnect()函數(shù)實(shí)現(xiàn),如圖3-21所示。三、任務(wù)實(shí)施(2)Handler處理。對(duì)象handler是在UI線程創(chuàng)建的,重寫了處理消息的方法:handleMessage。處理時(shí),根據(jù)message對(duì)象的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://開機(jī)校驗(yàn)更新回傳,未用到break;case2://反饋回傳,未用到break;三、任務(wù)實(shí)施

溫馨提示

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

評(píng)論

0/150

提交評(píng)論