MQTT 使用
导语: 很久没写博文了,主要是太慢又经历些事,以前一直想玩硬件物联网相关的,一直没有机会进入这样的公司,好在来到杭州之后辗转反侧算是进入到类似的公司,做lot无线网沾点边的东西,原来公司使用RabbitMQ做消息通知,服务器压力大,因此改变了策略这里使用MQTT协议,作为一个资深的有经验的程序员,封装sdk的任务落在我的身上.下面做个简单介绍.注意这篇文章咱们不讲mqtt相关原理,只讲我们封装的库,因为网上对于mqtt的介绍肯定讲的比咱们们更好更详细.
一.介绍一下:
-
核心库引入
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
我们对开源mqtt仓做封装适用于我们的业务场景
二.接入方式:
1. 引进 mqttLib
2. 在Application oncreate()中调用
String host = "tcp://10.10.120.200:1882"; 改成你自己的
String topic = "device/" + DeviceIdUtil.getDeviceId(this);//设备唯一id
MqttOption option = new MqttOption.MqttOptionBuilder(host)//例如 "tcp://10.10.20.200:1883";
.publish_topid(topic) //订阅主题 拼接 "device/" 例如 "device/" + DeviceIdUtil.getDeviceId(this);
.response_topid(topic)//接收主题 拼接 "device/"
.username("itc") //用户名
.clientId(deviceId) //设备唯一id
.password("itc.pass") //密码
.build();
CustomMqttService.startMqttService(this, option, null);
说明: OnlineInforOption类
此类用于设置设备上线的传输数据,
基础数据sdk已经封装好,预留以应对服务器可能的变化,例如设备上线 type数字可能会变化,
目前 设备上线的发布type默认传1;
如若自定义设备上线的参数,可以构造 OnlineInforOption;没有则传null
3.自定义广播接收器用于接收数据
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MqttAction.RECEOIVER_ACTION);
myReceiver = new MyReceiver();
mLocalBroadcastManager.registerReceiver(myReceiver, intentFilter);
注意 :考虑数据安全性 sdk应用本地广播 LocalBroadcastManager,业务层注册也应该本地注册
广播注册方式AndroidManifest 高版本无效,业务层应当在全局application中代码注册广播,这里使用广播来做接收,是模仿了极光推送的设计理念;因为用接口显得不够优雅
广播接收到的数据
if (intent != null) {
String contentMessage = intent.getStringExtra(MqttAction.KEY_CONTENT_MESSAGE);//数据
String topId = intent.getStringExtra(MqttAction.KEY_TOPID_MESSAGE); //订阅的主题
考虑到数据涉及到业务层,且每个项目的数据格式不同,因此不对数据做封装,这里返回服务器的原生数据;使用时候自行解析
4.发布消息,订阅消息 MqttManager
在初始化结束后,业务可使用MqttManager 进行发布和订阅消息主题;这是一个单例
三.总结:
mqttLib,原理是本地开启后台Service封装业务mqtt相关的业务逻辑包括发布,订阅,接收消息相关;做了重连机制,同行可以借鉴用来做消息推送。https://github.com/delingli/mqttLib