🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

1835閲覧

M5Stack(esp32)でセンシングしたデータをkintoneにアップロードしたい

nullsan

総合スコア20

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/12/31 11:31

m5stackをwifiに接続し、kintoneにデータを送信したいのですが、どのようなコードを書けばいいのか悩んでいます。

今kintoneのリファレンスを参照し、以下のようにコードを書きました。

///初期化/// HTTPClient http; int sigV =0; int IMU.ax =0; int IMU.ay =0; int IMU.az =0; int STAS =0; void loop(){ sprintf(json,"{"app":"8","record":{"ADC":{"value":"sigV"},"AX":{"value":"IMU.ax"},"AY":{"value":"IMU.ay"},"AZ":{"value":"IMU.az"},"S":{"value":"STAS"}}}"); int httpResponseCode = 0; http.begin("https://サブドメイン名.cybozu.com/k/v1/record.json"); http.addHeader(F("X-Cybozu-API-Token"), F("APIトークン")); http.addHeader(F("Content-type"), F("application/json")); httpResponseCode = http.POST(json); M5.Lcd.printf("httpResponseCode = %d \n", httpResponseCode); M5.Lcd.println(http.getString()); delay(1000);

■kintoneリファレンス
https://developer.cybozu.io/hc/ja/articles/202166160#step2
■コードの参考にしたサイト
https://qiita.com/yukataoka/items/16cb7208081db9c0eaf7

コンパイル時に以下のエラーが出ます。
exit status 1
unable to find string literal operator 'operator""app' with 'const char [3]', 'unsigned int' arguments

いろいろ調べて指定されたURLにjson形式でデータをポスト(送信という意味でしょうか?)すればいいだけのようですが、
うまくいきません。
また、参考にさせていただいたサイト様のコードではsprintfの構文の中にたくさん「\」が入っていましたがこちらの意味も調べましたが理解できませんでした。

どなたかお詳しい方、コードの記述について教えてくださると幸いです
よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

kintoneのアカウントを持っていたりはしないので確認は出来ませんが、
char json[] ="{\"app\":\"8\",\"record\":{\"ADC\":{\"value\":\"sigV\"},\"AX\":{\"value\":\"IMU.ax\"},\"AY\":{\"value\":\"IMU.ay\"},\"AZ\":{\"value\":\"IMU.az\"},\"S\":{\"value\":\"STAS\"}}}";
で得られる文字列を改行,インデントを入れて整形してみると

json

1{ 2 "app":"8", 3 "record": 4 { 5 "ADC":{ 6 "value":"sigV" 7 }, 8 "AX":{ 9 "value":"IMU.ax" 10 }, 11 "AY":{ 12 "value":"IMU.ay" 13 }, 14 "AZ":{ 15 "value":"IMU.az" 16 }, 17 "S":{ 18 "value":"STAS" 19 } 20 } 21}

これと、質問にあるkintoneリファレンスの「リクエストボディの構造」とを比べると随分違うような気が私はしますけれど、大丈夫なんでしょうか。
もちろん、sigVとかIMU.axとかってのは、「そのままの文字列」ですよね。


Arduino IDEを使用して開発しようという以上、C/C++のルールをベースにしたArduino言語を使用します。これについての基礎的な知識を得ることを怠っていては、どんなに悩んでも作りたいものを作ることは出来ないでしょう。C/C++の入門書に一通り目を通すくらいのことは避けて通れないはずです。コンピュータは融通が効かないものなので、記号の一つにも意味があり、間違っていれば全く動かなかったり、期待しない動作をします。よくわからずに目茶苦茶やって動く期待はほとんど持てません。そのつもりでやって下さい。

とりあえず、関わった部分については一応解となるであろうものを書いておきますが、動くかどうか知りませんよ。先に書いたように私は確認の手段を持たないので。

Arduino

