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 {
client = new MqttClient(host, mqtt_id, new MemoryPersistence());
options = new MqttConnectOptions();
options.setCleanSession(false);
options.setUserName(userName);
options.setPassword(passWord.toCharArray());
options.setConnectionTimeout(10);
options.setKeepAliveInterval(20);
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
System.out.println("connectionLost----------");
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("deliveryComplete---------" + token.isComplete());
}
@Override
public void messageArrived(String topicName, MqttMessage message)
throws Exception {
System.out.println("messageArrived----------");
Message msg = new Message();
msg.what = 3;
msg.obj = topicName + "---" + message.toString();
handler.sendMessage(msg);
}
});
} 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"到服务器。
服务器后台效果: 
六、完整源码
已经整个工程文件上传到我的资源 点击跳转下载
七、参考资料
7天Java0基础速成安卓开发】Day4 MQTT Jar包的导入和物联网调试
|