猿创征文|给设备做一个独立自主的小APP-实例详解


前言

随着工业自动化的不断发展,设备入云这门技术也越来越重要,很多人都开启了学习设备入云。然后前面几篇设备入云这一块也讲了好多了,本文呢就介绍设备入云之后自己做一个独立自主的设备客户端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分钟;

扫描二维码关注公众号,回复: 14512059 查看本文章

三、压力设置
输送压力设置:合理调节范围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源码请到我的学习资源里边找一找。

猜你喜欢

转载自blog.csdn.net/weixin_41729677/article/details/126651453