安卓开发之mqtt协议实例代码

首先物联网协议mqtt协议是基于tcp/ip协议的,使用了官方的mqttclient框架

/*
*初始化mqttclient
*/
private void init() {
    try {
      //MQTT的连接设置
      options = new MqttConnectOptions();
      //host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
      client = new MqttClient(new Ip().host, username,
          new MemoryPersistence());
      //设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
      options.setCleanSession(false);
//options.setWill(myTopic,null,2,false);

      //设置连接的用户名
      options.setUserName(login_token);
      //设置连接的密码
      options.setPassword(passWord.toCharArray());
      // 设置超时时间 单位为秒
      options.setConnectionTimeout(10);
      // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
      options.setKeepAliveInterval(60);
      //设置回调
      client.setCallback(new MqttCallback() {
        @Override
        public void connectionLost(Throwable cause) {
          //连接丢失后,一般在这里面进行重连
          System.out.println("connectionLost----------");

        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken token) {
          //publish后会执行到这里
          System.out.println("deliveryComplete---------"
              + token.isComplete());
        }
        @Override
        public void messageArrived(String topicName, MqttMessage message)
            throws Exception {
          byte[] message1 = message.getPayload();
          // subscribe后得到的消息会执行到这里面
          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发送matt接收的消息,格式为二进制数据
          * */

          Message msg = new Message();
          msg.what = 1;
          if (message1[0] == 1) {
//            msg.obj = name + "设备心跳";
//            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 + "关门";
            } 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;
  }

  //根据id拿到属性为id的Book对象。
  public static DeviceList getBookById(String id) {
    DeviceList book = new DeviceList();
    book.setId(id);//设置传入的id值
    //books.indexOf()根据id比较对象是否相等
    return deviceList1.get(deviceList1.indexOf(book));
    //返回关联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();
          //使用默认的声音
          myNotify.defaults |= Notification.DEFAULT_SOUND;

//使用默认的震动
          myNotify.defaults |= Notification.DEFAULT_VIBRATE;

//使用默认的声音、振动、闪光
          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, "连接失败,系统正在重连", Toast.LENGTH_SHORT).show();
          System.out.println("连接失败,系统正在重连");
        }
      }
    };

以上这篇安卓开发之mqtt协议实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 安卓开发之mqtt协议实例代码

    首先物联网协议mqtt协议是基于tcp/ip协议的,使用了官方的mqttclient框架 /* *初始化mqttclient */ private void init() { try { //MQTT的连接设置 options = new MqttConnectOptions(); //host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存 client = new M

  • JSP 开发之 releaseSession的实例详解

    JSP 开发之 releaseSession的实例详解 Hibernate可以实现分页查询,昨天试了一下,分页效果不错.但是发现了一个问题,就是当请求超过20次的时候页面就会卡死.经检查,是卡在分页查询这一块. 应用程序采用struts2 + spring2 + hibernate3架构 连接池配置使用的是c3p0, 最大池大小为20, 很显然是连接池耗尽导致的. 增加连接池大小只是饮鸩止渴,总还有耗尽的时候,必须找到根本原因. Dao类的分页查询方法如下: java 代码  public Li

  • 移动web开发之touch事件实例详解

    前面的话 iOS版Safari为了向开发人员传达一些特殊信息,新增了一些专有事件.因为iOS设备既没有鼠标也没有键盘,所以在为移动Safari开发交互性网页时,常规的鼠标和键盘事件根本不够用.随着Android 中的WebKit的加入,很多这样的专有事件变成了事实标准,导致W3C开始制定Touch Events规范.本文将详细介绍移动端touch事件 概述 包含iOS 2.0软件的iPhone 3G发布时,也包含了一个新版本的Safari浏览器.这款新的移动Safari提供了一些与触摸(touc

  • 安卓开发之FragmentPagerAdapter和FragmentStatePagerAdapter详解

    目录 FragmentPagerAdapter与FragmentPagerStateAdapter区别点: 一:二者在状态保存有差异:FragmentPagerAdapter并未实现saveState().restoreState() 二:二者在视图管理方法差异: 最近遇到比较奇怪的bug,TableLayout+ViewPager实现点击顶部tab切换viewpager视图.但是在Viewpager设置dapter时,最开始设置的是FragmentPagerAdapter,会导致tab切换后F

  • Android开发之Location用法实例分析

    本文实例讲述了Android开发中Location用法.分享给大家供大家参考,具体如下: Location 在Android 开发中还是经常用到的,如通过经纬度获取天气,根据Location 获取所在地区详细Address (比如Google Map 开发)等.而在Android 中通过LocationManager来获取Location .通常获取Location 有GPS 获取,WIFI 获取. 这边介绍一个简单的小Demo ,来教大家如何获取Location ,从而获取经纬度. 第一步:创

  • Android开发之Parcel机制实例分析

    本文实例讲述了Android开发之Parcel机制.分享给大家供大家参考.具体分析如下: 在java中,有序列化机制.但是在安卓设备上,由于内存有限,所以设计了新的序列化机制. Container for a message (data and object references) that can be sent through an IBinder.  A Parcel can contain both flattened data that will be unflattened on t

  • Android开发之ViewSwitcher用法实例

    本文实例讲述了Android开发之ViewSwitcher用法.分享给大家供大家参考,具体如下: android.widget.ViewSwitcher是ViewAnimator的子类,用于在两个View之间切换,但每次只能显示一个View. ViewSwitcher的addView函数的代码如下: /** * {@inheritDoc} * * @throws IllegalStateException if this switcher already contains two childre

  • Android开发之Sqliteopenhelper用法实例分析

    本文实例讲述了Android开发之Sqliteopenhelper用法.分享给大家供大家参考.具体分析如下: 如果在安卓开发中,直接使用Activity中的openOrCreateDatabase(name, mode, factory)会有一系列跟随的问题.比如说数据库升级.更新等. 最好是使用其封装版本:SQLiteOpenHelper 继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个 方法. onCreate(SQLiteDatabase db) : 当数据库被首次

  • Android开发之TabActivity用法实例详解

    本文实例讲述了Android开发之TabActivity用法.分享给大家供大家参考,具体如下: 一.简介 TabActivity继承自Activity,目的是让同一界面容纳更多的内容.TabActivity实现标签页的功能,通过导航栏对各个页面进行管理. 二.XML布局文件 注意: 1.TabActivity的布局文件要求以TabHost作为XML布局文件的根. 2.通常我们采用线性布局,所以<TabHost> 的子元素是 <LinearLayout>. 3.<TabWidg

  • Android开发之DialogFragment用法实例总结

    本文实例讲述了Android开发之DialogFragment用法.分享给大家供大家参考,具体如下: 背景 Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的处理屏幕翻转的情况). 而创建 DialogFragment 有两种方式: 1. 覆写其 onCreateDialog 方法 - ① 2. 覆写其 onCreateView 方法 - ② 虽然这两种方式都能实现相同的效果,但是它们各有自己适合的应用

随机推荐