ESP32_NOW 主从简单通信
#include <Arduino.h>
#include <U8g2lib.h>
#include <esp_now.h>
#include <WiFi.h>
//esp_now 从机设置
//mac_addr MAC地址
//data 数据
// data_len 数据长度
void OnDataRecv(const uint8_t *mac_addr,const uint8_t *data,int data_len)
{
Serial.printf("receive:%d\r\n",data[0]);
}
void setup() {
Serial.begin(9600);
//Slave_1 热点名称
//Slave_1_Password 热点密码
//1 为通道号
WiFi.softAP("Slave_1","Slave_1_Password",1,0);
//初始化
esp_now_init();
//打开回调函数
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
}
主机程序
#include <Arduino.h>
#include <U8g2lib.h>
#include <esp_now.h>
#include <WiFi.h>
#include <esp_wifi.h>
esp_now_peer_info_t slave;
#define DELETEBEFOREPAIR 0
void InitESPNow()
{
esp_now_init();
}
void ScanForSlave()
{
// 调用WiFi.scanNetworks函数开始扫描Wi-Fi网络,参数设置为:不隐藏网络,不保存SSID,不保存BSSID,扫描时间最长300秒,只返回最多1个结果(但这里实际上返回所有找到的结果数)
// 注意:最后两个参数可能根据ESP8266/ESP32的库版本和具体实现有所不同,这里的参数可能不完全准确反映所有库的行为
int16_t scanResults = WiFi.scanNetworks(false,false,false,300,1);
// 初始化一个标志位,用于标记是否找到了包含"Slave"的SSID
bool slaveFound = false; // 使用false代替0,更易于理解
// 初始化一个结构体(假设为slave),这里通过memset将所有字节设置为0
// 注意:这里假设slave结构体已经定义,并且包含peer_addr(MAC地址)等成员
memset(&slave, 0, sizeof(slave));
// 遍历所有扫描到的网络
for(int i = 0; i < scanResults; ++i)
{
// 获取当前网络的SSID
String SSID = WiFi.SSID(i);
// 获取当前网络的RSSI(信号强度)
int32_t RSSI = WiFi.RSSI(i);
// 获取当前网络的BSSID,并转换为字符串形式
String BSSIDstr = WiFi.BSSIDstr(i);
// 稍微延迟一下,减少连续API调用的压力
delay(10);
// 检查SSID是否以"Slave"开头
if (SSID.indexOf("Slave") == 0)
{
// 定义一个数组用于存储MAC地址的各个部分
int mac[6];
// 使用sscanf从BSSID字符串中解析MAC地址,并存储在mac数组中
// 如果解析成功,会返回6(因为MAC地址有6个部分)
if (6 == sscanf(BSSIDstr.c_str(),"%x:%x:%x:%x:%x:%x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]))
{
// 将解析出的MAC地址的每个部分转换为uint8_t类型,并存储在slave结构体的peer_addr成员中
for (int ii = 0; ii < 6; ++ii)
{
slave.peer_addr[ii] = (uint8_t)mac[ii];
}
}
// 假设连接时使用的频道为1(这可能需要根据实际情况调整)
slave.channel = 1;
// 假设不需要加密(这通常不是安全的做法,但这里可能是为了简化示例)
slave.encrypt = 0;
// 设置slaveFound标志为true,表示找到了目标网络
slaveFound = true;
// 跳出循环,因为我们已经找到了目标网络
break;
}
}
// 注意:此函数在找到目标网络后没有直接执行连接操作,而是设置了一些参数并标记了找到的状态
// 后续可能需要基于slaveFound的值和slave结构体中的信息来执行连接操作
}
bool manageSlave()
{
if(slave.channel == 1)
{
bool exists = esp_now_is_peer_exist(slave.peer_addr);
if(exists)
{
return true;
}
else
{
esp_err_t addStatus = esp_now_add_peer(&slave);
if(addStatus == ESP_OK)
{
return true;
}
else if(addStatus == ESP_ERR_ESPNOW_NOT_INIT)
{
return false;
}
}
return false;
}
else
{
return false;
}
}
void OnDataSent(const uint8_t *mac_addr,esp_now_send_status_t status)
{
///u
int ii;
}
void sendData()
{
static uint8_t data = 0;
data++;
const uint8_t *peer_addr = slave.peer_addr;
esp_err_t result = esp_now_send(peer_addr,&data,sizeof(data));
if (result = ESP_OK)
{
Serial.println("success");
}
}
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
esp_wifi_set_channel(1,WIFI_SECOND_CHAN_NONE);
InitESPNow();
esp_now_register_send_cb(OnDataSent);
}
void loop() {
ScanForSlave();
if (slave.channel == 1)
{
bool isPaired = manageSlave();
if (isPaired)
{
sendData();
}
}
delay(1000);
}
参考视频https://www.bilibili.com/video/BV1YN4y1o7Kd/?p=9&spm_id_from=333.337.top_right_bar_window_history.content.click&vd_source=00217da3dd521fe6dc49ba32c87b19e8