esp32 互相通信 蓝牙双服务
一个esp 两个蓝牙服务
一个esp wifi接受 蓝牙控制 但是wifi只能是2.4G
多个客户端同时连接esp32蓝牙
两个esp32蓝牙 一个当做键盘一个当做服务接受代码,那么接受代码的这个怎么把接受的数据传递给另外一个蓝牙 espnow或者 串口
接收端作为蓝牙键盘 可以通过蓝牙桥接 也可以通过串口直接控制 多个esp32 再通过接收端发送键盘输入给电脑
蓝牙接收电脑的指令 然后向电脑发送按键输入
两个esp32可以实现无线通信无需串口
电脑和esp32通信 esp32和esp32通信 esp32键盘输入到电脑
虽然同一个串口可以双向收发信息,虽然蓝牙 可能可以做到写入和读取,但是蓝牙的服务只能存在一个,和键盘服务冲突
esp now 连接
ESP-NOW是乐鑫(Espressif)开发的一种短距离无线通信协议,允许ESP32设备在没有Wi-Fi连接的情况下直接通信。以下是两个ESP32通过ESP-NOW通信的基本步骤:
ESP-NOW 是乐鑫定义的一种无线通信协议,能够在无路由器的情况下直接、快速、低功耗地控制智能设备。它能够与 Wi-Fi 和 Bluetooth LE 共存,支持乐鑫 ESP8266、ESP32、ESP32-S 和 ESP32-C 等多系列 SoC。ESP-NOW 广泛应用于智能家电、远程控制和传感器等领域。
基于 ESP-NOW 构建的 Wi-Fi 手持遥控器,支持即时控制搭载 ESP32 的智能设备,如玩具小车、小飞机、机器人等,可达到毫秒级的控制延时,实现比蓝牙传输更远的控制距离。 发射功率高达 21 dBm,在空旷环境中可实现 200 m+ 的通信距离。
基本设置步骤
1. 安装必要的库
确保你已安装Arduino IDE的ESP32开发板支持包。
2. 发送端代码示例
#include <esp_now.h>
#include <WiFi.h>
// 接收方的MAC地址
uint8_t broadcastAddress[] = {0xCC, 0x7B, 0x5C, 0x26, 0xC6, 0x0C}; // 接收方 MAC
// 要发送的数据结构
typedef struct struct_message {
int id;
float value;
} struct_message;
struct_message myData;
// 当数据发送状态回调时调用此函数
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("Packet sent to: ");
for (int i = 0; i < 6; ++i) {
Serial.printf("%02X%s", mac_addr[i], (i < 5) ? ":" : "");
}
Serial.print(" | Status: ");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Success" : "Failed");
}
void setup() {
// 初始化串口
Serial.begin(115200);
// 设置WiFi为Station模式
WiFi.mode(WIFI_STA);
// 初始化ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// 注册发送状态回调函数
esp_now_register_send_cb(OnDataSent);
// 添加对等设备(接收方)
esp_now_peer_info_t peerInfo = {};
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0; // 使用默认频道
peerInfo.encrypt = false; // 不加密
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
}
void loop() {
// 填充要发送的数据
myData.id = 1;
myData.value = random(10, 99) / 10.0; // 生成一个随机浮点数,例如 1.2, 3.5 等
// 发送数据
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));
if (result == ESP_OK) {
Serial.println("Send request queued successfully.");
} else {
Serial.println("Send request failed.");
}
delay(2000); // 每隔2秒发送一次
}
3. 接收端代码示例
#include <esp_now.h>
#include <WiFi.h>
// 接收数据回调函数
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Message: ");
Serial.println((char*)incomingData);
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
// 初始化ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// 注册接收回调
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
// 主循环可以保持为空或执行其他任务
}