首先物联网协议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协议的更多相关文章

  1. android开发之http协议

    http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

  2. 安卓开发之Toolbar

    根据官网的教程,发现实现与预期不一致,查看相关资料自己整理了一下(官网开发文档:https://developer.android.com/training/appbar/setting-up.htm ...

  3. 安卓开发之ListAdapter(二)

    今天我们来学习一下ArrayAdapter: ArrayAdapter是安卓中最简单的适配器.使用ArrayAdapter(数组适配器),需要把数据源存 放至数组里面来显示. •构造函数: publi ...

  4. 安卓开发之UIwebview

    web view在安卓开发中是比较常见的UI,像微信的新闻模块就采用了这个,他的作用越来越广,下面我把以前做的贴了出来,如果有更好的办法,希望大神不吝赐教哈,嘿嘿,纯代码来了: java代码 publ ...

  5. 【转】Unity3D开发之Http协议网络通信

    之前unity3d项目要做跟服务器通信的模块,然后服务器那边的协议是基于http的Jsonrpc通信方式一开始,用C#的本身类HttpWebRequest来提交请求,很快就在电脑上面成功了,代码也很简 ...

  6. IOS开发之NSObject协议类方法说明

    oc中NSObject类是所有类的基类,所有类都要继承自它,那么它的方法就显得特别重要,因为所有类都会有这些基本的方法. 看看oc的源码中NSObject是这样定义的: @interface NSOb ...

  7. phonegap移动开发之jsonp协议

    最近我一直在学习android开发.并且做了几个小软件,我会在百度网盘和二维码的形式分享出去!源码会分享到github上.下面我还是主要来说说jsonp协议吧.可能许多初学者会遇到许多跟我一样的问题. ...

  8. Web开发之HTTP协议

    HTTP响应消息 一个HTTP响应代表服务器向客户端回送的数据. 一个完整的HTTP响应包括如下内容: 一个状态行.若干消息头.以及响应正文,其中的一些消息头和正文都是可选的,消息头和正文内容之间要用 ...

  9. 安卓开发之activity详解(sumzom)

    app中,一个activity通常是指的一个单独的屏幕,相当于网站里面的一个网页,它是对用户可见的,它上面可以显示一些控件,并且可以监听处理用户的时间做出响应. 那么activity之间如何进行通信呢 ...

随机推荐

  1. Python Web框架篇:Django Model ORM(对象关系映射)

    一,基本操作 用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作. 1.增(create , save): from app01 ...

  2. python 进程池(multiprocessing.Pool)和线程池(threadpool.ThreadPool)的区别与实例

    一般我们是通过动态创建子进程(或子线程)来实现并发服务器的,但是会存在这样一些缺点: 1.动态创建进程(或线程)比较耗费时间,这将导致较慢的服务器响应.  2.动态创建的子进程通常只用来为一个客户服务 ...

  3. Flex 基础语法(二)

    1.flex -direction 属性 含义 row(默认值) 主轴为水平方向,起点在左端. row-reverse 主轴为水平方向,起点在右边. column 主轴为垂直方向,起点在上沿. col ...

  4. MQTT——发布报文

    发布报文的知识点并不难,只是多.看过前面几章的读者们应该或多或少都认识服务质量QOS.发布报文跟他的联系最紧的.我们也清楚订阅报文里面虽然也有用到QOS,但是他却没有更进一步的联系.往下看就知道是什么 ...

  5. 14.javaweb AJAX技术详解

    一.简介 1,  ajax:在不重新加载网页的前提下,与服务器交换数据并更新部分网页的技巧,但其本身并不是一种新技术 2,  核心:XMLHttpRequest对象.AJAX技术主要是通过此对象完成的 ...

  6. jquery实现抽奖小游戏

    在很多网站或游戏活动中我们都会看到有关抽奖的活动或界面: 下面我将给大家介绍下如何通过javascript来实现这样的一个抽奖功能,主要从下面三个步骤入手(文中着重介绍第三部分有关功能的实现): 1. ...

  7. C#中抽象类与接口的区别

    1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,它是面向对象 ...

  8. ASP.NET Core 2.0 MVC「远程」验证

    问题 如何 在ASP.NET Core MVC中使用[Remote]属性来实现模型验证 . 解 在 启动时, 为MVC配置中间件和服务. 添加一个模型. 添加一个控制器. 为jQuery添加一个Raz ...

  9. [转载] java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor

    转载自http://janeky.iteye.com/blog/770441 ------------------------------------------------------------- ...

  10. Ubuntu Server无线上网

    在自己电脑上装个Ubuntu Server,需要连接无线上网,参照附录的两个连接完成. 重置的自己路由器,只是为了找ssid和密码 配置步骤: 1. 生成无线上网密码配置文件 root@Ubuntu: ...