文章目录
- 前言
- 一、通讯基础
- 二、FlexManager和阿里云的部署
- 1、FlexManager部署
- 2、阿里云物联网平台部署
- 三、写设备客户端APP
- Step 1 配置云客户端虚拟
- Step 2 使用andriod studio 开发一个设备APP
- 2.1 MQTT通讯参数代码
- 2.2 实现MQTT通讯具体代码
- 2.3 MQTT通讯获取的Json数据解析代码
- Step 3 最终效果
- 3.1 阿里云物联网平台效果
- 3.2 andriod平板调试效果
- 3.3 andriod手机调试效果
- 总结
前言
随着工业自动化的不断发展,设备入云这门技术也越来越重要,很多人都开启了学习设备入云。然后前面几篇设备入云这一块也讲了好多了,本文呢就介绍设备入云之后自己做一个独立自主的设备客户端APP的实际项目操作。
提示:以下是本篇文章正文内容,下面案例可供参考
一、通讯基础
结合上一篇【FlexManager和阿里云MQTT通讯实例详解】,我们现在给设备做一个独立自主的APP,其通讯框架如下图所示,先一览为快:
二、FlexManager和阿里云的部署
因为阿里云设备端虚拟前面一篇已经讲了,此处略去一万字,看图:
1、FlexManager部署
2、阿里云物联网平台部署
设备端部署,创建完成后设备虚拟为rtyu,如图所示,已显示在线。
查看设备虚拟详情,如下图所示:
调试一波设备信息收发情况,如图所示:
三、写设备客户端APP
Step 1 配置云客户端虚拟
在阿里云物联网平台配置设备APP虚拟客户端APP334,如图所示:
Step 2 使用andriod studio 开发一个设备APP
在andriod studio 创建项目开发设备APP,段落重要代码如图所示:
2.1 MQTT通讯参数代码
2.2 实现MQTT通讯具体代码
public void connectToIot() { try { MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); String mqttUsername = deviceName + "&" + productKey; System.out.println("gen username : " + mqttUsername); mqttConnectOptions.setUserName(mqttUsername); System.out.println("show content : " + content); System.out.println("show secret : " + deviceSecret); String mqttPassword = ""; try { mqttPassword = encryptHMAC("hmacsha1", content, deviceSecret); } catch (Exception e) { throw new RuntimeException(e); } System.out.println("calc password : " + mqttPassword); mqttConnectOptions.setPassword(mqttPassword.toCharArray()); mqttConnectOptions.setAutomaticReconnect(true); mqttConnectOptions.setCleanSession(false); mqttConnectOptions.setMqttVersion(4); mqttConnectOptions.setKeepAliveInterval(90); mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { System.out.printf("connect to iot hub success.\n"); DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions(); disconnectedBufferOptions.setBufferEnabled(true); disconnectedBufferOptions.setBufferSize(100); disconnectedBufferOptions.setPersistBuffer(false); disconnectedBufferOptions.setDeleteOldestMessages(false); mqttAndroidClient.setBufferOpts(disconnectedBufferOptions); subscribeToTopic(); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { System.out.printf("connect to iothub failed, exception : %s\n", exception.toString()); } }); } catch (MqttException ex) { ex.printStackTrace(); } } public void subscribeToTopic() { try { mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { System.out.println("subscribe topic success."); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { System.out.println("subscribe topic failed."); } }); // THIS DOES NOT WORK! mqttAndroidClient.subscribe(subscriptionTopic, 0, new IMqttMessageListener() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // message Arrived! System.out.println("Message: " + topic + " : " + new String(message.getPayload())); } }); } catch (MqttException ex) { System.err.println("Exception whilst subscribing"); ex.printStackTrace(); } }
2.3 MQTT通讯获取的Json数据解析代码
public void messageArrived(String topic, MqttMessage message) throws Exception { //System.out.println( message.toString()); //Toast.makeText(Jieshou.this, message.toString(),Toast.LENGTH_SHORT).show(); String mesg = new String(message.getPayload()); JsonParser jp = new JsonParser(); //将json字符串转化成json对象 JsonObject jo = jp.parse(mesg).getAsJsonObject(); //获取message对应的值 //获取address对应的值 String 手动状态 = jo.get("checkFailedData").getAsJsonObject().get("手动状态").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); //float cssl=Float.parseFloat(手动状态); DI1 = 手动状态; D1.setText(DI1); String 自动状态 = jo.get("checkFailedData").getAsJsonObject().get("自动状态").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); DI2 = 自动状态; D2.setText(DI2); String EDI水箱液位 = jo.get("checkFailedData").getAsJsonObject().get("EDI水箱液位").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI1 = EDI水箱液位 + "cm"; A1.setText(AI1); String 原水电导 = jo.get("checkFailedData").getAsJsonObject().get("原水电导").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI2 = 原水电导 + "us/cm"; A2.setText(AI2); String 一级产水电导 = jo.get("checkFailedData").getAsJsonObject().get("一级产水电导").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI3 = 一级产水电导 + "us/cm"; A3.setText(AI3); String EDI产水电阻 = jo.get("checkFailedData").getAsJsonObject().get("EDI产水电阻").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI4 = EDI产水电阻 + "MΩ.cm"; A4.setText(AI4); String 输送电阻 = jo.get("checkFailedData").getAsJsonObject().get("输送回水电阻").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI5 = 输送电阻 + "MΩ.cm"; A5.setText(AI5); String 超滤进水压力 = jo.get("checkFailedData").getAsJsonObject().get("超滤进水压力").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI6 = 超滤进水压力 + "Mpa"; A6.setText(AI6); String 一级膜前压力1 = jo.get("checkFailedData").getAsJsonObject().get("一级膜前压力1").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI7 = 一级膜前压力1 + "Mpa"; A7.setText(AI7); String 一级膜前压力2 = jo.get("checkFailedData").getAsJsonObject().get("一级膜前压力2").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI8 = 一级膜前压力2 + "Mpa"; A8.setText(AI8); String EDI进水压力 = jo.get("checkFailedData").getAsJsonObject().get("EDI进水压力").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI9 = EDI进水压力 + "Mpa"; A9.setText(AI9); String 输送压力 = jo.get("checkFailedData").getAsJsonObject().get("输送压力").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI10 = 输送压力 + "Mpa"; A10.setText(AI10); String 超滤产水流量 = jo.get("checkFailedData").getAsJsonObject().get("超滤产水流量").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI11 = 超滤产水流量 + "L/h"; A11.setText(AI11); String 一级产水流量 = jo.get("checkFailedData").getAsJsonObject().get("一级产水流量").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI12 = 一级产水流量 + "L/h"; A12.setText(AI12); String 一级浓水流量 = jo.get("checkFailedData").getAsJsonObject().get("一级浓水流量").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI13 = 一级浓水流量 + "L/h"; A13.setText(AI13); String EDI产水流量 = jo.get("checkFailedData").getAsJsonObject().get("EDI产水流量").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI14 = EDI产水流量 + "L/h"; A14.setText(AI14); String 超滤进水温度 = jo.get("checkFailedData").getAsJsonObject().get("超滤进水温度").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI15 = 超滤进水温度 + "℃"; A15.setText(AI15); String EDI产水温度 = jo.get("checkFailedData").getAsJsonObject().get("EDI产水温度").getAsJsonObject().get("value").getAsJsonObject().get("value").getAsString(); AI16 = EDI产水温度 + "℃"; A16.setText(AI16);
Step 3 最终效果
3.1 阿里云物联网平台效果
设备端、客户端虚拟同时完成,如图所示:
设备端详情
APP客户端详情:
3.2 andriod平板调试效果
3.3 andriod手机调试效果
总结
以上就是今天要讲的内容,本文仅仅简单介绍了给设备做一个独立自主的APP,而完全版的物联网APP源码请到我的学习资源里边找一找。