1const int appId = 8; //アプリケーションID 2struct { 3 int ax, ay, az; 4}IMU={201,202,203};//これはどこか別に定義・宣言されている? 5 6int sigV = 100; 7int STAS = 300; 8 9int loop() { 10 char jsonFormat[] = 11 "{" 12 "\"app\": %d," // apprication ID 13 "\"record\": [" 14 "{" 15 "\"ADC\":{" 16 "\"value\": %d" // sigV 17 "}," 18 "\"AX\":{" 19 "\"value\": %d" // IMU.ax 20 "}," 21 "\"AY\":{" 22 "\"value\": %d" // IMU.ay 23 "}," 24 "\"AZ\":{" 25 "\"value\": %d" // IMU.az 26 "}," 27 "\"S\":{" 28 "\"value\": %d" // STAS 29 "}" 30 "}" 31 "]" 32 "}"; 33 char json[sizeof jsonFormat + (8 * 6)]; 34 sprintf(json, jsonFormat, appId, sigV, IMU.ax, IMU.ay, IMU.az, STAS); 35 int httpResponseCode = 0; 36 http.begin("https://サブドメイン名.cybozu.com/k/v1/record.json"); 37 http.addHeader(F("X-Cybozu-API-Token"), F("APIトークン")); 38 http.addHeader(F("Content-type"), F("application/json")); 39 40 httpResponseCode = http.POST(json); 41 M5.Lcd.printf("httpResponseCode = %d \n", httpResponseCode); 42 M5.Lcd.println(http.getString()); 43 44 delay(1000); 45}

とりあえずこれで生成したjson文字列

JSON

1{"app": 8,"record": [{"ADC":{"value": 100},"AX":{"value": 201},"AY":{"value": 202},"AZ":{"value": 203},"S":{"value": 300}}]}

JSONのチェックサイトに貼り付けてみて形式的にはOKとのこと、そこまでは確認しました。

投稿2019/12/31 13:39

編集2020/01/02 08:20
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nullsan

2020/01/02 06:50

>もちろん、sigVとかIMU.axとかってのは、「そのままの文字列」ですよね。 sigVやIMU.axというのはセンサーデータなどの変数です。 ""はやはり不要でしょうか?
thkana

2020/01/02 08:21

不要とかそういう(それの有無が問題になる)レベルではないです。
nullsan

2020/01/02 09:06

もっと基礎から勉強します...。 取り急ぎご教示いただいたコードでkintoneにレコードが追加されることが確認できました! ありがとうございます。 数値が空の状態(sigVが100となっているのでレコードに100と追加されるはずが空欄になる)なのですが、これは何が原因なのでしょうか? 聞いてばかりですみません。
thkana

2020/01/02 09:21

今度は、kintone側が要求しているデータ内容と送ったデータ内容が正しく対応しているかを確認する話になるかと思います。 質問にはなんの情報もないので、私にはなんとも。 レコードのデータ形式が文字列を要求しているところに数値を送っている、とかそんなことを想像はしますが。
thkana

2020/01/02 09:28

あぁ、 > レコードのデータ形式が文字列を要求しているところに数値を送っている、とかそんなことを想像はしますが。 の路線で、 https://developer.cybozu.io/hc/ja/articles/202166160#step2 をよく見たらデータ形式に間違いがありました。私の間違いではありますが...少しは自分の頭と目を使って探してみて下さい。
nullsan

2020/01/04 06:00

