Ape Creation Call for Papers | Hacer una pequeña aplicación independiente para el dispositivo - ejemplo detallado


prefacio

Con el desarrollo continuo de la automatización industrial, la tecnología de equipos en la nube se está volviendo cada vez más importante, y muchas personas han comenzado a aprender equipos en la nube. Luego, los pocos artículos anteriores sobre el dispositivo que ingresa a la nube también han hablado mucho.Este artículo presenta la operación real del proyecto de hacer una aplicación de cliente de dispositivo independiente después de que el dispositivo ingresa a la nube.


提示:以下是本篇文章正文内容,下面案例可供参考

Los fundamentos de la comunicación.

En combinación con el artículo anterior [Explicación detallada del ejemplo de comunicación FlexManager y Alibaba Cloud MQTT], ahora estamos creando una aplicación independiente para el dispositivo. Su marco de comunicación se muestra en la siguiente figura.
inserte la descripción de la imagen aquí

2. Detalles del equipo

1. Diagrama esquemático del proceso de pantalla táctil - preprocesamiento

inserte la descripción de la imagen aquí
Operación automática: después de hacer clic, el sistema cierra el estado manual y entra en el estado de operación completamente automático, y el indicador de estado automático de la pantalla táctil cambia de verde a rojo;
Operación manual: después de hacer clic, el sistema cierra el estado automático y entra en la operación manual estado, y el indicador de estado manual de la pantalla táctil cambia de verde al mismo tiempo. Se convirtió en rojo, después de ingresar el nombre de usuario y la contraseña en la página de inicio de sesión, puede abrir o cerrar la línea de entrada de la bomba correspondiente;
presión de agua de entrada: agua del grifo presión, unidad Mpa, rango razonable 0.1-0.4Mpa;
temperatura del agua de entrada: temperatura del agua del grifo, unidad ℃, rango razonable 1-45 ℃;
Conductividad del agua cruda: conductividad del agua del grifo, unidad us/cm, el rango razonable debe ser <1000us/ cm;
Flujo de agua producido: flujo de agua de ultrafiltración, unidad L/h, el rango razonable debe ser > 300L/L;
Válvula de entrada de agua de ultrafiltración, válvula de retrolavado de ultrafiltración, válvula de descarga de ultrafiltración, válvula de producción de agua de ultrafiltración: potencia de arranque AC220V.

2. Diagrama esquemático del proceso de pantalla táctil - sistema de agua pura

inserte la descripción de la imagen aquí

Presión previa a la membrana: presión del agua de entrada de la membrana de ósmosis inversa, unidad Mpa, rango razonable 0,3-0,8 Mpa;
caudal de agua: caudal de efluente de la membrana de ósmosis inversa, unidad L/h, rango razonable debe ser superior a 220 L/h;
conductancia del agua: conductividad de agua de membrana permeable inversa, unidad us/cm, el rango razonable debe ser <6us/cm;
presión de entrada de agua: presión de entrada de agua EDI, unidad Mpa, rango razonable 0.08-0.3Mpa;
resistencia al agua: resistividad de agua de pila de membrana EDI , unidad MΩ.cm, rango razonable 15-18.25MΩ;
temperatura del agua permeada EDI: temperatura del agua permeada de pila de membrana EDI, unidad °C, rango razonable, 5-36 °C;
flujo de permeado EDI: flujo permeado de pila de membrana EDI, unidad L /h, intervalo razonable 150-220L/h;
Flujo de agua concentrado: Flujo de salida de agua concentrada de pila de membrana EDI, unidad L/h, intervalo razonable 20-60L/h;
Nivel del tanque de agua pura: Tanque de agua pura Indicación de altura de broca de agua pura, unidad cm, intervalo razonable 0-150 cm;
presión de transporte: presión constante de conversión de frecuencia del sistema de suministro de agua, unidad Mpa, intervalo razonable, 0,15-4 Mpa;
resistencia del agua de retorno: resistividad de la calidad del agua del agua de retorno circulante después de que la red de tuberías de transporte pasa por el punto de agua, unidad MΩ.cm, el intervalo razonable debe ser > 1MΩ.cm; bomba de refuerzo de primera
etapa 1, bomba de refuerzo de primera etapa 2, bomba de refuerzo EDI: potencia de arranque de 36 V CC, balasto de fuente de alimentación de 220 V CA a 36 V CC, 150 W.
Bomba de transferencia: potencia de arranque AC380V, convertidor de frecuencia 0-10V frecuencia de voltaje constante de control analógico;
lámpara UV de inmersión: potencia de arranque DC, balasto de fuente de alimentación AC220V a DC120W.

3. Diagrama esquemático de la pantalla táctil - configuración de parámetros

inserte la descripción de la imagen aquí

