Arduino POST запрос к Laravel API - PullRequest
       6

Arduino POST запрос к Laravel API

1 голос
/ 20 января 2020

Привет, пару дней я пытаюсь начать работать над простым проектом с Arduino Uno Wifi rev2. Задача состоит в том, чтобы считывать данные RFID с карты или чипа, отправлять код RFID на веб-сервер и считывать с него ответ. Ответ будет содержать имя пользователя, которому присвоен отправленный код RFID. Я пытаюсь добиться этого с отправкой POST-запроса от Arduino к laravel API - и после этого с laravel будет отправляться ответ с именем пользователя rfid. Но я даже не начал с чтения данных RFID, потому что застрял только с отправкой POST-запроса на веб-сервер и чтением ответа с сервера.

Это код Arduino:

#include <WiFiNINA.h>
#include <ArduinoHttpClient.h>

char ssid[] = "SSID_SECRET";
char pass[] = "PASS_SECRET";
int port = 80;
const char serverAddress[] = "https://www.schedy.sk";  // server name

WiFiClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, port);

int status = WL_IDLE_STATUS;

void setup() {
  Serial.begin(9600);
   while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass); 
    delay(5000);
  }
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  IPAddress ip = WiFi.localIP();
  IPAddress gateway = WiFi.gatewayIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
}

void loop() {
  Serial.println("making POST request");
  String postData = "rfid=abcde&test=12";
  Serial.print("Post Data Length: ");
  Serial.println(postData.length());

  client.beginRequest();
  client.post("/api/rfids");
  client.sendHeader("Content-Type", "application/x-www-form-urlencoded");
  client.sendHeader("Content-Length", postData.length());
  //client.sendHeader("X-Custom-Header", "custom-header-value");
  client.beginBody();
  client.print(postData);
  client.endRequest();

  // read the status code and body of the response
  int statusCode = client.responseStatusCode();
  String response = client.responseBody();

  Serial.print("Status code: ");
  Serial.println(statusCode);
  Serial.print("Response: ");
  Serial.println(response);

  Serial.println("Wait five seconds");
  delay(5000);
}

Laravel API. Просто для целей тестирования я определил простые маршруты в /routes/api.php:

Route::middleware('auth:api')->get('/user', function (Request $request)) {
   return $request->user();
});

Route::get('/rfids', 'RfidController@index');
Route::post('/rfids', 'RfidController@store');

И в RfidController. php это:

public function index()
{
   return "get test";
}

public function store(Request $request)
{
   return response("post test")
}

У меня есть пробовал публиковать и получать запросы с https://reqbin.com/ для URL: https://www.schedy.sk/api/rfids. Все выглядит хорошо, но с Arduino я все еще получаю код состояния 400:

making POST request
Post Data Length: 17
Status code: 400
Response: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at kmbtwo.vps.websupport.sk Port 80</address>
</body></html>

Wait five seconds

Я совершенно отчаялся от этой проблемы. Я попробовал несколько библиотек и процедур, но все еще получаю код состояния 400 или -3. В журналах сервера - apache2 я не могу получить больше информации о проблеме ... только то, что есть попытка сделать POST-запрос к / api / rfids, но ответ - 400. Не знаю причину. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 26 января 2020

Проблема была с библиотекой - ArduinoHttpClient.h. С этой библиотекой невозможно сделать запрос https. Я решил это с помощью wifinina.h, с которой мне удалось получить успешный ответ с сервера.

...