Android:通过MQTT实现用户端与服务器数据双向传输

您所在的位置:网站首页 安卓服务器和苹果服务器 Android:通过MQTT实现用户端与服务器数据双向传输

Android:通过MQTT实现用户端与服务器数据双向传输

2024-07-13 14:55| 来源: 网络整理| 查看: 265

Android版本更新很快,很多MQTT开发的demo无法运行,找了很多资料终于实现了数据传输这一功能,特此记录一下。

文章目录 一、MQTT基本概念二、搭建测试用的MQTT服务器三、下载依赖四、核心代码4.1MQTT初始化4.2连接与重连4.3发送消息 五、使用说明六、完整源码七、参考资料

一、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"到服务器。

服务器后台效果: 在这里插入图片描述

六、完整源码

已经整个工程文件上传到我的资源 点击跳转下载

七、参考资料

7天Java0基础速成安卓开发】Day4 MQTT Jar包的导入和物联网调试



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3