BOCCO API와 ESP32를 사용하여 BOCCO에서 메시지를 가져옵니다.

소개



유카이 공학에서 개발한 가족을 연결하는 커뮤니케이션 로봇의 BOCCO 입니다.
BOCCO에게 말을 걸면 음성 메시지로 전송되며 스마트폰에서 텍스트나 음성으로 메시지를 보낼 수 있습니다.
아이, 부모, 조부모 등의 스마트폰의 조작을 할 수 없는 가족과도 간단하게 커뮤니케이션을 취할 수 있는, 그런 커뮤케이션 로봇입니다.



BOCCO는 개발자를 위해 BOCCO에 자유로운 말을 말하거나 데이터를 얻을 수 있도록 API를 공개하고 있습니다. BOCCO API 개요 | BOCCO API Documentation

조금 전에 ESP32에서 BOCCO를 말할 수 있도록 ESP8266용 API를 개선해 보았습니다.
BOCCO API를 사용해 보자! -ESP32와 정형문 버튼-

그래서 이번에는 BOCCO와 그 API를 사용하여 보낸 메시지 BOCCO에서 ESP32로 얻을 수 있도록 해 보았습니다.

※거동을 잘 모르는 곳이 있으므로, 이런 것이 좋을 것 같다! 라고 하는 곳은 수시로 개량해 주세요...!

BOCCO API를 ESP32로 사용하기 위한 라이브러리 개선



프로그램은 여기에 올려져 있습니다.
프로그램은 bocco_api.cpp와 bocco_api.h에 다음을 추가했습니다.
해설은 아래의 코드의 코멘트 아웃에 간단하게 추가해 갑니다.

bocco_api.cpp

/** 最新のメッセージを取得する **/
// 263 ~ 282行目
String BoccoAPI::getMessageText(){
  //GETパラメータを作る
  const String data = "access_token="+this->accessToken;
  const String url = BoccoAPI::API_ROOMS+"/"+this->firstRoomId+BoccoAPI::API_ROOMS_MESSAGES;

  //JSONを取得
  //https://api.bocco.me/alpha/rooms/{room_id}/messages?access_token={access_token}のURLでGETリクエストを送っている
  String json = this->get(url,data,BoccoAPI::RETRY_CNT);

  //30件のメッセージに関する情報がjsonでかえってくるので、大きめの容量を指定した。
  const size_t capacity = 50000;
  DynamicJsonDocument doc(capacity);
  deserializeJson(doc, json);
  //0番目の要素が一番古いメッセージ
  JsonObject root_29 = doc[0];
  // 30番目の要素が一番新しいメッセージ(0からのカウントなので、下記の番号は29となっている)
 // JsonObject root_29 = doc[29];
  // JSON形式のレスポンスでtextという項目にメッセージが格納されている
  const char* root_29_text = root_29["text"];
  //抽出したtextをString型に変換にして返り値に指定する
  String root_29_text_str = root_29_text;

  return root_29_text_str;
}


bocco_api.h
// 19 ~ 26行目
public:
  bool createSessions();
  void setAccessToken(const char* accessToken);
  bool getFirstRoom();
  // bool getSecondRoom();
  bool postMessageText(const char* text);
  // 追加
  String getMessageText();


샘플 코드



잡한 샘플 코드입니다만 아래에 나타냅니다.
API를 사용하는데 필요한 정보는 각자 준비해 봅시다(xxxxxxxxx라고 쓰여진 부분에 기재한다).
ESP32 dev module에 있는 버튼을 누르면 BOCCO로 보낸 메시지를 콘솔 화면에 표시합니다.

#include <WiFiManager.h>
#include <WiFi.h>

#include "config.h"
#include "bocco_api.h"

//BOCCO API ライブラリ
//BOCCO アカウント情報
#define BOCCO_EMAIL     "xxxxxxxxx"
#define BOCCO_PASSWORD  "xxxxxxxxx"
#define BOCCO_API_KEY   "xxxxxxxxx"
//初期設定の為のアクセスポイント名
#define AP_NAME "test"

BoccoAPI boccoAPI(BOCCO_EMAIL, BOCCO_PASSWORD, BOCCO_API_KEY);


//プッシュスイッチ
#define SW 0
#define PIN 2
#define PIN2 4

//変数初期化
int valueSW = HIGH;
int valueSW2 = 1;
int valueSW3 = 1;

//ボタン割り込み
void clickSw(){
  Serial.println("clickSw");
  valueSW = digitalRead(SW);
  Serial.println(valueSW);
}

void greetingSw(){
  Serial.println("Sw");
  //valueSW2 = digitalRead(PIN);
  Serial.println(digitalRead(PIN));
  valueSW2 = digitalRead(PIN);
}

void greetingSw2(){
  Serial.println("Sw");
  //valueSW2 = digitalRead(PIN);
  Serial.println(digitalRead(PIN2));
  valueSW3 = digitalRead(PIN2);
}

void setup() {
  Serial.begin(115200);
  Serial.println();

  WiFiManager wifiManager;
  wifiManager.setTimeout(180);
  if(!wifiManager.autoConnect(AP_NAME)) {
    Serial.println("timeout");
    delay(3000);
    //初期設定が成功シない場合 reset して初期設定をリトライする
    ESP.restart();
    delay(5000);
    return;
  }
  //ルーターとの接続に成功
  Serial.println("connected...");
  delay(1000);

  //BOCCO アクセストークンを取得する
//  if(!boccoAPI.createSessions() ){
//    Serial.println("BOCCO アクセストークン取得に失敗");
//    return;
//  }

  //アクセストークンを設定
  boccoAPI.setAccessToken("xxxxxxxxxx");

  //BOCCO 1番目のルームを取得
  if(!boccoAPI.getFirstRoom()){
      Serial.println("BOCCO ルーム取得に失敗");
      return;
  }

  //boccoAPI.postMessageText("テストテスト");

  //ボタン割り込み設定
  pinMode(SW, INPUT_PULLUP);
  attachInterrupt(SW, clickSw, CHANGE );

}



void loop() {
  if(digitalRead(SW) == LOW){
    Serial.println("test");
    Serial.println(boccoAPI.getMessageText());
  }
  delay(500);
}


그러면 이렇게 작동하는지 확인할 수 있습니다.
방 센서가 밝아졌다는 의미의 「Brighter」가 바뀌어 왔습니다.


결론



BOCCO API를 사용하기 위해 ESP32용 라이브러리를 개선하여 BOCCO에서 메시지를 검색할 수 있음을 확인했습니다.

잘 모르는 것이 하나 있습니다.
확실히 메시지를 얻을 수 없다는 것입니다.
ESP32 버튼을 누르면 빈 메시지가 바뀌는 경우가있었습니다.
특히 최신 메시지에 가까울수록, JSON의 요소 번호가 커질수록, 예를 들어 bocco_api.cpp의 doc[29]일 때 메시지를 얻을 수 있을 때와 할 수 없는 때가 있습니다. doc[0]이나 doc[1]과 같이 요소 번호가 어릴 때 취득이 잘 되기 쉬운 인상입니다.

API로 오히려 오는 JSON 데이터가 너무 커서 일까요?

그런 곳을 좀 더 개량할 필요가 있습니다.

작은 메모



ArduinoJson의 라이브러리를 사용할 때, ArduinoJson Assistant

좋은 웹페이지 즐겨찾기