Я пытаюсь сделать мою систему esp32 более динамичной, так как контроллер добавит одноранговый узел любого ведомого, включенного поблизости.Это позволяет добавить любое количество ведомых, и позже будет легко добавить новых.У меня есть MAC-адрес контроллера, жестко запрограммированный в подчиненные устройства, так что это не проблема.
Моя проблема возникает, когда я пытаюсь вызвать esp_now_add_peer после того, как контроллер получает данные.При проверке ошибок он утверждает, что одноранговый узел был успешно добавлен, но когда я пытаюсь отправить ответ ведомому, чтобы подтвердить его, я получаю ошибку отправки.
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {
slave.channel = CHANNEL;
slave.encrypt = 0;
memcpy(slave.peer_addr, mac_addr, sizeof(mac_addr));
esp_err_t addStatus = esp_now_add_peer(&slave);
if (addStatus == ESP_OK) {
// Pair success
Serial.println("Pair success");
}
else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
// How did we get so far!!
Serial.println("ESPNOW Not Init");
}
else if (addStatus == ESP_ERR_ESPNOW_ARG) {
Serial.println("Invalid Argument");
}
else if (addStatus == ESP_ERR_ESPNOW_FULL) {
Serial.println("Peer list full");
}
else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
Serial.println("Out of memory");
}
else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
Serial.println("Peer Exists");
}
else {
Serial.println("Not sure what happened");
}
char macStr[18];
//Copies the receiver Mac Address to a string
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.println(macStr);
sendstart(mac_addr);
Это функция приема, при которой любая пара успешноили пара существует называется означает, что это сработало.Но сразу после того, как я позвоню sendstart.
void sendstart(const uint8_t *mac_addr){
uint8_t values[1];
values[0] = 'z'; //hex value of 7A, for reseting target to sequence
esp_err_t result = esp_now_send(mac_addr, (uint8_t*) &values, sizeof(values)); //send to the specified target
//If it was successful
if (result == ESP_OK) {
Serial.println("Success");
}
//if it failed
else {
Serial.println("Error");
}
}
И оттуда ошибка всегда срабатывает.Я проверил его, где я жестко закодировал MAC-адрес ведомого и добавил его во время установки.И затем он добавляет его снова во время приема вызова, но успешно отправляет.Ниже описано, как добавить MAC-адрес вручную во время настройки во время тестирования.
uint8_t macSlaves[][6] = {{0x24, 0x0a, 0xc4, 0x1c, 0x77, 0x44}};
int slavesCount = sizeof(macSlaves)/6/sizeof(uint8_t);
for(int i=0; i<slavesCount; i++){
slave.channel = CHANNEL;
slave.encrypt = 0;
memcpy(slave.peer_addr, macSlaves[i], sizeof(macSlaves[i]));
esp_now_add_peer(&slave);
}
Поэтому я действительно не знаю, что делаю неправильно или как происходит добавление однорангового узла во время настройки и позднее во время вызова.считаются разными.Я искал повсюду и нашел несколько случаев, как добавить одноранговых узлов, но ничего о добавлении во время приема вызова.Если это невозможно, пожалуйста, дайте мне знать, тогда я могу прекратить тратить время, пытаясь это исправить.В противном случае, дайте мне знать, где я ошибся и / или пример.
Спасибо