Arduino Uno с Adafruit CC3000.
Я использую Arduino Uno с Adafruit CC3000 wifi shield для подключения к интернету и получения данных для Arduino. Все работает отлично, но я не могу понять, как использовать библиотеку HttpClient. Код такой:
#include <Adafruit_CC3000.h>
#include <SPI.h>
#include "utility/debug.h"
#include "utility/socket.h"
#include <HttpClient.h>
#define ADAFRUIT_CC3000_IRQ 3
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,SPI_CLOCK_DIVIDER);
#define WLAN_SSID "ssid"
#define WLAN_PASS "pwd"
#define WLAN_SECURITY WLAN_SEC_WPA2
void setConnection(){
Serial.println("Initializing...");
if (!cc3000.begin())
{
Serial.println("Couldn't begin()! Check your wiring?");
while(1);
}
Serial.print("Attempting to connect to ");
Serial.println(WLAN_SSID);
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
Serial.println("Failed!");
while(1);
}
Serial.println("Connected!");
Serial.println(F("Request DHCP"));
while (!cc3000.checkDHCP())
{
delay(100);
}
Serial.println(F("DHCP success!!"));
}
void dweet(){
int ctr=0;
char buff[100];
int x=0;
const char* host = "https://dweet.io/get/latest/dweet/for/dunebot";
Serial.println(F("Initializing dweet client ..."));
HttpClient client;
client.get(host);
Serial.println(F("Client Connected !"));
while (client.available()) {
char c = client.read();
Serial.write(c);
delay(100);
}
void setup(){
Serial.begin(115200);
while(!Serial);
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
setConnection();
}
void loop(){
dweet();
}
Если бы все работало нормально, то я бы получил строку json, которая выглядит так:
{"this":"succeeded","by":"getting","the":"dweets","with":[{"thing":"dunebot","created":"2018-05-12T13:27:56.106Z","content":{"0001":""}}]}
Когда я запускаю код, Arduino подключается к сети Wi-Fi, но после этого, когда я наблюдаю за последовательным монитором, все, что я получаю, — это мусорные значения.
Мне нужен способ прочитать ключ 0001 из строки json. Любая помощь будет оценена по достоинству. Спасибо.
@Ashish Kafle, 👍1
1 ответ
Лучший ответ:
Объект HttpClient
должен быть создан с помощью объекта Client
, который будет обрабатывать базовое соединение. Источник:
Требуется сетевое оборудование и библиотека, которая предоставляет экземпляр клиента, специфичный для транспорта, например:
См. следующий код:
- https://github.com/arduino-libraries/ArduinoHttpClient/blob/master/examples/DweetGet/DweetGet.ino
- https://github.com/adafruit/Adafruit_CC3000_Library/blob/master/Adafruit_CC3000.h#L86
- https://github.com/arduino-libraries/ArduinoHttpClient/blob/master/src/HttpClient.h#L51
В приведенном выше примере это сделано так
WiFiClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, port);
Это означает, что для вашего кода вам, возможно, захочется извлечь client
как глобальный объект и создать его экземпляр следующим образом:
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,SPI_CLOCK_DIVIDER);
/* Create new Adafruit_CC3000_Client object */
Adafruit_CC3000_Client cc3000_client;
/* Feed this into the client */
HttpClient client (cc3000_client, "dweet.io", 80);
Вы также должны использовать пример кода, чтобы увидеть, как вывести ответ после выполнения client.get()
:
// прочитать код статуса и тело ответа
statusCode = client.responseStatusCode();
response = client.responseBody();
Serial.print("Status code: ");
Serial.println(statusCode);
Serial.print("Response: ");
Serial.println(response);
Пример кода в значительной степени соответствует тому, что вам нужно, вам просто нужно указать Adafruit_CC3000_Client
в качестве Client
.
Полный код:
#include <Arduino.h>
#include <Adafruit_CC3000.h>
#include <SPI.h>
#include "utility/debug.h"
#include "utility/socket.h"
#include <HttpClient.h>
#define ADAFRUIT_CC3000_IRQ 3
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,SPI_CLOCK_DIVIDER);
/* Create new Adafruit_CC3000_Client object */
Adafruit_CC3000_Client cc3000_client;
/* Feed this into the client */
HttpClient client (cc3000_client, "dweet.io", 80);
#define WLAN_SSID "ssid"
#define WLAN_PASS "pwd"
#define WLAN_SECURITY WLAN_SEC_WPA2
int statusCode = 0;
String response;
void setConnection(){
Serial.println("Initializing...");
if (!cc3000.begin())
{
Serial.println("Couldn't begin()! Check your wiring?");
while(1);
}
Serial.print("Attempting to connect to ");
Serial.println(WLAN_SSID);
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
Serial.println("Failed!");
while(1);
}
Serial.println("Connected!");
Serial.println(F("Request DHCP"));
while (!cc3000.checkDHCP())
{
delay(100);
}
Serial.println(F("DHCP success!!"));
}
void dweet(){
int ctr=0;
char buff[100];
int x=0;
const char* host = "https://dweet.io/get/latest/dweet/for/dunebot";
Serial.println(F("Initializing dweet client ..."));
client.get(host);
Serial.println(F("Client Connected !"));
// прочитать код состояния и тело ответа
statusCode = client.responseStatusCode();
response = client.responseBody();
Serial.print("Status code: ");
Serial.println(statusCode);
Serial.print("Response: ");
Serial.println(response);
/*
Typical response is:
{"this":"succeeded",
"by":"getting",
"the":"dweets",
"with":[{"thing":"my-thing-name",
"created":"2016-02-16T05:10:36.589Z",
"content":{"sensorValue":456}}]}
You want "content": numberValue
*/
// теперь проанализируем ответ на предмет «контента»:
int labelStart = response.indexOf("content\":");
// находим первый { после "content":
int contentStart = response.indexOf("{", labelStart);
// находим следующее } и получаем то, что находится в скобках:
int contentEnd = response.indexOf("}", labelStart);
String content = response.substring(contentStart + 1, contentEnd);
Serial.println(content);
//Здесь не хватало скобки. Код обрезали?!
}
void setup(){
Serial.begin(115200);
while(!Serial);
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
setConnection();
}
void loop() {
dweet();
}
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Почтовый запрос HTTP в формате JSON с использованием модуля SIM900
- Почему Adafruit motor shield не крутит моторы?
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Статус выхода 1 ожидаемое первичное выражение перед ']' Arduino
- Получение всех данных моего объекта JSON из Serial.read() сразу
- Библиотека программных материалов для плат SAMD
- GSM-модуль Sim800l не может подключить данные gprs