質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

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

Q&A

解決済

1回答

857閲覧

2種類のCA証明書を設定する方法について

raspypy

総合スコア247

Arduino

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

0グッド

0クリップ

投稿2019/03/20 04:56

編集2019/03/20 11:34

##やりたいこと
IFTTTとCloud MQTTの両方に対応したプログラムを作成しています。

①IFTTTの動作は、ボタンが押されると、LINEにメッセージを送信
②Cloud MQTTの動作は、LINEからメッセージを受信すると、LEDを点灯させる。

というように、Arduino(ESP32)とLINEとの間で双方向通信を行いたいと考えています。

##今できていること
①と②をそれぞれ単独で動作させることはできています。

##今つまづいている所
①と②を統合したプログラムを掲載します。
このプログラムでコンパイルしたところ、次のエラーが発生しました。

エラー
'class PubSubClient' has no member named 'setCACert'

##教えてほしい内容
①のプログラムを単独で動作させるときは、

html

1WiFiClientSecure client;

②のプログラムを単体で動作させるときは、

html

1WiFiClientSecure wifiClient; 2PubSubClient client(wifiClient);

このように設定していますが、①と②の両方を統合する場合は、どのように記述すれば良いのかが分かりません。
CA証明書のコードは、"certificate.h"内に①と②それぞれの証明書を記述しています。

##プログラムコード

html

1#include <WiFiClientSecure.h> 2#include <PubSubClient.h> 3#include "config.h" 4#include "certificate.h" 5#include "ifttt_config.h" 6 7// hostname of Maker of IFTTT Platform 8const char* HOSTNAME = "maker.ifttt.com"; 9 10WiFiClientSecure wifiClient; 11PubSubClient client(wifiClient); 12 13void setup() { 14 Serial.begin(115200); 15 delay(100); 16 17 Serial.println(); 18 WiFi.mode(WIFI_STA); 19 client.setCallback(callback); 20 client.setServer(host, port); 21} 22 23void loop() { 24 //Wifi接続 25 if (WiFi.status() != WL_CONNECTED) { 26 Serial.print("connecting to "); 27 Serial.print(ssid); 28 Serial.println("..."); 29 WiFi.begin(ssid, password); 30 31 if (WiFi.waitForConnectResult() != WL_CONNECTED) { 32 //アクセスポイントへの接続に失敗したら5秒間待ってリトライ 33 Serial.println("failed to connect"); 34 delay(5000); 35 return; 36 } else { 37 Serial.print("WiFi connected: "); 38 Serial.println(WiFi.localIP()); 39 } 40 wifiClient.setCACert(ca_cert); 41 } 42 43 //IFTTT Event Trig 44 if(digitalRead(GPIO_NUM_34) == 0){ 45 trigger_event1(); 46 } 47 48 49 //CloudMQTTに接続 50 if (!client.connected()) { 51 client.connect(clientID, CloudMQTT_user, CloudMQTT_pass); 52 53 if (client.connected()) { 54 Serial.println("MQTT connected"); 55 56 // トピック名を指定してsubscribe 57 client.subscribe(topic); 58 } else { 59 Serial.print("MQTT connection failed: "); 60 Serial.println(client.state()); 61 delay(5000); 62 } 63 } else { 64 // 既にサーバに接続されていれば通常処理を行う 65 client.loop(); 66 } 67} 68 69 70//Cloud MQTT 受信メッセージをシリアルにプリント 71void callback(char* topic, byte* payload, unsigned int length) { 72 73 Serial.print("Message arrived in topic: "); 74 Serial.println(topic); 75 76 Serial.print("Message:"); 77 String message; 78 79 for (int i = 0; i < length; i++) { 80 message += (char)payload[i]; 81 } 82 Serial.println(message); 83 if (message == "On") { 84 digitalWrite(LED,HIGH); 85 delay(100); 86 digitalWrite(LED,LOW); 87 delay(100); 88 } 89 Serial.println(); 90 Serial.println("-----------------------"); 91} 92 93 94//IFTTT Event 95void trigger_event1() { 96 client.setCACert(ROOT_CA_CERT); 97 98 Serial.println("\nStarting connection to server..."); 99 if (!client.connect(HOSTNAME, 443)) { 100 Serial.println("Server connection failed!"); 101 } else { 102 Serial.println("Connected to server!"); 103 104 // Make a HTTP request: 105 client.print("GET "); 106 client.print("/trigger/"); 107 client.print(EVENT1); 108 client.print("/with/key/"); 109 client.print(KEY); 110 client.println(" HTTP/1.0"); 111 client.print("Host: "); 112 client.println(HOSTNAME); 113 client.println("Connection: close"); 114 client.println(); 115 116 while (client.connected()) { 117 String line = client.readStringUntil('\n'); 118 if (line == "\r") { 119 Serial.println("headers received"); 120 break; 121 } 122 } 123 while (client.available()) { 124 char c = client.read(); 125 Serial.write(c); 126 } 127 Serial.println(); 128 129 client.stop(); 130 } 131}

①のコードは、

html

1#include <WiFiClientSecure.h> 2#include "esp_deep_sleep.h" 3#include "wifi_config.h" 4#include "ifttt_config.h" 5 6// hostname of Maker of IFTTT Platform 7const char* HOSTNAME = "maker.ifttt.com"; 8 9WiFiClientSecure client; 10 11void setup() { 12 Serial.begin(115200); 13 delay(100); 14 15} 16 17void loop() { 18 //IFTTT Event Trig 19 if(digitalRead(GPIO_NUM_34) == 0){ 20 trigger_event1(); 21 } 22 } 23 24// connect to the WiFi network of home 25bool connect_to_wifi() { 26 Serial.print("Attempting to connect to SSID: "); 27 Serial.println(ssid); 28 29 WiFi.begin(ssid, password); 30 // attempt to connect to Wifi network: 31 int retry_count = 0; 32 while (WiFi.status() != WL_CONNECTED) { 33 Serial.print("."); 34 // wait 1 second for re-trying 35 delay(1000); 36 retry_count++; 37 if (retry_count > 30) { 38 Serial.println("WiFi connection failed!"); 39 return false; 40 } 41 } 42 43 Serial.print("Connected to "); 44 Serial.println(ssid); 45 Serial.print("IP address: "); 46 Serial.println(WiFi.localIP()); 47 48 return true; 49} 50 51// trigger an event of Maker 52void trigger_event1() { 53 client.setCACert(ROOT_CA_CERT); 54 55 Serial.println("\nStarting connection to server..."); 56 if (!client.connect(HOSTNAME, 443)) { 57 Serial.println("Server connection failed!"); 58 } else { 59 Serial.println("Connected to server!"); 60 61 // Make a HTTP request: 62 client.print("GET "); 63 client.print("/trigger/"); 64 client.print(EVENT1); 65 client.print("/with/key/"); 66 client.print(KEY); 67 client.println(" HTTP/1.0"); 68 client.print("Host: "); 69 client.println(HOSTNAME); 70 client.println("Connection: close"); 71 client.println(); 72 73 while (client.connected()) { 74 String line = client.readStringUntil('\n'); 75 if (line == "\r") { 76 Serial.println("headers received"); 77 break; 78 } 79 } 80 while (client.available()) { 81 char c = client.read(); 82 Serial.write(c); 83 } 84 Serial.println(); 85 86 client.stop(); 87 } 88} 89 90

②のコードは、

html

1#include <WiFiClientSecure.h> 2#include <PubSubClient.h> 3#include <IRremote.h> 4#include "config.h" 5#include "certificate.h" 6 7 8WiFiClientSecure wifiClient; 9PubSubClient client(wifiClient); 10 11void setup() { 12 Serial.begin(115200); 13 delay(100); 14 Serial.println(); 15 WiFi.mode(WIFI_STA); 16 client.setCallback(callback); 17 client.setServer(host, port); 18} 19 20void loop() { 21 //Wifi接続 22 if (WiFi.status() != WL_CONNECTED) { 23 Serial.print("connecting to "); 24 Serial.print(ssid); 25 Serial.println("..."); 26 WiFi.begin(ssid, password); 27 28 if (WiFi.waitForConnectResult() != WL_CONNECTED) { 29 //アクセスポイントへの接続に失敗したら5秒間待ってリトライ 30 Serial.println("failed to connect"); 31 delay(5000); 32 return; 33 } else { 34 Serial.print("WiFi connected: "); 35 Serial.println(WiFi.localIP()); 36 } 37 38 wifiClient.setCACert(ca_cert); 39 } 40 41 //CloudMQTTに接続 42 if (!client.connected()) { 43 client.connect(clientID, CloudMQTT_user, CloudMQTT_pass); 44 45 if (client.connected()) { 46 Serial.println("MQTT connected"); 47 48 // トピック名を指定してsubscribe 49 client.subscribe(topic); 50 } else { 51 Serial.print("MQTT connection failed: "); 52 Serial.println(client.state()); 53 delay(5000); 54 } 55 } else { 56 // 既にサーバに接続されていれば通常処理を行う 57 client.loop(); 58 } 59} 60 61//Cloud MQTT 受信メッセージをシリアルにプリント 62void callback(char* topic, byte* payload, unsigned int length) { 63 64 Serial.print("Message arrived in topic: "); 65 Serial.println(topic); 66 67 Serial.print("Message:"); 68 String message; 69 70 for (int i = 0; i < length; i++) { 71 message += (char)payload[i]; 72 } 73 Serial.println(message); 74 if (message == "On") { 75 digitalWrite(LED,HIGH); 76 delay(100); 77 digitalWrite(LED,LOW); 78 delay(100); 79 } 80 Serial.println(); 81 Serial.println("-----------------------"); 82}

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

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

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

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

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

ikedas

2019/03/20 11:07

①と②別々のときのそれぞれのプログラムも掲載してください。
ikedas

2019/03/20 11:35

質問文に追記していただけませんか。この欄は隠れてしまうので他の人が気づかないかもしれません。
guest

回答1

0

ベストアンサー

この辺のプログラムは経験がないので回答と言うにはちょっと気が引けるところではあるのですが、修正追記依頼でもなし...

クラスの内容はともかく、コードを字面だけで追ってみると、

①では

C++

1WiFiClientSecure client; 2//略 3void trigger_event1() { 4 client.setCACert(ROOT_CA_CERT); //このclientはWiFiClientSecureのインスタンス 5 6 Serial.println("\nStarting connection to server..."); 7 if (!client.connect(HOSTNAME, 443)) { 8//以下略

合体版では

C++

1WiFiClientSecure wifiClient; 2PubSubClient client(wifiClient); 3//略 4void trigger_event1() { 5 client.setCACert(ROOT_CA_CERT); //このclientはPubSubClientのインスタンス 6 7 Serial.println("\nStarting connection to server..."); 8 if (!client.connect(HOSTNAME, 443)) { 9//以下略

となっています。この違いは意図してのことですか? PubSubClientがWiFiClientSecureを継承してるならこれでもいい...ということもありそうですが、一応PubSubClientがMQTT用のクラスらしいので、それにIFTTTの接続を任せるのはどうなんでしょう。

ついでに、WiFiClientSecureも同じインスタンスをMQTT用とIFTTT用と使い回しは大丈夫なのでしょうか。それぞれにインスタンスを生成する必要とかはないのですか?

投稿2019/03/21 03:12

thkana

総合スコア7639

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

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

raspypy

2019/03/26 00:33

回答ありがとうございます。 それぞれにインスタンスを生成する場合、ハードウェアも少し変える必要があるのでしょうか。 私が考えている方法としては、ハードウェアで切替スイッチを用意して、 スイッチの状態に応じて、IFTTT(送信)とMQTT(受信)を切り替えるというアイデアしか思いつかないのですが、他に方法がありますでしょうか。 それぞれにインスタンスを生成する方法について、どのように記述すれば良いのかが分からないため、教えていただけると助かります。
thkana

2019/03/27 14:31

なんで「ハードウェアを変える」が出てくるのかよくわからないけど。 WiFiClientSecure iftttClient; とかを宣言して、 trigger_event1()の中のclientを全部iftttClientに変える、あたりでコンパイルは通るんじゃないかな。 てもとであなたのプログラムをコンパイルしてみようとしたけどいろいろ足りなくてダメだから、あまり手伝えません。
raspypy

2019/04/09 04:59

返信がだいぶ遅れてしまい、すみません。 WiFiClientSecure iftttClient; を用意して、trigger_event1()の中のclientを全部iftttClientに変えたところ、コンパイルは通りました。 が、なぜ通るようになったのかが理解できておりません。 次の理解であっていますでしょうか。 [元々、エラーになった原因] IFTTTのEvent内で"client"クラスを使用していたが、 これは、 PubSubClient client(wifiClient); で宣言しているとおり、 PubSubClientクラス(MQTT接続)を使用しているので、IFTTTをMQTT接続で行おうとしていた。 [変更後] WiFiClientSecure iftttClient; と宣言し、IFTTTのEvent内の"client"を"iftttClient"に変更することで、 IFTTTは、WiFiClientSecure接続となるため、解決できる。
thkana

2019/04/09 14:50

接続がどうのこうのじゃなくて、単にC++の文法の問題でしょう。 単体のプログラムでは WiFiClientSecure client; のclientに対して client.setCACert(ROOT_CA_CERT); を呼んでいたのを、 あなたが合体させたプログラムでは PubSubClient client(wifiClient); に対して client.setCACert(ROOT_CA_CERT); と呼ぼうとしているのですからおかしなことになっているわけで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問