Как подружить Websocket с PN532

h7d
Offline
Зарегистрирован: 04.04.2022

Здравствуйте, подскажите пожалуйста как подружить библиотеки. На C++ вряд-ли получится одновременно циклить Websocket и ожидать что карта будет приложена, но всё же, есть ли какой-нибудь выход?

Подключаться к Websocket'y при прикладывании карты и отправлять запрос не подойдёт, т. к. нужно отслеживать состояние постоянно, пока ESP32 включена.

Если использовать Websocket клиент без ожидания считывания карты, он работает отлично.

Был вариант с установкой 0-ой задержки, но в таком случае обработка входящих сообщений на ESP32 происходит только при прикладывании карты, а так-же они становятся в очередь.

  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength, 0);

 

Платформа:

ESP32 DEVKIT V1

PN532 китайский

 

Приложение:

  #include <WiFi.h>
  #include <WebServer.h>
  #include <WebSocketsClient.h>
  #include <Wire.h>
  #include <PN532_I2C.h>
  #include <PN532.h>
  #include <NfcAdapter.h>
  PN532_I2C pn532i2c(Wire);
  PN532 nfc(pn532i2c);
  
  const char* ssid = "****";
  const char* password = "****";
  const char* ADDR = "****";
  const char* URL = "/****";
  const uint16_t PORT = ****;
  
  WebSocketsClient webSocket;
  
void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
    switch(type) {
        case WStype_DISCONNECTED:
            Serial.printf("Отключен!\n");
            break;
        case WStype_CONNECTED:
            {
              Serial.printf("Подключен к %s\n",  payload);
              webSocket.sendTXT("{\"token\": \"****\"}");
            }
            break;
        case WStype_TEXT:
            {
                Serial.printf("I/D: %s\n", payload);
            }
            break;
    }
}
  
void setup(void) {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(500);
  }

  Serial.println();
  Serial.print("IP адрес: ");
  Serial.println(WiFi.localIP());

  webSocket.begin(ADDR, PORT, URL);
  webSocket.onEvent(webSocketEvent);
  webSocket.setReconnectInterval(5000);

  nfc.begin();
  uint32_t versiondata = nfc.getFirmwareVersion();

  if (! versiondata) {
    Serial.print("Плата PN53x не найдена\n");
    setup();
  }

  Serial.print("Найден чип PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Версия прошивки "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.');
  Serial.println((versiondata>>8) & 0xFF, DEC);
  nfc.setPassiveActivationRetries(0xFF);
  nfc.SAMConfig();
  Serial.println("Ожидание карты\n");
}

void loop(void) {    
  webSocket.loop();

  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  
  uint8_t uidLength;
  static unsigned long last = 0;   
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
  
  if (success) {
    Serial.println("Обнаружена карта!");
    Serial.print("UID: ");
    String card;
    for (uint8_t i=0; i < uidLength; i++) 
    {
      card += String(uid[i], HEX);
    }
    Serial.print(card + "\n"); 
    webSocket.sendTXT("{\"action\": \"auth\", \"hash\": \"" + card + "\"}");
  } else {
    Serial.println("Время ожидания истекло\n");
  }
  
  if (WiFi.status() != WL_CONNECTED) {
    setup();
  }
  
}

 

Библиотеки:

https://github.com/Links2004/arduinoWebSockets

https://github.com/elechouse/PN532

sadman41
Offline
Зарегистрирован: 19.10.2016

У ESP32 два ядра. Можно один из процессов отстрелить на другое и они будут параллельно крутится.

h7d
Offline
Зарегистрирован: 04.04.2022

ESP32 CORE_0 отдается под обслуживание радиоканала (WiFi) и самого контроллера, а CORE_1 - под выполнение скетча.

rkit
Offline
Зарегистрирован: 23.11.2016

h7d пишет:

ESP32 CORE_0 отдается под обслуживание радиоканала (WiFi) и самого контроллера, а CORE_1 - под выполнение скетча.

Нет.

h7d
Offline
Зарегистрирован: 04.04.2022

Спасибо, 4 дня голову ломал как асинхронно сделать.