esp8266测量到的水位消息发布到MQTT,JAVA订阅获取消息,打印到控制台并导出到txt文件

1、把下面代码烧录到开发板esp8266

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <string>

 
// WiFi和MQTT设置
const char* ssid = "305";
const char* password = "gxzy@#2023";
const char* mqtt_server = "broker.emqx.io";
const char* mqtt_user = "emqx";
const char* mqtt_password = "public";
const int mqtt_port = 1883; // 默认端口
int value=0;//定义一个整型的变量来保存测量值
WiFiClient espClient;
PubSubClient client(espClient);
 
void setup_wifi() {
  delay(10);
  // 连接到WiFi网络
  Serial.println();
  Serial.print("连接到 ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi 连接");
  Serial.println("IP 地址: ");
  Serial.println(WiFi.localIP());
}
 
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("消息到达 [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}
 
void reconnect() {
  // 如果已经连接,断开连接
  if (client.connected()) {
    client.disconnect();
  }
  // 重新连接MQTT服务器
  Serial.println("尝试MQTT连接...");
  if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
    Serial.println("连接成功");
  } else {
    Serial.print("失败, rc=");
    Serial.print(client.state());
    Serial.println("5秒后再试一次");
    // 如果连接失败,5秒后重试
    delay(5000);
  }
}
 
void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}
 
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
 
  // 发布数据的条件(例如每隔一段时间)
    value=(analogRead(A0)*100)/1024;//把测量到的水位值保存至value
    std::string s1 = "水位:" + std::to_string(value);
    // 发布数据到特定的主题
    const char* topic = "chc/test";
    const char* payload = s1.c_str();
    client.publish(topic, payload);
    Serial.print("发送消息到: ");
    Serial.print(topic);
    Serial.print(": ");
    Serial.println(payload);
    delay(2000);//延时500ms
    // 重置条件
    // /* 条件设置代码 */
  
}

2、Java订阅

导入依赖

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.5</version>
</dependency>
public int Subscribe(){
        String broker ="tcp://broker.emqx.io:1883"; //服务地及端口号
        String topic = "chc/test"; //主题
        String username ="emqx";//用户名
        String password ="public";//密码
        String clientid ="subscribe_client";//客户端Id
        int qos=0;
        try{
            MqttClient client = new MqttClient(broker,clientid,new MemoryPersistence());
            MqttConnectOptions options = new MqttConnectOptions();
            options.setUserName(username);
            options.setPassword(password.toCharArray());
            options.setConnectionTimeout(60);
            options.setKeepAliveInterval(60);

            //设置回调函数
            client.setCallback(new MqttCallback(){
                public void connectionLost(Throwable cause){
                    System.out.println("连接丢失:"+cause.getMessage());
                }
                public void messageArrived(String topic, MqttMessage message){
                    System.out.println("主题:"+topic);
                    System.out.println("消息内容:"+new String(message.getPayload()));
                    System.out.println("Qos:"+message.getQos());
                    String water = new String(message.getPayload());//获取消息内容 转为string类型
//                    int waterValue = Integer.parseInt(water);//将string类型的消息内容转为double类型
                    Date day = new Date();
                    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    System.out.println("正在将数据存入...");
//                    System.out.println(waterValue);
                    System.out.println(sdf.format(day));
                    // 定义要写入文件的文本内容
                    String consoleOutput = "当前水位:" + water + "   测量时间:" + sdf.format(day) + "\n";

                    // 定义文件路径
                    String filePath = "output.txt";

                    // 使用try-with-resources语句自动关闭资源
                    try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) { // 第二个参数为true,表示追加模式
                        // 将数据写入文件
                        writer.write(consoleOutput);

                        // 同时在控制台打印内容(如果需要)
                        System.out.print(consoleOutput);

                        // 刷新缓冲区以确保内容被写入文件
                        writer.flush();

                        System.out.println("数据已成功追加到文件 " + filePath);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    
                }
                public void deliveryComplete(IMqttDeliveryToken token){
                    System.out.println("投递Token--------"+token.isComplete());
                }
            });
            client.connect(options); //连接
            client.subscribe(topic,qos); //订阅


        }catch(Exception e){
            e.printStackTrace();
        }
        return 1;
    }

注意:两边的服务地址、端口号,主题,用户名,密码必须一致

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将ESP8266获取的串口信息发送到MQTT,可以使用以下步骤: 1. 安装MQTT库 在Arduino IDE中,选择“工具”>“管理库”,搜索并安装“PubSubClient”库。 2. 连接MQTT 使用WiFi连接到MQTT代理服务器,例如Mosquitto或CloudMQTT。在代码中设置MQTT服务器的IP地址、端口号和用户名密码等信息。 3. 读取串口信息 使用Serial.read()函数读取串口信息,并将其保存在一个变量中。 4. 发布MQTT消息 使用PubSubClient库的publish()函数将读取的串口信息发布MQTT代理服务器上的指定主题。 下面是一个示例代码: ``` #include <ESP8266WiFi.h> #include <PubSubClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* mqtt_server = "your_MQTT_server_IP"; const char* mqtt_user = "your_MQTT_username"; const char* mqtt_password = "your_MQTT_password"; const char* mqtt_topic = "your_MQTT_topic"; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } client.setServer(mqtt_server, 1883); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("esp8266Client", mqtt_user, mqtt_password )) { Serial.println("Connected to MQTT"); } else { Serial.print("Failed to connect to MQTT, rc="); Serial.print(client.state()); delay(2000); } } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); if (Serial.available()) { String message = Serial.readStringUntil('\n'); client.publish(mqtt_topic, message.c_str()); } } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } void reconnect() { while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("esp8266Client", mqtt_user, mqtt_password )) { Serial.println("Connected to MQTT"); } else { Serial.print("Failed to connect to MQTT, rc="); Serial.print(client.state()); delay(2000); } } } ``` 在这个示例代码中,ESP8266连接到WiFi,并连接到MQTT代理服务器。当有串口信息可用时,它将读取信息并将其发布到指定的MQTT主题上。如果WiFi或MQTT连接断开,它将重新连接。 请根据自己的实际情况修改示例代码中的WiFi和MQTT配置信息,并根据需要更改主题名称和消息格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值