Android:通过MQTT实现用户端与服务器数据双向传输 |
您所在的位置:网站首页 › 安卓服务器和苹果服务器 › Android:通过MQTT实现用户端与服务器数据双向传输 |
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(); } } 五、使用说明由于仅是测试功能,界面设计自然越简单越好。 服务器后台效果: 已经整个工程文件上传到我的资源 点击跳转下载 七、参考资料7天Java0基础速成安卓开发】Day4 MQTT Jar包的导入和物联网调试 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |