给大家补一份ESP32C3的代码
#include <WiFi.h>
#include "PubSubClient.h"
#include <WiFiUdp.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEAdvertising.h>
//********************需要修改的部分*******************//
const char* ssid = "XXXX"; // 你的WiFi名称
const char* password = "XXXXXXXX"; // 你的WiFi密码
#define ID_MQTT "XXXXXXXXXXXXXX" // 巴法云用户私钥
const char* topic = "XXXXXXXXXXXX"; // 巴法云主题名称
const int B_led = 2; // LED引脚(ESP32-C3的GPIO2)
bool Turned = false;
//**************************************************//
const char* mqtt_server = "bemfa.com";
const int mqtt_server_port = 9501;
WiFiClient espClient;
PubSubClient client(espClient);
// BLE相关配置
BLEServer* pServer = nullptr;
BLEAdvertising* pAdvertising = nullptr;
const char* BLE_DEVICE_NAME = "ESP32-C3-Proj";
// UDP配置
WiFiUDP Udp;
IPAddress remote_IP(192, 168, 3, 27);
unsigned int remoteUdpPort = 16735;
unsigned int remoteUdpPortFZ = 16750;
const char* Keyword = "KEYPRESSES:116";
const char* KeywordFZ = "{"action":20000,"controlCmd":{"delayTime":0,"mode":6,"time":0,"type":0},"msgid":"2"}";
// 函数声明
void turnOn();
void turnOff();
void setup_wifi();
void callback(char* topic, byte* payload, unsigned int length);
void reconnect();
void initBLE();
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Topic:");
Serial.println(topic);
String msg = "";
for (int i = 0; i < length; i++) {
msg += (char)payload[i];
}
Serial.print("Msg:");
Serial.println(msg);
if (msg == "on") {
turnOn();
Turned = true;
} else if (msg == "off") {
turnOff();
Turned = false;
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(ID_MQTT)) {
Serial.println("connected");
client.subscribe(topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
// 初始化BLE广播(包含自定义厂商数据)
void initBLE() {
BLEDevice::init(BLE_DEVICE_NAME);
pServer = BLEDevice::createServer();
pAdvertising = pServer->getAdvertising();
BLEAdvertisementData advData;
// 厂商特定数据配置
// 格式:[公司代码(2字节)] + [自定义数据(n字节)]
uint8_t manufacturerData[] = {
0x46, 0x00, // 公司代码 Company Code: 0x0046(小端模式存储)
0x63, 0xC1, 0xA5, 0x10, // 自定义数据部分
0x39, 0x54, 0x38, 0xFF,
0xFF, 0xFF, 0x30, 0x43,
0x52, 0x4B, 0x54, 0x4D
};
// 设置厂商数据(转换为Arduino String类型)
advData.setManufacturerData(String((char*)manufacturerData, sizeof(manufacturerData)));
advData.setName(BLE_DEVICE_NAME); // 设备名称
pAdvertising->setAdvertisementData(advData);
pAdvertising->setScanResponse(false);
pAdvertising->setMinInterval(128);
pAdvertising->setMaxInterval(256);
}
void setup() {
pinMode(B_led, OUTPUT);
digitalWrite(B_led, LOW);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_server_port);
client.setCallback(callback);
initBLE();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (Turned) {
if (!pAdvertising->isAdvertising()) {
pAdvertising->start();
Serial.println("BLE广播已启动");
}
} else {
if (pAdvertising->isAdvertising()) {
pAdvertising->stop();
Serial.println("BLE广播已停止");
}
}
delay(100);
}
void turnOn() {
digitalWrite(B_led, HIGH);
Serial.println("投影已打开");
}
void turnOff() {
digitalWrite(B_led, LOW);
Udp.beginPacket(remote_IP, remoteUdpPortFZ);
Udp.print(KeywordFZ);
Udp.endPacket();
Serial.println("投影已关闭,已发送关机指令");
}
|