安卓APP通过MQTT远程连接ESP8266

安卓APP通过MQTT远程连接ESP8266

AMENG
2021-03-29 / 0 评论 / 50 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年09月24日,已超过1317天没有更新,若内容或图片失效,请留言反馈。

实现了通过安卓APP远程查看温度、湿度、控制开关,APP和受控端源码都不太完善(APP为网上找的开源代码修改),目前只是测试功能,目前存在问题ESP8266端还是通过发布和订阅多个主题来接收消息,这样虽然便于数据处理,不过在设备较多时容易造成混乱,应该一个设备就一条订阅和发布。APP端要分设备控制,要支持自定义mqtt服务器和添加设备。

ESP8266部分源码

[cpp]

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <dht11.h>
#include <rgb_led.h>

const char* ssid = "";
const char* password = "";
const char* mqtt_server = "*****";
const int mqttPort = 1883;
const char* mqttUserName = "***";
const char* mqttPassword = "***";
const char* client_id = "esp_8266_01"; //客户端ID
const char* recTopiclight = "esp/light/01"; // 订阅led灯主题
const char* recTopicrgb = "esp/rgb/01"; // 订阅rgb主题

dht11 DHT11;
#define DHT11PIN 5 //DHT11数据引脚
#define SmartconfigPin 14 //一键配网引脚
#define NUM_LEDS 1 //rgb灯的数量
ChainableLED leds(15, 4, NUM_LEDS); //rgb灯引脚设置scl sda

WiFiClient espClient;
PubSubClient client(espClient);

//一键配网函数
void smartConfig()
{
if(digitalRead(SmartconfigPin) == LOW){
digitalWrite(LED_BUILTIN, LOW);
WiFi.mode(WIFI_STA);//使用wifi的STA模式
Serial.println("\r\nWait for Smartconfig...");//串口打印
WiFi.beginSmartConfig();//等待手机端发出的名称与密码
//死循环,等待获取到wifi名称和密码
while (1)
{
//等待过程中一秒打印一个.
Serial.print(".");
delay(1000);
if (WiFi.smartConfigDone())//获取到之后退出等待
{
Serial.println("SmartConfig Success");
break;
}
}
WiFi.begin(WiFi.SSID().c_str(), WiFi.psk().c_str());
digitalWrite(LED_BUILTIN, HIGH);
}
}

//主题订阅函数
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...\r\n");
// Attempt to connect
if (client.connect(client_id,mqttUserName,mqttPassword)) {
Serial.println("connected");
// 连接成功时订阅主题
client.subscribe(recTopiclight);
client.subscribe(recTopicrgb);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 2 seconds before retrying
delay(2000);
}
}
}

//rgb灯控制函数
void rgb_control(uint8_t r_value, uint8_t g_value,uint8_t b_value, uint8_t bright_value)
{
uint8_t r,g,b;

r = ((float) r_value/255)*bright_value;
g = ((float) g_value/255)*bright_value;
b = ((float) b_value/255)*bright_value;

for(int i = 0; i < NUM_LEDS; i++){
leds.setColorRGB(i, r, g, b);
}
}

//回调函数
void callback(char* topic, byte* payload, unsigned int length)
{
uint8_t r,g,b,l;
Serial.print("Message arrived in topic: ");
Serial.println(topic);

//打印收到消息
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println("");

//led灯控制
if(strcmp(topic,"esp/light/01") == 0){
if ((char)payload[0] == '0') {
digitalWrite(LED_BUILTIN, HIGH); // 关
}
else if((char)payload[0] == '1'){
digitalWrite(LED_BUILTIN, LOW); // 亮
}
}

//rgb灯控制
if(strcmp(topic,"esp/rgb/01") == 0){
for(int i = 0; i < 12; i++){
if((char)payload[i] == '0')payload[i] = 0;
if((char)payload[i] == '1')payload[i] = 1;
if((char)payload[i] == '2')payload[i] = 2;
if((char)payload[i] == '3')payload[i] = 3;
if((char)payload[i] == '4')payload[i] = 4;
if((char)payload[i] == '5')payload[i] = 5;
if((char)payload[i] == '6')payload[i] = 6;
if((char)payload[i] == '7')payload[i] = 7;
if((char)payload[i] == '8')payload[i] = 8;
if((char)payload[i] == '9')payload[i] = 9;
}

r = payload[0]*100+payload[1]*10+payload[2];
g = payload[3]*100+payload[4]*10+payload[5];
b = payload[6]*100+payload[7]*10+payload[8];
l = payload[9]*100+payload[10]*10+payload[11];
Serial.println(r);
Serial.println(g);
Serial.println(b);
Serial.println(l);

rgb_control(r,g,b,l);
}
}
//初始化函数
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(SmartconfigPin, INPUT);

digitalWrite(LED_BUILTIN, HIGH);

//初始化RGB灯
leds.init();

//判断是否进入配网模式
smartConfig();

//连接WIFI
WiFi.begin(ssid, password);

//连接MQTT
client.setServer(mqtt_server, mqttPort);

//回调函数
client.setCallback(callback);
}

//循环函数
void loop()
{
if (!client.connected()){
reconnect();
}
client.loop();

//获取温度和湿度
DHT11.read(DHT11PIN);
String temp= String(DHT11.temperature);
String humi = String(DHT11.humidity);

client.publish("esp/temp/01", temp.c_str());
client.publish("esp/humi/01", humi.c_str());
delay(2000);
}

[/cpp]

0

评论 (0)

取消