国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

安卓開發(fā)之mqtt協(xié)議實(shí)例代碼

2019-12-12 01:28:20
字體:
供稿:網(wǎng)友

首先物聯(lián)網(wǎng)協(xié)議mqtt協(xié)議是基于tcp/ip協(xié)議的,使用了官方的mqttclient框架

/**初始化mqttclient*/private void init() {    try {      //MQTT的連接設(shè)置      options = new MqttConnectOptions();      //host為主機(jī)名,test為clientid即連接MQTT的客戶端ID,一般以客戶端唯一標(biāo)識符表示,MemoryPersistence設(shè)置clientid的保存形式,默認(rèn)為以內(nèi)存保存      client = new MqttClient(new Ip().host, username,          new MemoryPersistence());      //設(shè)置是否清空session,這里如果設(shè)置為false表示服務(wù)器會保留客戶端的連接記錄,這里設(shè)置為true表示每次連接到服務(wù)器都以新的身份連接      options.setCleanSession(false);//options.setWill(myTopic,null,2,false);      //設(shè)置連接的用戶名      options.setUserName(login_token);      //設(shè)置連接的密碼      options.setPassword(passWord.toCharArray());      // 設(shè)置超時時間 單位為秒      options.setConnectionTimeout(10);      // 設(shè)置會話心跳時間 單位為秒 服務(wù)器會每隔1.5*20秒的時間向客戶端發(fā)送個消息判斷客戶端是否在線,但這個方法并沒有重連的機(jī)制      options.setKeepAliveInterval(60);      //設(shè)置回調(diào)      client.setCallback(new MqttCallback() {        @Override        public void connectionLost(Throwable cause) {          //連接丟失后,一般在這里面進(jìn)行重連          System.out.println("connectionLost----------");        }        @Override        public void deliveryComplete(IMqttDeliveryToken token) {          //publish后會執(zhí)行到這里          System.out.println("deliveryComplete---------"              + token.isComplete());        }        @Override        public void messageArrived(String topicName, MqttMessage message)            throws Exception {          byte[] message1 = message.getPayload();          // subscribe后得到的消息會執(zhí)行到這里面          System.out.println("messageArrived----------" + message1[0] + Arrays.toString(message1));          System.out.println(message1[0] == 5);          String id = new String(subBytes(message1, 1, 16), "UTF-8");          System.out.print("mqtt收到的id" + id);          DeviceList device = getBookById(id);          System.out.print("device" + device.getName());          String name = device.getName();          String gName = device.getgName();          String type = device.getType();          System.out.print("名字為" + name + gName);          /**          * 使用handler發(fā)送matt接收的消息,格式為二進(jìn)制數(shù)據(jù)          * */          Message msg = new Message();          msg.what = 1;          if (message1[0] == 1) {//            msg.obj = name + "設(shè)備心跳";//            handler.sendMessage(msg);            return;          }          if (message1[0] == 2) {            msg.obj = gName + "" + name + "報警";            msg.arg1 = Integer.parseInt(type);            handler.sendMessage(msg);            return;          }          if (message1[0] == 3) {            msg.obj = gName + "" + name + "上線";            handler.sendMessage(msg);            return;          }          if (message1[0] == 4) {            msg.obj = gName + "" + name + "離線";            handler.sendMessage(msg);            return;          }          if (message1[0] == 5) {            if (message1[17] == 0) {              msg.obj = gName + "" + name + "關(guān)門";            } else {              msg.obj = gName + "" + name + "開門";            }            handler.sendMessage(msg);            return;          }          if (message1[0] == 20 && message1[17] > 0 && message1[17] < 20) {            msg.obj = name + "電池電量: " + message1[17] + "%";            handler.sendMessage(msg);            System.out.println("電池:" + name + "電池電量: " + message1[17] + "%");            return;          }          if (message1[17] > 0) {            SharedPreferences sp = getActivity().getSharedPreferences(id, getActivity().MODE_PRIVATE);            // 獲得sp的編輯器            SharedPreferences.Editor ed = sp.edit();            // 以鍵值對的顯示將用戶名和密碼保存到sp中            ed.putString("battery", String.valueOf(message1[17]));            // 提交用戶名和密碼            ed.commit();          }        }      });    } catch (Exception e) {      e.printStackTrace();    }  }  public byte[] subBytes(byte[] src, int begin, int count) {    byte[] bs = new byte[count];    System.arraycopy(src, begin, bs, 0, count);    return bs;  }  //根據(jù)id拿到屬性為id的Book對象。  public static DeviceList getBookById(String id) {    DeviceList book = new DeviceList();    book.setId(id);//設(shè)置傳入的id值    //books.indexOf()根據(jù)id比較對象是否相等    return deviceList1.get(deviceList1.indexOf(book));    //返回關(guān)聯(lián)id的Book對象。  }    private void connect() {    new Thread(new Runnable() {      @Override      public void run() {        try {          client.connect(options);          Message msg = new Message();          msg.what = 2;          handler.sendMessage(msg);        } catch (Exception e) {          e.printStackTrace();          Message msg = new Message();          msg.what = 3;          handler.sendMessage(msg);        }      }    }).start();  }  protected boolean onKeyDown(int keyCode, KeyEvent event) {    if (client != null && keyCode == KeyEvent.KEYCODE_BACK) {      try {        client.disconnect();      } catch (Exception e) {        e.printStackTrace();      }    }    return super.getActivity().onKeyDown(keyCode, event);  }  @Override  public void onDestroy() {    super.onDestroy();    try {      scheduler.shutdown();      client.disconnect();    } catch (MqttException e) {      e.printStackTrace();    }  }  private void startReconnect() {    scheduler = Executors.newSingleThreadScheduledExecutor();    scheduler.scheduleAtFixedRate(new Runnable() {      @Override      public void run() {        if (!client.isConnected()) {          connect();        }      }    }, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);  }其次使用handlermessage接收消息,并已notifacation的形式展示在通知欄頁面 handler = new Handler() {      @Override      public void handleMessage(Message msg) {        super.handleMessage(msg);        if (msg.what == 1) {          NotificationManager manager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);          Notification myNotify = new Notification();          myNotify.icon = R.drawable.logo;          myNotify.tickerText = "新消息";          myNotify.when = System.currentTimeMillis();          //使用默認(rèn)的聲音          myNotify.defaults |= Notification.DEFAULT_SOUND;//使用默認(rèn)的震動          myNotify.defaults |= Notification.DEFAULT_VIBRATE;//使用默認(rèn)的聲音、振動、閃光          myNotify.defaults = Notification.DEFAULT_ALL;// myNotify.flags=Notification.FLAG_AUTO_CANCEL;          // myNotify.flags = Notification.FLAG_NO_CLEAR;// 不能夠自動清除          RemoteViews rv = new RemoteViews(getActivity().getPackageName(),              R.layout.activity_notification1);          rv.setTextViewText(R.id.tv_desc, (String) msg.obj);          myNotify.contentView = rv;          Intent intent = new Intent(getActivity(), MainActivity.class);          //  intent.addCategory(Intent.CATEGORY_LAUNCHER);          //  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);          android.app.PendingIntent contentIntent = android.app.PendingIntent.getActivity(getActivity(), 0,              intent, 0);          myNotify.contentIntent = contentIntent;          manager.notify(i1++, myNotify);          PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);          PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |              PowerManager.SCREEN_DIM_WAKE_LOCK, "target");          boolean screen = pm.isScreenOn();          if (!screen) {//如果滅屏            wakeLock.acquire();            wakeLock.release();          }          refresh();        } else if (msg.what == 2) {          System.out.println("連接成功");          System.out.print("連接成功大小" + listDatas2.size());          try {            client.subscribe(myTopic, 1);            client.subscribe(myTopic1, 1);          } catch (MqttException e) {            e.printStackTrace();          }        } else if (msg.what == 3) {          //Toast.makeText(MainActivity.this, "連接失敗,系統(tǒng)正在重連", Toast.LENGTH_SHORT).show();          System.out.println("連接失敗,系統(tǒng)正在重連");        }      }    };

以上這篇安卓開發(fā)之mqtt協(xié)議實(shí)例代碼就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 张北县| 峨边| 河南省| 遂溪县| 赤水市| 思南县| 沙洋县| 资溪县| 龙海市| 昌乐县| 东山县| 上蔡县| 怀柔区| 延长县| 通城县| 阿鲁科尔沁旗| 曲沃县| 武安市| 谷城县| 伊宁市| 师宗县| 大冶市| 孝感市| 安岳县| 玉屏| 富民县| 香港| 肇东市| 潍坊市| 济南市| 进贤县| 凤台县| 砀山县| 浦江县| 家居| 桃江县| 越西县| 和静县| 台湾省| 凯里市| 镇平县|