Подключение к 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, но, должно быть, происходит что-то еще, чего я не понимаю. Любая помощь будет очень признательна!

, 👍-2

Обсуждение

Я передаю это в нашу службу поддержки, чтобы взглянуть. Пожалуйста, пришлите мне электронное письмо, чтобы мы могли связаться по адресу [email protected]. Спасибо и удачи! Альберт, @Albert Santalo

Спасибо, Альберт! Я свяжусь с вами по электронной почте, @jobrien9


1 ответ


-1

К сожалению, у нашей команды 8base недостаточно знаний/контента по C++. Тем не менее, я бы проверил следующее.

  1. Вот высокоуровневый HTTP-клиент для Arduino, созданный по образцу API-интерфейса браузера: https://github.com. /instanceofMA/arduino-fetch

  2. Вы написали строку 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