概述

本次试验使用的是ESP8266 NodeMCU

硬件部分

8266固件烧录

固件烧录的是nodemcu官方固件,打开官方提供的ESP8266Flasher,在配置一栏选择nodemcu固件,烧录地址为0x00000。

Arduino IDE 8266版型下载

打开Arduino IDE,在文件-首选项-附加开发板管理器网址中输入:
http://arduino.esp8266.com/stable/package_esp8266com_index.json

然后打开工具-开发板-开发板管理器,在搜索框输入esp8266,在下方弹出的搜索结果中选中要下载的版型,点击安装即可。(下载速度较慢,可挂梯子)

到此为止,硬件部分的准备工作就完成了,接下来就可以使用Arduino IDE进行ESP8266的编程。

安装MQTT库

因本程序设计MQTT部分,因此还需要安装MQTT库才能正常编译程序,打开项目-加载库-管理库,有许多mqtt库可以选择,我使用的是PubSubClient。

ESP8266程序设计

代码不长,贴在下方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
WiFiClient espClient;
PubSubClient client(espClient);
const char* wifissid = "Wifi_SSID"; //自己家WIFI
const char* password = "Wifi_Password"; //自己家WIFI密码
const char* mqtt_server = "***,***,***,***";//MQTT服务器地址
const char* mqtt_id = "827855942_ESP";//MQTT ID需要唯一,这里我设置成自己的QQ号+_ESP
const char* Mqtt_sub_topic = "827855942_ESP"; //ESP8266订阅的topic,其他客户端向此topic发送信息时ESP8266会收到,设成自己的QQ号+_ESP
const char* Mqtt_pub_topic = "827855942"; //ESP8266发布消息的topic,上报消息给手机APP的TOPIC,设成自己的QQ号
long lastMsg = 0; //定时用的

void setup() {
pinMode(2, OUTPUT);
Serial.begin(115200);//设置波特率
setup_wifi();//初始化wifi
client.setServer(mqtt_server, 1883);//设定MQTT服务器与使用的端口,1883是默认的MQTT端口
client.setCallback(callback); //设定回调方式,当ESP8266收到订阅消息时会调用此方法
}

//初始化Wifi
//连接成功后可在串口监视器看到ESP8266的IP地址
void setup_wifi() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifissid);
WiFi.begin(wifissid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

//回调函数,参数固定不能改
//payload内容可以是任意的,此程序中传递的是JSON数据
void callback(char* topic, byte* payload, unsigned int length) {
String msg="";
String LED_set = "";
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
//msg中存放的就是传递过来的json数据,此处为{"set_led":1}格式
for (int i = 0; i < length; i++) {
msg+= (char)payload[i];
}
Serial.println(msg);
if(msg.indexOf("led")) //判断是否是要设置LED灯
{
//取出LED_set数据 并执行
LED_set = msg.substring(msg.indexOf("led\":")+5,msg.indexOf("}"));
digitalWrite(2,!LED_set.toInt());
}
}

//断线重连
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(mqtt_id)) {
Serial.println("connected");
//连接成功以后就开始订阅
client.subscribe(Mqtt_sub_topic,1);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}

void loop() {
//MQTT是否连接,若未连接则重连
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();//运行时间
if (now - lastMsg > 2000) {
lastMsg = now;
//打包发送数据给pubtopic
String json = "{\"temperature\":"+String(analogRead(A0))+"}";
client.publish(Mqtt_pub_topic,json.c_str());
}
}

APP部分

创建项目

Start a new Android project,我选择Empty Activity,name随意,language java,Android版本要小于等于手机安卓版本。(尽量用真机调试,虚拟机bug太多)

UI设计

打开app-res-layout下的activity_main.xml文件,设计UI
常用的代码列下

1
2
3
4
5
6
7
android:orientation="vertical"	//设置线性布局方向
android:background="#FFFFFF" //设置背景色
android:src="@drawable/pic" //ImageView下添加图片
android:layout_margin="10dp" //设置距离父空间边缘距离
android:id="@+id/image_1 //设置id
android:layout_weight="1" //布局内设置权重
android:gravity="center_vertical" //布局内设置垂直居中

主程序设计

打开MainActivity.java编写程序
1. OnCreate函数是程序打开后最先运行的地方

![](https://img.mahaofei.com/img/202112231030143-esp8266-app-6.png)
	4. 移植Mqtt_init()函数
	5. 移植startReconnect()函数
	6. 移植publishmessageplus()函数
	7. 在OnCreate中加入
	
1
2
3
Mqtt_init();
startReconnect();
handler = new Handler() {
注:每完成一小步都要刷入真机调试,以免调bug之痛 2. 按钮单击事件
1
2
3
4
5
6
7
8
9
button_1 = findViewById(R.id.button_1); //寻找XML里面真正的ID,与自己初始化的变量绑定
button_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//这里是单击之后执行的地方
//在当前ativity 显示内容为hello的短时间弹窗
Toast.makeText(MainActivity.this,"hello",Toast.LENGTH_SHORT).show();
}
});
3. 导入JAR包 将mqtt的JAR包复制到app下的libs文件夹中 右键JAR包Add as Lib确定

以上就完成了基本的app与ESP8266的通信。


感谢正哥,B站up阿正啷个哩个啷,大佬的教程