更新项目:将 Mqtt 代理(笔记本电脑)与 IOT 客户端 android 设备连接

Posted

技术标签:

【中文标题】更新项目:将 Mqtt 代理(笔记本电脑)与 IOT 客户端 android 设备连接【英文标题】:UPDATE Project:Connecting Mqtt broker(laptop) with IOT client android devices 【发布时间】:2022-01-07 00:48:56 【问题描述】:

1.[已解决]作为该领域的新手,根据 Java.Threrefore 中的 OOP,我有基本的差距。 我试图从 calculateDangerLevel 方法中获取 dangerLevel 的值,以便将其与其他值一起存储在 mysql 数据库中。 到目前为止,我设法从有效载荷中获取值:y,x,电池,烟雾,气体,温度,紫外线。我需要计算传感器的值来评估危险程度。 问题是,我不能从危险级别中获取值,而是总是得到 null

2.[已解决]我正在尝试从客户端获取已发布的主题,以便将其存储在字符串变量“topicCheck”中,然后将其放入行:result.updateString (2, "topicCheck"); 以便区分topic和接收到的msg,放到mysql db中。问题是:我不知道发布topic的取值方法,放到result.updateString(2,"topicCheck");

3.提前致谢!


import org.eclipse.paho.client.mqttv3.*;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.Properties;
import java.util.UUID;

