Проблемы с добавлением одноранговых узлов esp32 при попытке добавления одноранговых узлов после получения данных - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь сделать мою систему 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);
  }

Поэтому я действительно не знаю, что делаю неправильно или как происходит добавление однорангового узла во время настройки и позднее во время вызова.считаются разными.Я искал повсюду и нашел несколько случаев, как добавить одноранговых узлов, но ничего о добавлении во время приема вызова.Если это невозможно, пожалуйста, дайте мне знать, тогда я могу прекратить тратить время, пытаясь это исправить.В противном случае, дайте мне знать, где я ошибся и / или пример.

Спасибо

...