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;
}
注意:两边的服务地址、端口号,主题,用户名,密码必须一致