public class SubscriberImpl 

    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(SubscriberImpl.class.getName());
    private static final double SMOKE_THRESHOLD = 0.14;
    private static final double GAS_THRESHOLD = 9.15;
    private static final double TEMP_THRESHOLD = 50;
    private static final double UV_THRESHOLD = 6;
    public  static String dangerLevel;
    public  static String topicCheck;
    public  static String timeEvent;

    //calculate dangerlevel
    private static String calculateDangerLevel(double smokeSensorReading, double gasSensorReading, double tempSensorReading, double uvSensorReading) 
        String dangerLevel = "No_Risk";
        if ( (smokeSensorReading > SMOKE_THRESHOLD && gasSensorReading > GAS_THRESHOLD) ||
                (smokeSensorReading <= SMOKE_THRESHOLD && gasSensorReading > GAS_THRESHOLD &&
                        tempSensorReading <= TEMP_THRESHOLD && uvSensorReading <= UV_THRESHOLD) ||
                (smokeSensorReading > SMOKE_THRESHOLD && gasSensorReading > GAS_THRESHOLD &&
                        tempSensorReading > TEMP_THRESHOLD && uvSensorReading > UV_THRESHOLD) )
            dangerLevel = "High_Risk";
        else if (smokeSensorReading <= SMOKE_THRESHOLD && gasSensorReading <= GAS_THRESHOLD &&
                tempSensorReading > TEMP_THRESHOLD && uvSensorReading > UV_THRESHOLD)
            dangerLevel = "Medium_Risk";

        return  dangerLevel;

    

    //Parsing data from Payload
    private static void parseMqttPayload(String payload) 

        String[] payloadTokens = payload.split(",");
        // Parse the location
        if (Objects.equals(payloadTokens[0], "null") || Objects.equals(payloadTokens[1], "null"))
            return;

        // Parse the gps reading
        double y = Double.valueOf(payloadTokens[0]);
        double x = Double.valueOf(payloadTokens[1]);

        // Parse the battery reading
        double battery = Double.valueOf(payloadTokens[2]);

        // Parse the sensor readings
        double smokeSensorReading = -1;
        try  smokeSensorReading = Double.valueOf(payloadTokens[3]); 
        catch (NumberFormatException e) 

        double gasSensorReading = -1;
        try  gasSensorReading = Double.valueOf(payloadTokens[4]); 
        catch (NumberFormatException e) 

        double tempSensorReading = -1;
        try  tempSensorReading = Double.valueOf(payloadTokens[5]); 
        catch (NumberFormatException e) 

        double uvSensorReading = -1;
        try  uvSensorReading = Double.valueOf(payloadTokens[6]); 
        catch (NumberFormatException e) 

        LOGGER.warn("y: ", y);
        LOGGER.warn("x: ", x);
        LOGGER.warn("battery: ", battery);
        LOGGER.warn("smoke: ", smokeSensorReading);
        LOGGER.warn("gas: ", gasSensorReading);
        LOGGER.warn("temp: ", tempSensorReading);
        LOGGER.warn("uv: ", uvSensorReading);
        LOGGER.warn("danger: ",calculateDangerLevel(smokeSensorReading,gasSensorReading,tempSensorReading,uvSensorReading));

        //connect,insert,update data in sql via ResultSet

        try (Connection conn = DriverManager.getConnection(
                "jdbc:mysql:// localhost:3306/mqttdemo?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false",
                "xxxx","xxxx"))
        

        // SECOND_WAY:insert via ResultSet

            Statement stmt2 = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet result = stmt2.executeQuery("SELECT * FROM sensorsdata");
            result.moveToInsertRow();
            result.updateInt("id", 0);
            result.updateString(2, "topicCheck");
            result.updateDouble("cordY", y);
            result.updateDouble("cordX", x);
            result.updateDouble("battery", battery);
            result.updateDouble("sensor1", smokeSensorReading);
            result.updateDouble("sensor2", gasSensorReading);
            result.updateDouble("sensor3", tempSensorReading);
            result.updateDouble("sensor4", uvSensorReading);
            result.updateString(10, calculateDangerLevel(smokeSensorReading,gasSensorReading,tempSensorReading,uvSensorReading));
            result.updateString(11,timeEvent);
            result.insertRow();
            result.moveToInsertRow();
            //result.beforeFirst();
            result.last();
            System.out.println("id = " + result.getInt("id"));
            result.close();
            stmt2.close();
        
        catch (SQLException e) 
            System.out.println(e);
        

    

    public static void main(String[] args) 

        InputStream resourcesInputStream = PublisherImpl.class.getClassLoader().getResourceAsStream("application.properties");
        Properties properties = new Properties();
        try 
            properties.load(resourcesInputStream);
         catch (IOException e) 
            LOGGER.warn("Cannot read property ", e);
        

        String topicProperty = properties.getProperty("topic");
        String subscriberId = UUID.randomUUID().toString();
        MqttClient subscriber = null;
        try 
            subscriber = new MqttClient(properties.getProperty("mqttbroker_url"),subscriberId);
         catch (MqttException e) 
            LOGGER.warn(e.getMessage() + " Code: " + e.getReasonCode());
        

        //connection mqtt
        MqttConnectOptions options = new MqttConnectOptions();
        options.setAutomaticReconnect(true);
        options.setCleanSession(true);
        options.setConnectionTimeout(10);

        while (true) 
            try 
                Objects.requireNonNull(subscriber).connect(options);

                try 

                    subscriber.subscribe(topicProperty, (topic, msg) -> 
                        byte[] payload = msg.getPayload();
                        LOGGER.debug("Message received: topic=, payload=", topic, new String(payload));
                        parseMqttPayload(new String(payload));

                        //Calculate time of the event
                        LocalDateTime localDate = LocalDateTime.now();
                        //System.out.println(localDate);
                        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yy h:mm:ss");
                        // System.out.println(dtf.format(localDate));
                        timeEvent =dtf.format(localDate);

                        //Distinguish topics


                    );
                    subscriber.getTopic("topic");

                    while (true);
                 catch (MqttException e) 
                    LOGGER.warn("Cannot subscribe on . Code=.", topicProperty, e.getReasonCode(), e.getMessage());
                
             catch (MqttException e) 
                LOGGER.warn("Cannot connect to MQTT Broker");
            

            try 
                Thread.sleep(1000);
             catch (InterruptedException e) 
        
    


【问题讨论】:

为什么不能把对calculateDangerLevel()的调用添加到parseMqttPayload()的末尾? 我加了:LOGGER.warn("dan​​ger: ",calculateDangerLevel(smokeSensorReading,gasSensorReading,gasSensorReading,uvSensorReading)); 我认为问题解决了!非常感谢 hardillb! 【参考方案1】:

[已解决]

我对我的代码进行了以下更改,并且似乎可以正常工作!

    parseMqttPayload(new String(payload,**topic**)); private static void parseMqttPayload(String payload,String topic) result.updateString("topic", topic);

【讨论】:

以上是关于更新项目:将 Mqtt 代理(笔记本电脑)与 IOT 客户端 android 设备连接的主要内容,如果未能解决你的问题,请参考以下文章

我无法在 Lua 上为 ESP8266 订阅 MQTT 代理

学习笔记Mosquitto 基础安装使用

尝试使用开源 MQTT 代理 EMQ 为我的 IoT 项目设置我的 MQTT 云服务

如何从网站向不支持 Websockets 的 MQTT 代理发送消息?

Flutter mqtt,代理未响应连接

MQTT开源方案笔记