1. 程式人生 > 其它 >3-STM32+CH395Q(乙太網)基本控制篇(自建物聯網平臺)-編寫android連線MQTT伺服器程式

3-STM32+CH395Q(乙太網)基本控制篇(自建物聯網平臺)-編寫android連線MQTT伺服器程式

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/CH395Q/my.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

說明

這一節編寫android連線MQTT伺服器程式

提示:為了便於移植擴充套件使用,我封裝了下MQTT.這節只說明在MyMqttClint.java的移植使用

新建工程

安裝MQTT的Jar包

1.第一種方式

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'

2.第二種,我準備好了jar包,可以直接匯入 jar包

拷貝到自己工程的libs裡面

把MyMqttClient.java 檔案放到自己的工程

1.根據自己的MQTT伺服器修改MQTT資訊

2,增加網路許可權

<uses-permission android:name="android.permission.INTERNET" />

連線MQTT

1.把以下程式碼在初始化的時候呼叫一次,該程式碼寫一次即可,後期斷線自動重連

MyMqttClient.sharedCenter().setConnect();

2.安裝執行APP

訂閱主題

MyMqttClient.sharedCenter().setSubscribe("1111",0);//訂閱主題1111,訊息等級0

上面那樣子做有可能訂閱不成功,因為可能還沒連線上,

建議使用下面的方式, 設定訂閱成功回撥,用一個定時器持續訂閱

public class MainActivity extends AppCompatActivity {
    //定時器用於輪訓訂閱主題
    private Timer timerSubscribeTopic = null;
    private TimerTask TimerTaskSubscribeTopic = null
; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyMqttClient.sharedCenter().setConnect(); //MQTT連線成功回撥 MyMqttClient.sharedCenter().setOnServerConnectedCallback(new MyMqttClient.OnServerConnectedCallback() { @Override public void callback() { startTimerSubscribeTopic();//定時訂閱主題 } }); //訂閱主題成功回撥 MyMqttClient.sharedCenter().setOnServerSubscribeCallback(new MyMqttClient.OnServerSubscribeSuccessCallback() { @Override public void callback(String Topic, int qos) { if (Topic.equals("1111")){//訂閱1111成功 stopTimerSubscribeTopic();//訂閱到主題,停止訂閱 } } }); startTimerSubscribeTopic();//定時訂閱主題 } /** * 定時器每隔1S嘗試訂閱主題 */ private void startTimerSubscribeTopic(){ if (timerSubscribeTopic == null) { timerSubscribeTopic = new Timer(); } if (TimerTaskSubscribeTopic == null) { TimerTaskSubscribeTopic = new TimerTask() { @Override public void run() { MyMqttClient.sharedCenter().setSubscribe("1111",0);//訂閱主題1111,訊息等級0 } }; } if(timerSubscribeTopic != null && TimerTaskSubscribeTopic != null ) timerSubscribeTopic.schedule(TimerTaskSubscribeTopic, 0, 1000); } private void stopTimerSubscribeTopic(){ if (timerSubscribeTopic != null) { timerSubscribeTopic.cancel(); timerSubscribeTopic = null; } if (TimerTaskSubscribeTopic != null) { TimerTaskSubscribeTopic.cancel(); TimerTaskSubscribeTopic = null; } } //當活動不再可見時呼叫 @Override protected void onStop() { super.onStop(); stopTimerSubscribeTopic();//停止定時器訂閱 } /** * 當處於停止狀態的活動需要再次展現給使用者的時候,觸發該方法 */ @Override protected void onRestart() { super.onRestart(); startTimerSubscribeTopic();//定時訂閱主題 } @Override protected void onPause() { super.onPause(); stopTimerSubscribeTopic(); } }

注意:這兩個地方不可省略,只要進入頁面就啟動定時器訂閱,如果在執行過程中MQTT斷線重連了,則接著重新訂閱

取消訂閱

MyMqttClient.sharedCenter().setUnSubscribe("1111");//取消訂閱主題1111

接收訊息

哪個檔案需要獲取MQTT資料,只需要按照下面的方式寫上即可!

MyMqttClient.sharedCenter().setOnServerReadStringCallback(new MyMqttClient.OnServerReadStringCallback() {
            @Override//Topic:主題  Msg.toString():接收的訊息  MsgByte:16進位制訊息
            public void callback(String Topic, MqttMessage Msg, byte[] MsgByte) {
                Log.e("MqttMsg", "Topic: "+Topic+" Msg"+Msg.toString() );
            }
        });

釋出訊息

1.釋出字串訊息

MyMqttClient.sharedCenter().setSendData("2222","msg",0,false);//傳送字串訊息

2222:釋出的主題 msg:釋出的訊息 0:訊息等級 false:不需要伺服器記錄

2.釋出16進位制訊息

byte[] bytes= new byte[2];

bytes[0] = 0x03;

bytes[1] = 0x55;

MyMqttClient.sharedCenter().setSendData("3333",bytes,0,false);

監聽MQTT連線狀態

/*連線上MQTT*/
        MyMqttClient.sharedCenter().setOnServerConnectedCallback(new MyMqttClient.OnServerConnectedCallback() {
            @Override
            public void callback() {

            }
        });
        /*和MQTT伺服器斷開連線*/
        MyMqttClient.sharedCenter().setOnServerDisConnectedCallback(new MyMqttClient.OnServerDisConnectedCallback() {
            @Override
            public void callback(Throwable e) {

            }
        });