Как отправить int массив с запросом ESP8266 http post?

Я читаю UID RFID-карт с помощью ESP8266 и пытаюсь отправить эту информацию на мой веб-сервер, размещенный на Raspberry Pi. В настоящее время я храню UID в массиве int, но функция http.POST(); принимает строковый ввод. Я попытался сложить каждую цифру UID вместе, но это тоже не работает.

Как бы вы отправили uid в запросе?

Мой код:

    /*
    Created by TheCircuit
*/

#define SS_PIN 4  //D2
#define RST_PIN 5 //D1

#include <SPI.h>
#include <MFRC522.h>

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char* ssid = "****";
const char* password = "****";
const char* serverName = "****";
int RELAY = 2; //D6

int UIDs[1][4] = {
  {83, 111, 39, 47}
};

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Создать экземпляр MFRC522.

void setup()
{
  Serial.begin(9600);   // Инициировать последовательную связь
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522

  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, HIGH);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
}

boolean compareUIDs(int a[4], int b[4]) {
  for (int i = 0; i < 4; i++) {
    if (a[i] != b[i]) return false;
  }

  return true;
}

void loop()
{
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }

  // mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

  int UID[4];
  for (int i = 0; i < 4; i++) {
    UID[i] = mfrc522.uid.uidByte[i];
  }

  Serial.print(UID[0]);
  Serial.print(" ");
  Serial.print(UID[1]);
  Serial.print(" ");
  Serial.print(UID[2]);
  Serial.print(" ");
  Serial.print(UID[3]);
  Serial.println();

  for (int i = 0; i < sizeof(UIDs); i++) {
    boolean success = compareUIDs(UIDs[i], UID);
    if (success) {
      Serial.println("ACCESS GRANTED");
      digitalWrite(RELAY, LOW);

      if (WiFi.status() == WL_CONNECTED) {
        HTTPClient http;

        // Ваше доменное имя с URL-адресом или IP-адрес с путем
        http.begin(serverName);

        // заголовок content-type
        http.addHeader("Content-Type", "application/json");
        
        int httpResponseCode = http.POST("UID GOES HERE");

        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);

        // Free resources
        http.end();
      }

      delay(2000);
      digitalWrite(RELAY, HIGH);
      return;
    }
  }
}

, 👍0

Обсуждение

Вы кодируете его в некотором строковом формате, который ожидает веб-сайт на удаленном конце. Либо в виде списка параметров HTTP, либо в виде строки массива JSON, либо как угодно., @Majenko

@Majenko не могли бы вы дать мне ссылку или краткое объяснение, чтобы начать работу над этим?, @leventecsoba

Похоже, что вы уже решили (или наложили на вас) JSON. Поэтому самый простой метод-использовать ArduinoJson (https://arduinojson.org/) чтобы создать для вас строку JSON., @Majenko

мой StreamLib имеет CStringBuilder для "печати" в строку так же, как вы печатаете в Serial, @Juraj

вы можете отправить его как целое число ... этот UID в вашем коде-536f272f, @jsotola


1 ответ


1

Вы могли бы использовать (потрясающую) библиотеку ArduinoJson, но, скорее всего, это перебор для этого приложения. Я нашел более полезным разбор JSON, чем его построение.

Вы можете просто распечатать в буфер и СООБЩЕНИЕ, которое:

char payload[MAX_PAYLOAD];
sprintf(payload, "{\"uid1\":%d,\"uid2\":%d,\"uid3\":%d,\"uid4\":%d}", UID[0], UID[1], UID[2], UID[3]);

http.POST(payload);

Вы бы #определили MAX_PAYLOAD со значением, которое будет достаточным для хранения всей информации.

Обратите внимание, что sprintf позволяет использовать любые параметры форматирования (например, шестнадцатеричный и т. Д.).

Если вы хотите отправить его в виде массива:

sprintf(payload, "{\"uid\":[%d,%d,%d,%d]}", UID[0], UID[1], UID[2], UID[3]);
,