前言
随着工业自动化的不断发展,设备入云这门技术也越来越重要,很多人都开启了学习设备入云。然后前面几篇设备入云这一块也讲了好多了,本文呢就介绍设备入云之后自己做一个独立自主的设备客户端APP的实际项目操作。
提示:以下是本篇文章正文内容,下面案例可供参考
一、通讯基础
结合上一篇【FlexManager和阿里云MQTT通讯实例详解】,我们现在给设备做一个独立自主的APP,其通讯框架如下图所示,先一览为快:
二、设备详情
1、触摸屏流程示意图-预处理
自动运行:点击后系统关闭手动状态进入全自动运行状态,同时触摸屏自动状态指示灯由绿变成红色;
手动运行:点击后系统关闭自动状态进入手动运行状态,同时触摸屏手动状态指示灯由绿变成红色,在登录页面输入用户名和密码后,可对相关泵进线打开或者关闭操作;
进水压力:自来水压力,单位Mpa,合理区间0.1-0.4Mpa;
进水温度:自来水温度,单位℃,合理区间1-45℃;
原水电导:自来水电导率,单位us/cm,合理区间应<1000us/cm;
产水流量:超滤产水流量,单位L/h,合理区间应>300L/L;
超滤进水阀、超滤反洗阀、超滤排放阀、超滤产水阀:启动电源AC220V。
2、触摸屏流程示意图-纯水系统
膜前压力:反渗透膜的进水压力,单位Mpa,合理区间0.3-0.8Mpa;
产水流量:反渗透膜出水流量,单位L/h,合理区间应大于220L/h;
产水电导:反渗透膜产水电导率,单位us/cm,合理区间应<6us/cm;
进水压力:EDI进水压力,单位Mpa,合理区间0.08-0.3Mpa;
产水电阻:EDI膜堆产水电阻率,单位MΩ.cm,合理区间15-18.25MΩ;
EDI产水温度:EDI膜堆产水出水水温,单位℃,合理区间,5-36℃;
EDI产水流量:EDI膜堆产水出水流量,单位L/h,合理区间150-220L/h;
浓水流量:EDI膜堆浓水出水流量,单位L/h,合理区间20-60L/h;
纯水箱液位:纯水箱纯水液位高度指示,单位cm,合理区间0-150cm;
输送压力:供水系统变频恒定压力,单位Mpa,合理区间,0.15-4Mpa;
回水电阻:输送管网经用水点后循环回水的水质电阻率,单位MΩ.cm,合理区间应>1MΩ.cm;
一级增压泵1、一级增压泵2、EDI增压泵:启动电源DC36V,供电镇流器AC220V转DC36V,150W。
输送泵:启动电源AC380V,变频器0-10V模拟量控制恒压频率;
浸没式紫外灯:启动电源直流,供电镇流器AC220V转DC120W。
3、触摸屏示意图-参数设置
一、液位参数设置
1、原水进水压力设置
原水进水压力控制造水系统运行,大于等于原水启动压力允许造水运行,小于原水停止压力禁止造水运行。
原水启动压力合理设置范围:应大于等于0.08Mpa;
原水停止压力合理设置范围:0.02-0.07Mpa.
2、纯水箱液位设置
中液位和高液位控制一级RO+EDI系统运行,小于中液位启动一级RO+EDI系统补水,大于等于高液位停止一级RO+EDI系统补水;
低液位和中液位控制浸没杀菌和输送系统运行,大于等于中液位允许浸没杀菌和输送系统运行,小于低液位禁止浸没杀菌和输送系统运行。
纯水低液位合理设置范围:应高于水箱出水口,一般设置10-40cm;
纯水中液位合理设置范围:一般设置70-100cm;
纯水高液位合理设置范围:应低于水箱圆柱体高度或者低于水箱溢流口,一般设置120-150cm;
二、时间参数设置
1、超滤开机冲洗时间(秒):系统造水启动前超滤开启反冲洗的时间,一般设置为30-120秒;
2、超滤定期冲洗间隔(分钟):系统不造水时,冲洗超滤的间隔时间,一般设置为60-240分钟;
3、超滤定期冲洗间隔(分钟):定期冲洗超滤时的冲洗时长,,一般设置为2-6分钟;
三、压力设置
输送压力设置:合理调节范围0.2-0.6Mpa,输送泵恒压变频参考矢量压力,关联影响终端输送
三、FlexManager和阿里云的部署
因为阿里云设备端虚拟前面一篇已经讲了,此处略去一万字,看图:
1、FlexManager部署
2、阿里云物联网平台部署
1、部署设备虚拟
在产品下,创建添加设备,如图所示:
设备端部署,创建完成后设备虚拟为rtyu,如图所示,已显示在线。
查看设备虚拟详情,如下图所示:
调试一波设备信息收发情况,如图所示:
2、部署客户端虚拟
在阿里云物联网平台配置设备APP虚拟客户端APP334,如图所示:
3、部署云端流转
设备和客户端虚拟之间需要做数据流转,如图所示:
四、写设备客户端APP
Step1 使用andriod studio 开发一个设备APP
在andriod studio 创建项目开发设备APP,段落重要代码如图所示:
1、 MQTT通讯参数代码
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();
}
}
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 2 设备APP最终效果
1、 阿里云物联网平台效果
设备端、客户端虚拟同时完成,如图所示:
设备端详情
APP客户端详情:
2、andriod平板调试效果
3、andriod手机调试效果
总结
以上就是今天要讲的内容,本文仅仅简单介绍了给设备做一个独立自主的APP,而完全版的物联网APP源码请到我的学习资源里边找一找。