Как подружить Websocket с PN532
- Войдите на сайт для отправки комментариев
Пнд, 04/04/2022 - 09:33
Здравствуйте, подскажите пожалуйста как подружить библиотеки. На 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();
}
}
Библиотеки:
У ESP32 два ядра. Можно один из процессов отстрелить на другое и они будут параллельно крутится.
ESP32 CORE_0 отдается под обслуживание радиоканала (WiFi) и самого контроллера, а CORE_1 - под выполнение скетча.
ESP32 CORE_0 отдается под обслуживание радиоканала (WiFi) и самого контроллера, а CORE_1 - под выполнение скетча.
Нет.
Спасибо, 4 дня голову ломал как асинхронно сделать.