1. Configuración del parámetro de nivel de líquido
1. Configuración de la presión de
entrada del agua sin tratar La presión de entrada del agua sin tratar controla el funcionamiento del sistema de generación de agua. Si la presión de inicio del agua sin tratar es mayor o igual que la presión de inicio del agua sin tratar, la generación de agua se permite la operación, y si es menor que la presión de parada de agua cruda, se prohíbe la operación de generación de agua.
Rango de ajuste razonable de la presión inicial del agua cruda: debe ser mayor o igual a 0,08 Mpa;
rango de ajuste razonable de la presión de parada del agua cruda: 0,02-0,07 Mpa.

2. El nivel de líquido del tanque de agua pura se establece
en nivel medio y alto para controlar el funcionamiento del sistema RO+EDI de primer nivel.Cuando el nivel de líquido es menor que el nivel medio, el RO+ de primer nivel El sistema EDI se inicia para reponer agua. ;
El nivel de líquido bajo y el nivel de líquido medio controlan el funcionamiento del sistema de transporte y esterilización por inmersión. Si el nivel de líquido es mayor o igual que el nivel de líquido medio, el funcionamiento del sistema de transporte y esterilización por inmersión esta permitido.
Rango de configuración razonable de nivel bajo de agua pura: debe ser más alto que la salida de agua del tanque de agua, generalmente establecido en 10-40 cm;
rango de configuración razonable de nivel de agua pura: generalmente establecido en 70-100 cm;
rango de configuración razonable de nivel alto de agua pura : debe ser más bajo que el tanque de agua La altura del cilindro o más bajo que el puerto de desbordamiento del tanque de agua generalmente se establece en 120-150 cm
2. Configuración de parámetros de tiempo
1. Tiempo de lavado de inicio de ultrafiltración (segundos): el tiempo para que la ultrafiltración comience el retrolavado antes de que el sistema comience a producir agua, generalmente establecido en 30 -120 segundos
2. Intervalo de lavado regular de ultrafiltración (minutos): cuando el sistema no produce agua, el intervalo de tiempo para el lavado de ultrafiltración generalmente se establece en 60- 240 minutos
3. Intervalo de lavado regular de ultrafiltración (minutos): ultrafiltración de lavado regular La duración del enjuague durante la filtración generalmente se establece en 2-6 minutos;

3. Configuración de presión Configuración de
presión de entrega: rango de ajuste razonable de 0.2-0.6Mpa, presión de vector de referencia de frecuencia variable de presión constante de la bomba de entrega, que afecta la entrega terminal

3. Despliegue de FlexManager y Alibaba Cloud

Debido a que la virtualización del lado del dispositivo de Alibaba Cloud se ha discutido en el artículo anterior, aquí se omiten 10,000 palabras y vea la imagen:

1. Implementación de FlexManager

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

2. Implementación de la plataforma IoT en la nube de Alibaba

1. Implementar dispositivo virtual

Debajo del producto, cree y agregue un dispositivo, como se muestra en la figura:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
implementación del lado del dispositivo, una vez completada la creación, el dispositivo se virtualiza como rtyu, como se muestra en la figura, se ha mostrado en línea.
inserte la descripción de la imagen aquí
Vea los detalles virtuales del dispositivo, como se muestra en la figura a continuación: inserte la descripción de la imagen aquí
Depure una ola de envío y recepción de información del dispositivo, como se muestra en la figura:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

2. Implementar el cliente virtual

Configure el cliente virtual de la aplicación del dispositivo APP334 en la plataforma Alibaba Cloud IoT, como se muestra en la figura:
inserte la descripción de la imagen aquí

3. Implementar la circulación de nubes

El flujo de datos debe realizarse entre el dispositivo y la máquina virtual del cliente, como se muestra en la figura:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí


En cuarto lugar, escribe la aplicación del cliente del dispositivo.

Paso 1 Use Android Studio para desarrollar una aplicación de dispositivo

Cree una aplicación de dispositivo de desarrollo de proyectos en Android Studio, y el código importante del párrafo se muestra en la figura:

1. Código de parámetro de comunicación MQTT

inserte la descripción de la imagen aquí

2. Implementar el código específico de comunicación 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. Código de análisis de datos Json obtenido por comunicación MQTT

 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);

Paso 2 Efecto final de la aplicación del dispositivo

1. El efecto de la plataforma Alibaba Cloud IoT

El lado del dispositivo y el lado del cliente se virtualizan al mismo tiempo, como se muestra en la figura: inserte la descripción de la imagen aquí
Detalles del lado del dispositivo Detalles del inserte la descripción de la imagen aquí
cliente de la aplicación:
inserte la descripción de la imagen aquí

2, efecto de depuración de tabletas Android

inserte la descripción de la imagen aquí

3, efecto de depuración de teléfonos móviles andriod

inserte la descripción de la imagen aquí

Resumir

Lo anterior es de lo que quiero hablar hoy. Este artículo solo presenta brevemente cómo hacer una aplicación independiente para el dispositivo. Para obtener la versión completa del código fuente de la aplicación Internet de las cosas, encuéntrela en mis recursos de aprendizaje.

Supongo que te gusta

Origin blog.csdn.net/weixin_41729677/article/details/126651453
Recomendado
Clasificación