目录
  1. 概述
  2. 硬件部分
  3. 8266固件烧录
  4. Arduino IDE 8266版型下载
  5. 安装MQTT库
  6. ESP8266程序设计
  7. APP部分
  8. 创建项目
  9. UI设计
  10. 主程序设计

概述

本次试验使用的是ESP8266 NodeMCU

硬件部分

8266固件烧录

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

Arduino IDE 8266版型下载

打开Arduino IDE,在文件-首选项-附加开发板管理器网址中输入: http://arduino.esp8266.com/stable/package_esp8266com_index.json Arduino IDE 8266版型下载 然后打开工具-开发板-开发板管理器,在搜索框输入esp8266,在下方弹出的搜索结果中选中要下载的版型,点击安装即可。(下载速度较慢,可挂梯子) Arduino IDE 8266版型下载 (2) 到此为止,硬件部分的准备工作就完成了,接下来就可以使用Arduino IDE进行ESP8266的编程。

安装MQTT库

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

ESP8266程序设计

代码不长,贴在下方

#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 常用的代码列下 java 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 函数是程序打开后最先运行的地方

主程序设计

  1. 移植 Mqtt_init() 函数
  2. 移植 startReconnect() 函数
  3. 移植 publishmessageplus() 函数
  4. 在 OnCreate 中加入
  Mqtt_init();
  startReconnect();
  handler = new Handler() {

注:每完成一小步都要刷入真机调试,以免调 bug 之痛

  1. 按钮单击事件
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();
	}
});
  1. 导入 JAR 包 将 mqtt 的 JAR 包复制到 app 下的 libs 文件夹中 右键 JAR 包 Add as Lib 确定

以上就完成了基本的 app 与 ESP8266 的通信。 主程序设计 (2) 主程序设计 (3) 感谢正哥,B站up阿正啷个哩个啷,大佬的教程