Android:通过MQTT实现用户端与服务器数据双向传输
Posted Z|Star
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:通过MQTT实现用户端与服务器数据双向传输相关的知识,希望对你有一定的参考价值。
android版本更新很快,很多MQTT开发的demo无法运行,找了很多资料终于实现了数据传输这一功能,特此记录一下。
一、MQTT基本概念
简单来说,MQTT是一个基于TCP/IP的协议,比较轻量化,广泛应用于物联网设备和服务器的数据传输。
主题:相当于人与人之间的共同话题。只有当客户端与服务端确定共同主题时,才能进行数据传输。(否则,牛头不对马嘴)
以服务器端接收消息为例,服务器端需订阅/zstar(举个例子)这个主题,客户端需要设置发布zstar这个主题,这样,就可以将数据传输到服务器。
发布消息反之,原理一样。
二、搭建测试用的MQTT服务器
为了实验程序是否有效,需要搭建一台MQTT服务器用作测试。这里,建议购买一周时间的阿里云服务器,¥10左右,性价比不错。
具体步骤参见我的上一篇博客
利用阿里云搭建MQTT服务器
三、下载依赖
使用MQTT必然需要导入相应依赖。
这里是MQTT依赖下载的官网
下载传送门
我下载的是1.2.0版本
四、核心代码
4.1MQTT初始化
private void Mqtt_init()
{
try {
//host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(host, mqtt_id, new MemoryPersistence());
//MQTT的连接设置
options = new MqttConnectOptions();
//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(false);
//设置连接的用户名
options.setUserName(userName);
//设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//设置回调
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
//连接丢失后,一般在这里面进行重连
System.out.println("connectionLost----------");
//startReconnect();
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
//publish后会执行到这里
System.out.println("deliveryComplete---------" + token.isComplete());
}
@Override
public void messageArrived(String topicName, MqttMessage message)
throws Exception {
//subscribe后得到的消息会执行到这里面
System.out.println("messageArrived----------");
Message msg = new Message();
msg.what = 3; //收到消息标志位
msg.obj = topicName + "---" + message.toString();
handler.sendMessage(msg); // hander 回传
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
4.2连接与重连
private void Mqtt_connect() {
new Thread(new Runnable() {
@Override
public void run() {
try {
if(!(client.isConnected()) ) //如果还未连接
{
client.connect(options);
Message msg = new Message();
msg.what = 31;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = new Message();
msg.what = 30;
handler.sendMessage(msg);
}
}
}).start();
}
private void startReconnect() {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (!client.isConnected()) {
Mqtt_connect();
}
}
}, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);
}
4.3发送消息
private void publishmessageplus(String topic,String message2)
{
if (client == null || !client.isConnected()) {
return;
}
MqttMessage message = new MqttMessage();
message.setPayload(message2.getBytes());
try {
client.publish(topic,message);
} catch (MqttException e) {
e.printStackTrace();
}
}
五、使用说明
由于仅是测试功能,界面设计自然越简单越好。
第一个TextView用来显示接收到的消息。
第二个控件用来发送消息,点击发送"message"到服务器。
服务器后台效果:
六、完整源码
已经整个工程文件上传到我的资源
点击跳转下载
七、参考资料
以上是关于Android:通过MQTT实现用户端与服务器数据双向传输的主要内容,如果未能解决你的问题,请参考以下文章
Android使用MQTT订阅及发布消息(初步了解Mqtt以及实现Android操作mqtt服务)
MQTT与Mosquitto服务器搭建以及Android推送MQTT简介