Files
2022-08-16 09:44:14 +08:00

363 lines
11 KiB
C++

#include "espnow.h"
EspNow::EspNow() {
memset(&slave, 0, sizeof(slave));
}
EspNow::~EspNow() {
}
esp_now_peer_info_t EspNow::slave;
// send data
void EspNow::sendData(void *buf, int len) {
const uint8_t *peer_addr = slave.peer_addr;
// Serial.print("Sending: "); Serial.println(data);
esp_err_t result = esp_now_send(peer_addr, (uint8_t *)buf, len);
/*
Serial.print("Send Status: ");
if (result == ESP_OK) {
Serial.println("Success");
} else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
// How did we get so far!!
Serial.println("ESPNOW not Init.");
} else if (result == ESP_ERR_ESPNOW_ARG) {
Serial.println("Invalid Argument");
} else if (result == ESP_ERR_ESPNOW_INTERNAL) {
Serial.println("Internal Error");
} else if (result == ESP_ERR_ESPNOW_NO_MEM) {
Serial.println("ESP_ERR_ESPNOW_NO_MEM");
} else if (result == ESP_ERR_ESPNOW_NOT_FOUND) {
Serial.println("Peer not found.");
} else {
Serial.println("Not sure what happened");
}*/
}
// Check if the slave is already paired with the master.
// If not, pair the slave with master
bool EspNow::manageSlave() {
if (slave.channel == CHANNEL) {
if (DELETEBEFOREPAIR) {
deletePeer();
}
Serial.print("Slave Status: ");
const esp_now_peer_info_t *peer = &slave;
const uint8_t *peer_addr = slave.peer_addr;
// check if the peer exists
bool exists = esp_now_is_peer_exist(peer_addr);
if (exists) {
// Slave already paired.
Serial.println("Already Paired");
return true;
} else {
// Slave not paired, attempt pair
esp_err_t addStatus = esp_now_add_peer(peer);
if (addStatus == ESP_OK) {
// Pair success
Serial.println("Pair success");
return true;
} else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
// How did we get so far!!
Serial.println("ESPNOW Not Init");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_ARG) {
Serial.println("Invalid Argument");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_FULL) {
Serial.println("Peer list full");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
Serial.println("Out of memory");
return false;
} else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
Serial.println("Peer Exists");
return true;
} else {
Serial.println("Not sure what happened");
return false;
}
}
} else {
// No slave found to process
Serial.println("No Slave found to process");
return false;
}
}
void EspNow::deletePeer() {
const esp_now_peer_info_t *peer = &slave;
const uint8_t *peer_addr = slave.peer_addr;
esp_err_t delStatus = esp_now_del_peer(peer_addr);
Serial.print("Slave Delete Status: ");
if (delStatus == ESP_OK) {
// Delete success
Serial.println("Success");
} else if (delStatus == ESP_ERR_ESPNOW_NOT_INIT) {
// How did we get so far!!
Serial.println("ESPNOW Not Init");
} else if (delStatus == ESP_ERR_ESPNOW_ARG) {
Serial.println("Invalid Argument");
} else if (delStatus == ESP_ERR_ESPNOW_NOT_FOUND) {
Serial.println("Peer not found.");
} else {
Serial.println("Not sure what happened");
}
}
EspNowMaster::EspNowMaster() {
memset(peerlist.list, 0, sizeof(peerlist.list));
}
EspNowMaster::~EspNowMaster() {
}
peerList EspNowMaster::peerlist;
// broadcast every address that scanSlaveList found
void EspNowMaster::InitBroadcastSlave() {
// clear slave data
memset(&slave, 0, sizeof(slave));
for (int ii = 0; ii < 6; ++ii) {
slave.peer_addr[ii] = (uint8_t)0xff;
}
slave.channel = CHANNEL; // pick a channel
slave.encrypt = 0; // no encryption
manageSlave();
}
void EspNowMaster::Broadcast() {
if (isConnected) {
} else {
uint8_t req[] = {0xaa, 0x66};
sendData(req, 2);
}
}
void EspNowMaster::Init(void) {
WiFi.mode(WIFI_STA);
Serial.print(" MAC: ");
Serial.println(WiFi.macAddress());
WiFi.disconnect();
if (esp_now_init() == ESP_OK) {
Serial.println("ESPNow Init Success");
} else {
Serial.println("ESPNow Init Failed");
// Retry InitESPNow, add a counte and then restart?
// InitESPNow();
// or Simply Restart
ESP.restart();
}
esp_now_register_send_cb(OnDataSent);
esp_now_register_recv_cb(OnDataRecv);
// ScanForSlave();
InitBroadcastSlave();
}
int8_t EspNowMaster::isPeerExist(esp_now_peer_info_t peer) {
char macStr[18];
if (esp_now_is_peer_exist(peer.peer_addr)) {
Serial.printf("this peer is already exist\r\n");
return 1;
} else {
for (int i = 0; i < 6; i++) {
peerlist.list[peerlist.count].peer_addr[i] = peer.peer_addr[i];
// slave.peer_addr[i] = peer.peer_addr[i];
}
peerlist.count++;
esp_now_add_peer(&peer);
return 0;
}
}
bool EspNowMaster::confirmPeer(esp_now_peer_info_t peer) {
for (int i = 0; i < 6; i++) {
slave.peer_addr[i] = peer.peer_addr[i];
}
isConnected = true;
slave.channel = CHANNEL; // pick a channel
slave.encrypt = 0;
manageSlave();
return true;
}
void EspNowMaster::OnDataSent(const uint8_t *mac_addr,
esp_now_send_status_t status) {
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4],
mac_addr[5]);
// Serial.print("Last Packet Sent to: "); Serial.println(macStr);
// Serial.print("Last Packet Send Status: "); Serial.println(status ==
// ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
if (sendCallBack != NULL) {
sendCallBack(mac_addr, status);
}
}
void EspNowMaster::OnDataRecv(const uint8_t *mac_addr, const uint8_t *data,
int data_len) {
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4],
mac_addr[5]);
// Serial.print("Last Packet Recv from: "); Serial.println(macStr);
// Serial.print("Last Packet Recv Data: "); Serial.println(*data);
// Serial.println("");
if (data_len == 2 && data[0] == 0xaa && data[1] == 0x77) {
Serial.printf("recv slave confirm");
Serial.println(macStr);
esp_now_peer_info_t peer;
memset(&peer, 0, sizeof(peer));
for (int i = 0; i < 6; i++) {
peer.peer_addr[i] = mac_addr[i];
}
isPeerExist(peer);
}
if (recvCallBack != NULL) {
recvCallBack(mac_addr, data, data_len);
}
}
recvCB EspNowMaster::recvCallBack;
sendCB EspNowMaster::sendCallBack;
EspNowSlave::EspNowSlave() {
memset(peerlist.list, 0, sizeof(peerlist.list));
}
EspNowSlave::~EspNowSlave() {
}
void EspNowSlave::configDeviceAP() {
WiFi.mode(WIFI_AP_STA);
String mac = WiFi.softAPmacAddress();
String SSID = "Slave" + mac;
bool result =
WiFi.softAP(SSID.c_str(), "Slave_1_Password", SLAVE_CHANNEL, 0);
if (!result) {
Serial.println("AP Config failed.");
} else {
Serial.println("AP Config Success. Broadcasting with AP: " +
String(SSID));
}
}
peerList EspNowSlave::peerlist;
void EspNowSlave::Init() {
configDeviceAP();
preferences.begin("test", false);
String mac_addr;
mac_addr = preferences.getString("mac_addr", "error");
Serial.print("Slavemac_addr = ");
Serial.print(mac_addr);
WiFi.disconnect();
if (esp_now_init() == ESP_OK) {
Serial.println("ESPNow Init Success");
} else {
Serial.println("ESPNow Init Failed");
// Retry InitESPNow, add a counte and then restart?
// InitESPNow();
// or Simply Restart
ESP.restart();
}
char peer_addr[6] = {0};
memset(&slave, 0, sizeof(slave));
sscanf(mac_addr.c_str(), "%x:%x:%x:%x:%x:%x%c", &slave.peer_addr[0],
&slave.peer_addr[1], &slave.peer_addr[2], &slave.peer_addr[3],
&slave.peer_addr[4], &slave.peer_addr[5]);
for (int i = 0; i < 6; ++i) {
// slave.peer_addr[i] = (uint8_t) peer_addr[i];
Serial.printf("%x\r\n", slave.peer_addr[i]);
}
slave.channel = SLAVE_CHANNEL;
// esp_now_add_peer(&slave);
esp_now_register_send_cb(OnDataSent);
esp_now_register_recv_cb(OnDataRecv);
}
void EspNowSlave::OnDataSent(const uint8_t *mac_addr,
esp_now_send_status_t status) {
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4],
mac_addr[5]);
if (sendCallBack != NULL) {
sendCallBack(mac_addr, status);
}
}
void EspNowSlave::Ack(esp_now_peer_info_t peer) {
slave = peer;
slave.channel = SLAVE_CHANNEL;
slave.encrypt = 0;
slave.ifidx = WIFI_IF_AP;
isPeerExist(slave);
// Serial.println("add peer");
uint8_t ackdata[] = {0xaa, 0x77};
Serial.print("macaddress");
for (int i = 0; i < 6; i++) {
Serial.printf("%x:", slave.peer_addr[i]);
}
// Serial.println("add peer");
Serial.println();
isConnected = true;
sendData(ackdata, 2);
}
int8_t EspNowSlave::isPeerExist(esp_now_peer_info_t peer) {
char macStr[18];
if (esp_now_is_peer_exist(peer.peer_addr)) {
Serial.printf("this peer is already exist\r\n");
return 1;
} else {
for (int i = 0; i < 6; i++) {
peerlist.list[peerlist.count].peer_addr[i] = peer.peer_addr[i];
// slave.peer_addr[i] = peer.peer_addr[i];
}
peerlist.count++;
esp_now_add_peer(&peer);
return 0;
}
}
void EspNowSlave::OnDataRecv(const uint8_t *mac_addr, const uint8_t *data,
int data_len) {
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4],
mac_addr[5]);
if (data_len == 2 && data[0] == 0xaa && data[1] == 0x66) {
Serial.println("recv aa 66");
esp_now_peer_info_t peer;
for (int i = 0; i < 6; i++) {
peer.peer_addr[i] = mac_addr[i];
}
peer.channel = SLAVE_CHANNEL; // pick a channel
peer.encrypt = 0; // no encryption
peer.ifidx = WIFI_IF_AP;
isPeerExist(peer);
}
if (recvCallBack != NULL) {
recvCallBack(mac_addr, data, data_len);
}
}
recvCB EspNowSlave::recvCallBack;
sendCB EspNowSlave::sendCallBack;