ご指導ありがとうございます。 ご回答いただいてからいろいろ調べて勉強しながら以下のコードを記述したところ、正常にkintoneにアップロードできました! const int appId = 8; //アプリケーションID float IMUax = 1.23456; float IMUay = 2.34567; float IMUaz = 3.45678; float sigV = 4.56789; int STAS = 5; char jsonFormat[] = "{\"app\":\"%d \",\"record\": {\"ADC\":{\"value\":\"%3.2f\"},\"AX\":{\"value\": \"%3.2f\"},\"AY\":{\"value\":\"%3.2f\"},\"AZ\":{\"value\":\"%3.2f\"},\"S\":{\"value\":\"%d\"}}}"; char json[sizeof jsonFormat + (8 * 6)]; sprintf(json, jsonFormat, appId, sigV, IMUax, IMUay, IMUaz, STAS);// IMU.ay, IMU.az, STAS int httpResponseCode = 0; http.begin("https://サブドメイン名.cybozu.com/k/v1/record.json"); http.addHeader(F("X-Cybozu-API-Token"), F("APIトークン")); http.addHeader(F("Content-type"), F("application/json")); httpResponseCode = http.POST(json); M5.Lcd.printf("httpResponseCode = %d \n", httpResponseCode); M5.Lcd.println(http.getString()); delay(1000); ここまでは問題かったのでいざセンサーの生のデータをアップロードするために以下のように記述を変更しました。 const int appId = 8; //アプリケーションID float IMUax = 1.23456; float IMUay = 2.34567; float IMUaz = 3.45678; float sigV = 0; int STAS = 5; signalVal = analogRead(signalin); sigV = signalVal * 3.3 / 4095; char jsonFormat[] = "{\"app\":\"%d \",\"record\": {\"ADC\":{\"value\":\"%3.2f\"},\"AX\":{\"value\": \"%3.2f\"},\"AY\":{\"value\":\"%3.2f\"},\"AZ\":{\"value\":\"%3.2f\"},\"S\":{\"value\":\"%d\"}}}"; char json[sizeof jsonFormat + (8 * 6)]; sprintf(json, jsonFormat, appId, sigV, IMUax, IMUay, IMUaz, STAS);// IMU.ay, IMU.az, STAS int httpResponseCode = 0; http.begin("https://サブドメイン名.cybozu.com/k/v1/record.json"); http.addHeader(F("X-Cybozu-API-Token"), F("APIトークン")); http.addHeader(F("Content-type"), F("application/json")); httpResponseCode = http.POST(json); M5.Lcd.printf("httpResponseCode = %d \n", httpResponseCode); M5.Lcd.println(http.getString()); delay(1000); sigVにはアナログ入力した電圧を検知するようにしたのですが、そこを変更しただけですがレスポンスコードが-1になってしまいアップロードできなくなりました。 jsonに変数を入れる際になにか記述の変更が必要なのか調べてみましたが、JSの話しかでてこなくて悩んでおります。 変数を扱えるようにするにはどの点を改善したほうがよろしいでしょうか? 丸二日使って調べたりトライアンドエラーしましたがまったく進歩がなく恐縮ですが質問させていただいた次第です。 お手すきの際にご教示いただけると幸いです
nullsan

2020/01/04 06:04

再度コンパイルしたところ正常動作しました...。 何が原因かわからないのですが...
nullsan

2020/01/04 06:06

たびたび恐れ入ります。 変数の件は解決したのですが、M5stackを起動するとこのコードを記述したプログラムを実行したときだけ20秒程度で勝手に再起動してしまいます。 原因が思い当たらないのですが、なにが考えられますでしょうか? よくわからいのですが、char型がオーバーフロー?などしているのでしょうか... ご回答いただけると幸いです
thkana

2020/01/04 08:59

そのへんは真面目に使ったことがないので知りませんが、 httpをbegin()したあと使い終わったあとend()しないでまたbegin()するのがよくない、という可能性はありそうです。
thkana

2020/01/04 09:01

せっかくLCD画面があるのですから、送信するJSONメッセージも表示させておいたらいかがですか?
nullsan

2020/01/07 22:07

>httpをbegin()したあと使い終わったあとend()しないでまたbegin()するのがよくない なるほどですね。いったんendするフローを組み込んでみます! >せっかくLCD画面があるのですから、送信するJSONメッセージも表示させておいたらいかがですか? デバック用に組み込んでみます!!
guest

0

sprintfの文が意味不明です
なにをしてる「つもり」なんでしょうか

投稿2019/12/31 11:48

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nullsan

2019/12/31 12:25

すみません、勘違いしていたので以下のように書き換えました! char json[] ="{\"app\":\"8\",\"record\":{\"ADC\":{\"value\":\"sigV\"},\"AX\":{\"value\":\"IMU.ax\"},\"AY\":{\"value\":\"IMU.ay\"},\"AZ\":{\"value\":\"IMU.az\"},\"S\":{\"value\":\"STAS\"}}}"; これでコンパイルは通ったのですが、データは上がってこない状態です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問