ESA2GJK1DH1K基础篇: Android实现MQTT封装源码使用说明
说明
这一节说明一下基础篇APP源码里面MyMqttCilent.java这个文件的使用
新建工程
安装MQTT的jar包
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'
打开基础篇第一节测试里面的APP源码里面的工程
拷贝MyMqttClient.java文件
一,拷贝第一节测试里面的APP源码里面的MyMqttClient.java 到当前工程
二,源码里面是使用的手机的IMEI作为了 MQTT的 ClientID
咱呢,这节着重介绍包的使用,所以这个地方咱直接用时间戳作为ClientID就可以了
添加上网络权限
<uses-permission android:name="android.permission.INTERNET" />
连接MQTT
一,根据自己的MQTT服务器修改
二,控制连接
该代码写一次即可,后期断线自动重连
MyMqttClient.sharedCenter().setConnect();
测试
连接上服务器以后会打印 Connect Success
订阅主题
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(); /** * 订阅主题成功回调 */ 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(); } }
取消订阅
接收消息
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() ); } });
测试接收消息
一,打开MQTT调试助手
注:后面的为接收到的16进制消息
发布字符串消息
MyMqttClient.sharedCenter().setSendData("2222","msg",0,false);//发送字符串消息
2222:发布的主题 msg:发布的消息 0:消息等级 false:不需要服务器记录
测试发布字符串消息
发布16进制消息
byte[] bytes= new byte[2]; bytes[0] = 0x03; bytes[1] = 0x55; MyMqttClient.sharedCenter().setSendData("3333",bytes,0,false);
监听客户端连接MQTT的状态