ESP32_NOW 主从简单通信

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白文化

求大佬打赏;

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值