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
Reference
이 문제에 관하여(BOCCO API와 ESP32를 사용하여 BOCCO에서 메시지를 가져옵니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/minwinmin/items/7af92128286ff993b3bd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
프로그램은 여기에 올려져 있습니다.
프로그램은 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
Reference
이 문제에 관하여(BOCCO API와 ESP32를 사용하여 BOCCO에서 메시지를 가져옵니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/minwinmin/items/7af92128286ff993b3bd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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);
}
BOCCO API를 사용하기 위해 ESP32용 라이브러리를 개선하여 BOCCO에서 메시지를 검색할 수 있음을 확인했습니다.
잘 모르는 것이 하나 있습니다.
확실히 메시지를 얻을 수 없다는 것입니다.
ESP32 버튼을 누르면 빈 메시지가 바뀌는 경우가있었습니다.
특히 최신 메시지에 가까울수록, JSON의 요소 번호가 커질수록, 예를 들어 bocco_api.cpp의 doc[29]일 때 메시지를 얻을 수 있을 때와 할 수 없는 때가 있습니다. doc[0]이나 doc[1]과 같이 요소 번호가 어릴 때 취득이 잘 되기 쉬운 인상입니다.
API로 오히려 오는 JSON 데이터가 너무 커서 일까요?
그런 곳을 좀 더 개량할 필요가 있습니다.
작은 메모
ArduinoJson의 라이브러리를 사용할 때, ArduinoJson Assistant
Reference
이 문제에 관하여(BOCCO API와 ESP32를 사용하여 BOCCO에서 메시지를 가져옵니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/minwinmin/items/7af92128286ff993b3bd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(BOCCO API와 ESP32를 사용하여 BOCCO에서 메시지를 가져옵니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/minwinmin/items/7af92128286ff993b3bd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)