Подключение к API 8Base с помощью TLS на Arduino Uno Wifi Rev2
Я пытаюсь подключить некоторые конечные точки к API 8Base с помощью Arduino Uno Wifi Rev2. Мне удалось заставить этот вызов API работать с Postman, но мне не повезло, как только я преобразовал его в свой код Arduino. В Postman нажатие кнопки "Код" показывает, что вот как выглядит успешный запрос Postman:
POST /MY_PATH HTTP/1.1
Host: api.8base.com
Authorization: Bearer MY_TOKEN
Content-Type: application/json
Content-Length: 64
{
"query": "{ listOfMachinesList { items{ machineID } } }"
}
Вот как выглядят соответствующие части моего кода Arduino после перевода этого вызова API в мой Arduino:
#include <ArduinoJson.h>
#include <SPI.h>
#include <WiFiNINA.h>
#include <Arduino.h>
WiFiSSLClient client;
char server[] = "api.8base.com";
const String requestBody = "{\"query\": \"{ listOfMachinesList { items{ machineID } } }\"}";
int status = WL_IDLE_STATUS;
void setup(){
Serial.begin(9600);
Serial.println("Starting");
status = WiFi.begin(WifiSSID, WifiPassword);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Waiting for connection");
}
Serial.println("Connected to wifi");
attemptConnect();
}
void attemptConnect() {
Serial.println("\nStarting connection to server...");
if (client.connectSSL(server, 443)) {
Serial.println("connected to server");
// Сделать HTTP-запрос:
client.print("POST /MY_PATH HTTP/1.1");
client.println("User-Agent: Arduino/2.2.0");
client.print("Authorization: Bearer ");
client.println(String(APIKey));
client.println("Content-type: application/json");
client.print("Host: ");
client.println(server);
client.println("Connection: keep-alive");
client.println();
Serial.println("finished POST request");
} else {
Serial.println("didn't connect");
}
}
Соединение, по-видимому, завершается сбоем в "client.connectSSL (server, 443)", прежде чем оно сможет попасть внутрь "if". Мой последовательный монитор показывает сообщение "не удалось подключиться". Кроме того, я добавил несколько дополнительных инструкций Serial.println внутри функции connectSSL. Похоже, что соединение завершается с ошибкой в функции с именем void ServerDrv::startClient'", в частности, здесь:
if (!SpiDrv::waitResponseCmd(START_CLIENT_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen))
{
WARN("error waitResponse");
}
Я добавил сертификаты от обоих api.8base.com и 8base.com следуя приведенным здесь инструкциям: https://support.arduino.cc/hc/en-us/articles/360016119219-How-to-add-certificates-to-Wifi-Nina-Wifi-101-Modules-
Используя этот код и приведенные выше инструкции по сертификату, я смог подключиться к google.com на порту 443, но с 8base не повезло. Я знаю, что 8base использует GraphQL для своих подключений, но мне удалось подключиться к другой конечной точке GraphQL на другом сервере, отличном от SSL. Я также проверил, использует ли 8base нестандартный порт, но, по словам Postman, он использует 443. Я немного сбит с толку, почему я не могу пройти мимо функции connectSSL. На первый взгляд кажется, что он должен вести себя так же, как и при подключении к Google, но, должно быть, происходит что-то еще, чего я не понимаю. Любая помощь будет очень признательна!
@jobrien9, 👍-2
Обсуждение1 ответ
К сожалению, у нашей команды 8base недостаточно знаний/контента по C++. Тем не менее, я бы проверил следующее.
Вот высокоуровневый HTTP-клиент для Arduino, созданный по образцу API-интерфейса браузера: https://github.com. /instanceofMA/arduino-fetch
Вы написали строку API как "api.8base.com". Попробуйте это с полной конечной точкой API; "https://api.8base.com/WORKSPACE_ID" (где находится идентификатор вашей рабочей области?)
ЛМК, если это поможет.
Спасибо за ответ! К сожалению, похоже, что эта библиотека предназначена только для модулей ESP8266 и ESP32. Я использовал Arduino Uno Wifi Rev 2. Я попытался добавить идентификатор рабочей области и получил тот же результат. Я добавлял идентификатор рабочей области в client.print("POST/MY_PATH HTTP/1.1"); линия. Похоже, это сработало с другим запросом GraphQL. Возможно, я упускаю что-то важное в настройке API 8base., @jobrien9
Хммм... да, API 8base — очень стандартная реализация API GraphQL. Насколько я знаю, мы не реализовали ничего необычного! Не могли бы вы попробовать развернуть функцию веб-перехватчика и посмотреть, сможете ли вы получить ответ на HTTPS-запрос GET?, @Sebastian Scholl
Я тоже попробовал. Я также попытался использовать новую учетную запись бесплатного уровня, чтобы убедиться, что это не просто проблема с этой учетной записью. К сожалению, я все еще не могу пройти строку client.connectSSL(server, 443). Знаете ли вы, подключались ли какие-либо другие клиенты к своим конечным точкам с помощью Arduino?, @jobrien9
К сожалению, нет. У нас нет способа определить, с каких устройств исходит входящий трафик к рабочим областям. Кроме того, даже если бы мы это сделали, мы не могли бы поделиться этим, лол! Вы первый, кто обратился по этому поводу. Поэтому, пожалуйста, держите нас в курсе процесса, и я тоже продолжу копать., @Sebastian Scholl
- Невозможно установить связь между модулем ESP-12E и мобильным устройством через маршрутизатор ESP-12E.
- Ошибка Udp.endPacket
- Подключение NodeMCU через Интернет
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Почтовый запрос HTTP в формате JSON с использованием модуля SIM900
- Как правильно отправлять данные через http с помощью sim908?
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
Я передаю это в нашу службу поддержки, чтобы взглянуть. Пожалуйста, пришлите мне электронное письмо, чтобы мы могли связаться по адресу [email protected]. Спасибо и удачи! Альберт, @Albert Santalo
Спасибо, Альберт! Я свяжусь с вами по электронной почте, @jobrien9