
sshを使用して接続します。vscodeのssh拡張機能(早稲田大学理工学部性はCプログラミングの授業の際に入れているはず)を使用するのがおそらく最も簡単です。ssh接続に必要な鍵(key)は連絡をいただければ共有します。
詳しい接続方法を知りたい場合は、「aws EC2 vscode ssh接続」などで検索していただければ出てくると思います。
サーバに接続することができたら、~/workspace/Telemeter
ディレクトリに移動します。すでにサーバが稼働しているかを確認するため、docker ps
コマンドで動いているコンテナの一覧を取得します。docker compose up
コマンドでサーバを立ち上げることができます。
よくあるバグは、以下の3つです。
- トークンが違う
- コードのバグ
- サーバの不具合
今回作成したテレメトリでは一番頻発する問題です。
強制シャットダウンなどを行ってしまうと、InfluxDBが初期化されることがあります。するとトークンも当然変更されてしまうため、Tornado、GrafanaがInfluxDBにアクセスできないといった問題が発生します。
Tornado、Grafanaのトークンを再設定することですぐに解決可能です。トークンはルートディレクトリの.envファイルに保存します。.envファイルはGitには挙がっていないため、サーバに直接接続して.envファイルを編集する必要があります。
Tornadoの部分は私が書いたコードであるため、バグがあります。
特にTornadoはESPとInfluxの間に位置しているため、ESPからサーバにデータが送れない(接続に失敗する、送ってもエラーが返ってくる)といった問題が発生した場合はTornadoのコードに問題がある可能性が高いです。コードの問題点を発見するか、私に連絡してください。
コードを動かす仮想環境(Docker)に問題が生じることがあります。私にもそれはどうしようもないので今のところ初期化するしかないと思われます。Dockerのコンテナを消したうえで、docker builder prune
コマンドを実行してキャッシュなどを削除してください。
Packet id, Entry name, component id, unit idなどは、 に保存してあります。idなどを更新する際は、Jsonファイルも更新していただけると助かります。
Download Arduino WebSockets Client library for ESP32
ESPでサーバと送受信をするプログラムを作成するにあたっては、上のライブラリをインストールしてください。
ESPからサーバに送る際のサンプルコードはという名前のディレクトリに入っています。Loop()内では、5秒毎にダミーのパケットを作成してサーバーに送る処理が記載されており、WebSocketEvent()ではESPがサーバから受信したデータの処理を行っています。こちらはArduino IDEでの実行を前提としたコードであるため、Platform IOなどを使用する際は書き直してください。
ESPと接続するWifiのssidとパスワードに変更してください。
WiFiMulti.addAP("ssid", "pass");
"ipaddress"を、サーバのIPアドレスに変更してください。IPアドレスは私に聞いてもらえれば個人的に連絡します。
webSocket.begin("ipaddress", 80, "/ws");
uint_8[]
型の配列にWCPP形式でデータを保存します。p.telemetry()
でテレメトリ用のパケットを作成します。引数は次の通りp.telemetry(packet_id, component_id, origin_unit_id, dest_unit_id)
p.append()
でエントリを追加します。
uint8_t buf[255];
memset(buf, 0, 255);
wcpp::Packet p = wcpp::Packet::empty(buf, 255);
p.telemetry('A', 0x11, 0x22, 0x33, 12345);
p.append("La").setInt(1351234);
p.append("Lo").setInt(351234);
p.append("Al").setInt(1234);
p.append("Ti").setInt(1234);
p.append("Va").setInt(1111);
p.append("Vb").setInt(1112);
p.append("Vc").setInt(1113);
p.append("Pr").setFloat32(1013.12);
p.append("Te").setInt(29);
p.append("Hu").setInt(78);
p.append("Pa").setFloat32(1013.12);
サーバにデータを送る際は、uint8_t[]
型の配列にWCPP形式でデータを保存し、第一引数に代入します。第二引数には、パケットのサイズを代入します。
webSocket.sendBIN(buf, p.size());
受信したデータはwebSocketEvent()
に渡されます。(データを受信するたびにwebSocketEvent()
が発火)
webSocket.onEvent(webSocketEvent);
WCPPはバイナリデータとして送信されるため、case WStype_BIN
で処理されます。サンプルコードでは、パケットをSerialPrintするprintPacket()
という関数を作成しました。
void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
switch(type) {
case WStype_DISCONNECTED:
Serial.printf("[WSc] Disconnected!\n");
break;
case WStype_CONNECTED:
Serial.printf("[WSc] Connected to url: %s\n", payload);
// send message to server when Connected
break;
case WStype_TEXT:
Serial.printf("[WSc] get text: %s\n", payload);
// send message to server
// webSocket.sendTXT("message here");
break;
case WStype_BIN:
printPacket(payload, length);
break;
case WStype_ERROR:
case WStype_FRAGMENT_TEXT_START:
case WStype_FRAGMENT_BIN_START:
case WStype_FRAGMENT:
case WStype_FRAGMENT_FIN:
break;
}
}
Dashboard name: rockoon_dashboard
Default bucket name: rockoon
Organization name: wasa_rockoon
Download Arduino WebSockets Client library for ESP32