1. 程式人生 > >Android MQTT 釋出訂閱多個主題

Android MQTT 釋出訂閱多個主題

 公司是做Zwave智慧家居的,以前和伺服器連線是TCP長連線,最近想將伺服器切換為MQTT伺服器,做到主機與主機之間實現資料互通,這樣就能以組網的方式,靈活的搭建使用場景,做到從家裝到工裝的轉變,甚至跨平臺的控制。從理論上是可行的,實際上又要開始填坑了。

先說下大概的使用場景,如一個家庭A(別墅型),面積大,有五臺用來控制裝置的主機(ABCDE),每臺主機有屬於其自己的裝置,目前的是可以直接控制的,現在的需求是需要主機之間能相互控制對方的裝置。思路其實很簡單,就是主機之間要相互通訊,各自知道各自有什麼裝置,控制的時候將想要控制的裝置傳送給對方,對方再執行。參與MQTT來說,就是每臺主機即是訂閱者,又是釋出者。

MQTT的使用非常簡單,網上有很多相關的例子,如(https://blog.csdn.net/qq_27600345/article/details/80741284)(PS:但基本都是入門級的使用,很多東西還是需要自己慢慢探索的,也許是我沒找到相關塊的資料)。這裡就不再貼程式碼了,簡單的說下遇到的問題,雖然現在回過頭去很簡單,但還是浪費了我一天的時間,裡面有無數次抓狂。

首先是多個訂閱的方法,這個比較容易,有心的話基本不用找資料都能發現:

SDK中已經提供了訂閱多個主題的方法Client.subscribe(String[] topicFilters, int[] qos),只要把主題拼成陣列就行了。

其次,就是釋出多個主題,這也是困了我整整一天的問題,裡論上獲取多個topic,然後迴圈傳送就可以了,然後測試的時候發現當第一個釋出成功之後MQTT伺服器直接斷掉了,然後各種找資料,各種找原因,後面一步一步除錯發現不是方法的問題。

其實這樣迴圈布是可行的,伺服器一直斷線的原因是我接收到資料之後寫了個回撥,然後在回撥裡面直接處理資料了,資料量有點大,一兩秒還是要的,然後阻塞了接收訊息的執行緒,造成後續資料進不來,把伺服器卡掉線了。把回撥扔到執行緒池裡就可以了。

從結果來看,messageArrived應該是單執行緒操作,所以不能進行耗時操作,回過頭去看,確實非常簡單,但就這麼句程式碼,整整困惑了我一天,但這也怪自己不能靜下心來除錯,平時也沒注意這個。希望對遇到同樣問題的同學有個參考。

相關推薦

Android MQTT 釋出訂閱主題

 公司是做Zwave智慧家居的,以前和伺服器連線是TCP長連線,最近想將伺服器切換為MQTT伺服器,做到主機與主機之間實現資料互通,這樣就能以組網的方式,靈活的搭建使用場景,做到從家裝到工裝的轉變,甚至跨平臺的控制。從理論上是可行的,實際上又要開始填坑了。 先說下大概的使用

Android專案中出現名字相同的重複檔案

Android專案中出現多個名字相同的重複檔案,Android studio就不知道該引用哪個檔案,這是就會報錯! 我的錯誤例如以下: 其實這是同一個型別問題,產生的原因是有多於一個的相同名稱的檔案存在,系統不知道該引用哪一個檔案而報錯, 解決方式是: 在module

(Android Studio)gradle配置程式碼倉庫repositories

repositories {     mavenCentral()     maven { url "https://jitpack.io" }     maven { url "http://maven.al

android studio3》在activity之間傳遞引數

z.B:啟動一個特定的Activity Intent intent=new Intent(CurrentActivity.this,OtherActivity.class); startActivity(intent); 如果想要傳遞Pra的話,就是i.put...在自動跳出的備選中選擇,有很多型別

Docker 1.8釋出帶來新工具

Docker公司 宣佈Docker 1.8釋出,該版本包括工具的新增和更新,同時帶來了新的引擎特性。 Docker工具箱(Docker Toolbox)提供了打包的系統,目標是成為“獲取和使用Docker開發環境執行的最快方式”,並替換 Boot2

android中Webview設定cookie引數

有時候需要在cookie中設定多個引數傳遞給前端頁面,常用的是 token和渠道號 。將N個引數的key-value按照分號分開然後一次設定,一直只使用token第一個引數,可以正常獲取,所以沒問題,比如 StringBuilder sbCookie = n

android studio如何將module統一放在一個目錄下

1.root工程下新建extra資料夾 2.將一個module拖進extra資料夾 3.在setting.gradle中將原有的:moduleName改為:extra:moduleName,同步一下。完成。

Android同時按下按鈕

關鍵字: 多點觸控, 控制元件, 按鈕, Android, 同時按下 【也許這樣能幫到更多人檢索到??】 很久沒寫博文了,最近在做畢業設計的過程中,碰到了這樣一個問題,之前一直沒遇到過,走了一些彎路,現在寫下來記錄下。 在百度的過程中並沒有看到有相關的解答,而更多的還是帶你走向彎路的

關於Android的.so檔案---第三方庫載入到工程讀取不到.so的解決辦法

原文連結 早期的Android系統幾乎只支援ARMv5的CPU架構,你知道現在它支援多少種嗎?7種! Android系統目前支援以下七種不同的CPU架構:ARMv5,ARMv7 (從2010年起),x86 (從2011年起),MIPS (從2012年起),ARMv8,MIPS64和x86_64 (從

如何高效的編寫與同步部落格(二)- 快速釋出渠道

系列目錄 一.前言 我們使用Markdown編寫博文,總免不了文章中出現圖片,這裡的圖片有兩種型別,一種是放在網際網路上的,一種是放在本地的。如果我引用的是網際網路上的圖片(如 https://xxx.com/xxx.png ),我們在各個渠道釋出的時候只需要複製貼上即可,但是這帶來一個問題,如果我們引用圖

android-Webview】設定cookie,實現webview中儲存登入資訊

方法:通過重複呼叫 cookieManager.setCookie(url,cookie1); 來儲存多個cookie。 程式碼: /** * Sync Cookie */ private void syncCookie(Context

thinkphp5.0設定主題

thinkphp\library\think\view\driver\Think.php 修改 public function __construct($config =[]) {

android 使用Notification彈通知時,點選跳轉intent取值時總是最後一個

最近開發中模組功能,使用NotificationManager觸發多個Notification: private void showIMNotification(Context context, String ticker, Bitmap defaultBitmap

android 當系統存在Launcher時,如何設定開機自動進入預設的Launcher?

來自MTK  FAQ 當系統存在多個Launcher時,開機完成並解鎖後,系統會彈出一個選擇框讓使用者選擇進入哪一個Launcher,如果不想選擇,而是想直接進入某一個預設的Launcher,並且使用者在設定->應用程式->管理應用程式->所有應用程式列

利用Android廣播機制關閉activity

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, In

android xml 中嵌入xml頁面

採用TabHost的方式,可以方便在xml中插入獨立的多個xml,而不必將所有的程式碼寫入到一個xml中,降低了xml 黏連性。 簡單解釋: 建立以個mail.xml,其中加入two.xml和three.xml,同時建立每一個xml的activity,其中main的act

MQTT釋出訂閱程式完整程式碼

工具類,包含有釋出者方法和訂閱者方法。 package cn.com.bonc.wholeCode; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persis

android、windows上USB Camera同時使用實驗小結

android、windows上多個USB Camera同時使用實驗小結            USB Camera是個不錯的東西,但是多個USB Camera能同時開啟使用嗎?筆者在windows PC上做過實驗,分兩種情況:         實驗一:將兩個USB C

Android ViewPager放入XML。如何監聽其的控制元件?

我在一個Activity裡面加入了ViewPager。 ViewPager裡面放了兩個XML。XML裡面有幾個TextView控制元件。我想在這個Activity裡面加入ViewPager中XML裡面的控制元件監聽,並且響應點選TextView之後彈出提示框的事件。但是卻一直苦於無法通過findById()

Android----高德地圖Marker載入網路圖片出現圖片不顯示問題

需求說要地圖上展示的是mark,不是infowindow,加載出網路圖片,由於app的marker比較多,沒有達到需要的效果。 看了看高德地圖api中有這個方法 markerOption.icon(BitmapDescriptorFactory.fromBitmap(Bi