こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

AWSからサブスクライブしたデータの選別方法

現在ESP-wroom-32でAWS Iot coreを使って通信をさせるように勉強中です。AWSのブローカーサーバーに対してESPからのパブリッシュを行なってAWS側のモニタでデータを受信できたことを確認し、逆にAWS側からデータを出して、ESP-wroom-32側でサブスクライブしてデータの受信もうまくいくことを確認しました。


void mqttCallback (char* topic, byte* payload, unsigned int length) {
Serial.print("Received. topic=");
Serial.println(topic);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.print("\n");
}

ESP側でサブスクライブされると、このプログラムでデータが格納されてシリアルに出力してサブスクライブできたことを確認できているのですが、



AWSのサーバ側から、このデータを送信した際に
{
"message": "Hello from AWS IoT console"
"sec": "set"
}

"sec"という文字列と"set"という文字列があるのかをif文で探し出すようなプログラムは作れますでしょうか?


そのような文字列の有無で動作を切り替えたりしたいと思っています。
どうぞ、ご教示の程よろしくお願い致します。

投稿日時 - 2019-01-30 07:59:50

QNo.9582845

すぐに回答ほしいです

質問者が選んだベストアンサー

前にNode.jsで似たようなことをやったので回答しますが、見当違いだったらすみません。
AWS側から受信したデータはJSON形式の文字列だったように思いますし、質問の内容もそうっぽいんですが、それならあとは文字列操作のプログラムになるのではないでしょうか?
そこまでできて、質問の部分がわからないと言うのが謎だったので見当違いかなとも思っているのですが、文字列操作ならその言語で調べれば割と簡単にできると思います。JSONをオブジェクトにパースできるならその方が楽かもしれません。

投稿日時 - 2019-01-30 16:25:24

お礼

回答頂きありがとうございます。

”文字列 完全一致”などでググってみたところ色々とサンプルがあり


mqttCallback関数内で、次の様な感じでプログラムを追加してみて、

" sec ": " set "
" sec ": " reset "

などの文字列を受信して検索して拾える様になりました。
もっといいやり方があるかもですが、とりあえずやりたいことができたので楽しいです。


void mqttCallback (char* topic, byte* payload, unsigned int length) {
Serial.print("Received. topic=");
Serial.println(topic);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.print("\n");


//char s1[] = "abcdefgij";
char s2[] = " sec ";
char s3[] = " set ";
char s4[] = " reset ";
char *ret;
char *ret2;

if ((ret = strstr((char *)payload, s2)) != NULL && (ret2 = strstr((char *)payload, s3)) != NULL ) {
snprintf (msg, 75, "%sは%d番目にありました.\n", s2, ret - (char *)payload);
Serial.println(msg);
snprintf (msg, 75, "%sは%d番目にありました.\n", s3, ret2 - (char *)payload);
Serial.println(msg);
Serial.print("sec set \n");
digitalWrite(5, HIGH);
Serial.println(msg);

} else if ((ret = strstr((char *)payload, s2)) != NULL && (ret2 = strstr((char *)payload, s4)) != NULL ) {
snprintf (msg, 75, "%sは%d番目にありました.\n", s2, ret - (char *)payload);
Serial.println(msg);
snprintf (msg, 75, "%sは%d番目にありました.\n", s3, ret2 - (char *)payload);
Serial.println(msg);
Serial.print("sec reset \n");
digitalWrite(5, LOW);
Serial.println(msg);


} else {
snprintf (msg, 75, "%sはありませんでした.\n", s2);
Serial.println(msg);
}



}

投稿日時 - 2019-02-01 11:57:30

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-