Разбор Bluetooth ble.write json строка на Arduino - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь разобрать строку JSON, поступающую в Arduino, с моего телефона. Я довольно новичок в C ++ и этих библиотеках, поэтому у меня возникли некоторые проблемы. Ниже приведен код, который у меня есть. Все работает, кроме той части, где я пытаюсь установить для json [] значение, поступающее с телефона. Это допустимый JSON и он возвращается на консоль, показанную ниже.

Ошибка: инициализатору не удалось определить размер 'json'

JSON Получено с телефона:

{"SSID":"Sample","PSK":"test","TOKEN":"1234","HOSTNAME":"secondarycontroller"}

Код ESP32:

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <ArduinoJson.h>

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();


      if(value.length() > 0) {

        StaticJsonDocument<800> doc;
        char json[] = value;
        DeserializationError error = deserializeJson(doc, json);
        if (error) {
          Serial.print(F("deserializeJson() failed: "));
          Serial.println(error.c_str());
          return;
        }

        Serial.println(doc["SSID"]);
        Serial.println(doc["PSK"]);
        Serial.println(doc["HOSTNAME"]);
        Serial.println(doc["TOKEN"]);


        Serial.println("*********");
        Serial.print("New value: ");
        for (int i = 0; i < value.length(); i++)
          Serial.print(value[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};

void setup() {
  Serial.begin(115200);
  pinMode(LEDpin, OUTPUT);

  Serial.println("1- Download and install an BLE scanner app in your phone");
  Serial.println("2- Scan for BLE devices in the app");
  Serial.println("3- Connect to MyESP32");
  Serial.println("4- Go to CUSTOM CHARACTERISTIC in CUSTOM SERVICE and write something");
  Serial.println("5- See the magic =)");

  BLEDevice::init("MyESP32");
  BLEServer *pServer = BLEDevice::createServer();

  BLEService *pService = pServer->createService(SERVICE_UUID);

  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setCallbacks(new MyCallbacks());

  pCharacteristic->setValue("Hello World");
  pService->start();

  BLEAdvertising *pAdvertising = pServer->getAdvertising();
  pAdvertising->start();


}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
}

1 Ответ

1 голос
/ 01 марта 2020

Согласно документации десериализации Json () , второй входной аргумент принимает char* с нулевой копией; и const char* или const std::string& с дублированием.

Прототипы в документации (только соответствующие):

// writable input => zero-copy
DeserializationError deserializeJson(JsonDocument& doc, char* input);
DeserializationError deserializeJson(JsonDocument& doc, char* input, size_t inputSize);

// read-only input => duplication
DeserializationError deserializeJson(JsonDocument& doc, const char* input);
DeserializationError deserializeJson(JsonDocument& doc, const char* input, size_t inputSize);
// ...
DeserializationError deserializeJson(JsonDocument& doc, const std::string& input);

Соблюдайте второй аргумент в приведенных выше прототипах!


Итак, следующие строки:

char json[] = value;
DeserializationError error = deserializeJson(doc, json);

будут иметь вид:

const char* json = value.c_str();
DeserializationError error = deserializeJson(doc, json);

Или непосредственно передать value следующим образом:

DeserializationError error = deserializeJson(doc, value);

Это должно решить вашу проблему.


Ошибка, которую вы получаете по поводу этой строки:

char json[] = value;
//       ^^

Размер массива char здесь отсутствует. Вы должны указать размер массива stati c в этом контексте. Кроме того, value не может быть конвертировано напрямую в этом случае.


Совет:

Используйте std :: string :: empty () в следующем случае :

if(value.length() > 0)

т.е.

if( !value.empty() )

Это более читабельно и выразительно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...