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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值