From adb88a5849e7e4e6e141175c802a2660e3c3aada Mon Sep 17 00:00:00 2001 From: "ry.yamafuji" Date: Mon, 21 Oct 2024 04:32:59 +0900 Subject: [PATCH] =?UTF-8?q?gcp=E3=82=AF=E3=83=A9=E3=82=A6=E3=83=89?= =?UTF-8?q?=E9=80=A3=E6=90=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.sample | 7 +++ .gitignore | 6 +- aws/.gitkeep | 0 client/mqtt_client_aws.py | 95 ++++++++++++++++++++++++++++++++ client/mqtt_client_aws_manual.py | 95 ++++++++++++++++++++++++++++++++ documents/aws.md | 26 +++++++++ documents/gcp.md | 35 ++++++++++++ documents/tcp_scan.md | 59 ++++++++++++++++++++ gcp/.gitkeep | 0 9 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 aws/.gitkeep create mode 100644 client/mqtt_client_aws.py create mode 100644 client/mqtt_client_aws_manual.py create mode 100644 documents/aws.md create mode 100644 documents/gcp.md create mode 100644 documents/tcp_scan.md create mode 100644 gcp/.gitkeep diff --git a/.env.sample b/.env.sample index 71b8949..2c0ec32 100644 --- a/.env.sample +++ b/.env.sample @@ -3,3 +3,10 @@ MQTT_HOST=localhost MQTT_PORT=1883 MQTT_DEVICE_CODE=test0001 +# MQTT AWS IoT Core +AWS_MQTT_HOST=a4wl7j5nic1q9-ats.iot.ap-southeast-2.amazonaws.com +AWS_MQTT_PORT=8883 +AWS_MQTT_DEVICE=devel_mqtt_device +AWS_CA_PATH=../aws/connect_device_package/root-CA.crt +AWS_CERT_PATH=../aws/connect_device_package/devel_mqtt_device.cert.pem +AWS_KEY_PATH=../aws/connect_device_package/devel_mqtt_device.private.key \ No newline at end of file diff --git a/.gitignore b/.gitignore index f78d3c0..976a529 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ mqttmock -.env \ No newline at end of file +/aws/connect_device_package* +.env +*pem +*key +*crt \ No newline at end of file diff --git a/aws/.gitkeep b/aws/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/client/mqtt_client_aws.py b/client/mqtt_client_aws.py new file mode 100644 index 0000000..1f61f8e --- /dev/null +++ b/client/mqtt_client_aws.py @@ -0,0 +1,95 @@ +import paho.mqtt.client as mqtt +import os +from dotenv import load_dotenv +import time +import json + + +load_dotenv(dotenv_path=".env") + +AWS_MQTT_HOST = os.getenv("AWS_MQTT_HOST") +AWS_MQTT_PORT = int(os.getenv("AWS_MQTT_PORT")) +AWS_MQTT_DEVICE = os.getenv("AWS_MQTT_DEVICE") +AWS_CA_PATH = os.getenv("AWS_CA_PATH") +AWS_CERT_PATH = os.getenv("AWS_CERT_PATH") +AWS_KEY_PATH = os.getenv("AWS_KEY_PATH") + + +def on_connect_mock(client, userdata, flags, rc, properties=None): + print(f"on_connect: rc={rc}") + + +def on_disconnect_mock(client, userdata, rc): + print(f"on_disconnect: rc={rc}") + if rc != 0: + print("Unexpected disconnection.") + + +def on_publish_mock(client, userdata, mid): + print("on_publish: {0}".format(mid)) + + +def on_subscribe_mock(mqttc, obj, mid, granted_qos): + print("on_subscribe: "+str(mid)+" "+str(granted_qos)) + + +def on_message_mock(client, userdata, msg): + print(f"on_message") + print("Received message '" + str(msg.payload) + + "' on topic '" + msg.topic + "' with QoS " + str(msg.qos)) + payload_str = msg.payload.decode('utf-8') + print(f"{payload_str}") + + +def test_mqtt_mock(): + # connect処理 + print("AWS_MQTT_HOST:", AWS_MQTT_HOST) + print("AWS_MQTT_DEVICE:", AWS_MQTT_DEVICE) + print("AWS_MQTT_PORT:", AWS_MQTT_PORT) + print("AWS_CA_PATH:", AWS_CA_PATH) + print("AWS_CERT_PATH:", AWS_CERT_PATH) + print("AWS_KEY_PATH:", AWS_KEY_PATH) + client = mqtt.Client(client_id=AWS_MQTT_DEVICE, clean_session=False) + client.tls_set(AWS_CA_PATH, AWS_CERT_PATH, AWS_KEY_PATH) + + client.on_connect = on_connect_mock + client.on_disconnect = on_disconnect_mock + client.on_publish = on_publish_mock + client.on_subscribe = on_subscribe_mock + client.on_message = on_message_mock + client.connect(AWS_MQTT_HOST, AWS_MQTT_PORT, 60) + time.sleep(30) + + topic = f"device/{AWS_MQTT_DEVICE}/command" + client.subscribe(topic, qos=1) + print(f"client.subscribe:{topic}") + client.loop_start() + while True: + try: + client.loop() + print("publish start.") + topic = f"device/{AWS_MQTT_DEVICE}/send" + data = {"message": "test"} + message = json.dumps(data).encode('utf-8') + print(f"topic:{topic}") + client.publish(topic, message, qos=1) + time.sleep(30) + except KeyboardInterrupt as e: + time.sleep(30) + break + except Exception as e: + print(f"error:{e}") + time.sleep(30) + + print(f"end") + client.loop_stop() + client.disconnect() + + +def main(): + print("Mqtt Mock Client Start.") + test_mqtt_mock() + + +if __name__ == "__main__": + main() diff --git a/client/mqtt_client_aws_manual.py b/client/mqtt_client_aws_manual.py new file mode 100644 index 0000000..b13110b --- /dev/null +++ b/client/mqtt_client_aws_manual.py @@ -0,0 +1,95 @@ +import paho.mqtt.client as mqtt +import os +from dotenv import load_dotenv +import time +import json + + +load_dotenv(dotenv_path=".env") + +AWS_MQTT_HOST = os.getenv("AWS_MQTT_HOST") +AWS_MQTT_PORT = int(os.getenv("AWS_MQTT_PORT")) +AWS_MQTT_DEVICE = os.getenv("AWS_MQTT_DEVICE") +AWS_CA_PATH = os.getenv("AWS_CA_PATH") +AWS_CERT_PATH = os.getenv("AWS_CERT_PATH") +AWS_KEY_PATH = os.getenv("AWS_KEY_PATH") + + +def on_connect_mock(client, userdata, flags, rc, properties=None): + print(f"on_connect: rc={rc}") + + +def on_disconnect_mock(client, userdata, rc): + print(f"on_disconnect: rc={rc}") + if rc != 0: + print("Unexpected disconnection.") + client.reconnect() + + +def on_publish_mock(client, userdata, mid): + print("on_publish: {0}".format(mid)) + + +def on_subscribe_mock(mqttc, obj, mid, granted_qos): + print("on_subscribe: "+str(mid)+" "+str(granted_qos)) + + +def on_message_mock(client, userdata, msg): + print(f"on_message") + print("Received message '" + str(msg.payload) + + "' on topic '" + msg.topic + "' with QoS " + str(msg.qos)) + payload_str = msg.payload.decode('utf-8') + print(f"{payload_str}") + + +def test_mqtt_mock(): + # connect処理 + print("AWS_MQTT_HOST:", AWS_MQTT_HOST) + print("AWS_MQTT_DEVICE:", AWS_MQTT_DEVICE) + print("AWS_MQTT_PORT:", AWS_MQTT_PORT) + print("AWS_CA_PATH:", AWS_CA_PATH) + print("AWS_CERT_PATH:", AWS_CERT_PATH) + print("AWS_KEY_PATH:", AWS_KEY_PATH) + client = mqtt.Client(client_id=AWS_MQTT_DEVICE, clean_session=False) + client.tls_set(AWS_CA_PATH, AWS_CERT_PATH, AWS_KEY_PATH) + + client.on_connect = on_connect_mock + client.on_disconnect = on_disconnect_mock + client.on_publish = on_publish_mock + client.on_subscribe = on_subscribe_mock + client.on_message = on_message_mock + client.connect(AWS_MQTT_HOST, AWS_MQTT_PORT, 60) + time.sleep(30) + + topic = f"device/{AWS_MQTT_DEVICE}/command" + client.subscribe(topic, qos=1) + print(f"client.subscribe:{topic}") + client.loop_start() + while True: + try: + print("publish start.") + topic = f"device/{AWS_MQTT_DEVICE}/send" + data = {"message": "test"} + message = json.dumps(data).encode('utf-8') + print(f"topic:{topic}") + client.publish(topic, message, qos=1) + time.sleep(30) + except KeyboardInterrupt as e: + time.sleep(30) + break + except Exception as e: + print(f"error:{e}") + time.sleep(30) + + print(f"end") + client.loop_stop() + client.disconnect() + + +def main(): + print("Mqtt Mock Client Start.") + test_mqtt_mock() + + +if __name__ == "__main__": + main() diff --git a/documents/aws.md b/documents/aws.md new file mode 100644 index 0000000..5304040 --- /dev/null +++ b/documents/aws.md @@ -0,0 +1,26 @@ +# AWSでIoT Coreで接続する方法 + +**前提条件:** + +* `AWS IoT Core`を開く +* デバイスの登録 + * `1 個のデバイスを接続`をクリックする + * 新しいモノを作成 + * モノの名前: devel_mqtt_device + * 環境にあわせてSDKを設定してください +--- + +Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process + +**ポートに関する情報:** + +* ポート8883: セキュアな MQTT over TLS 通信に使用されます。 +* ポート443: MQTT over WebSocket での通信に使用されます。こちらはHTTPベースの通信が必要な場合に使われることが多いです。 + +**ポリシーの設定:** + +はじめはポリシーが制限されているので +Pahoから実行すると弾かれてしまいます。 + +device/devel_mqtt_device/command +device/devel_mqtt_device/send \ No newline at end of file diff --git a/documents/gcp.md b/documents/gcp.md new file mode 100644 index 0000000..74db2b7 --- /dev/null +++ b/documents/gcp.md @@ -0,0 +1,35 @@ +# GCP + ClearBlade でIoT環境を構築する + +https://docs.clearblade.com/iotcore/quick-start + +## Registryを作成する + +* レジストリのID(識別子):任意の名前を付けることができます +* リージョン(サーバーの設置場所):最も近いリージョンを選びます。 + * 通信の速度やパフォーマンスに影響 +* Pub/Sub(任意): Google CloudのPub/Subサービス/新しいトピック(メッセージの送受信チャンネル)を作成 + * デバイスがメッセージを送受信できるようになります。 + + +## デバイスを作成する + +* デバイスID:GCPTEST0001 + +## Credentials(資格情報の作成) + +デバイスの認証に使用する鍵ペアを生成します。 +セキュアな通信を確保するために必要です。 + + +デバイスの鍵ペア(公開鍵と秘密鍵)を生成します。 +これを使って、デバイスがサーバーとセキュアに通信できるようにします。 + +```sh +wsl +openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes \ + -out rsa_cert.pem -subj "/CN=unused" +``` + +## CA certificatesを設定する + + diff --git a/documents/tcp_scan.md b/documents/tcp_scan.md new file mode 100644 index 0000000..1f645c9 --- /dev/null +++ b/documents/tcp_scan.md @@ -0,0 +1,59 @@ +## Windowsの場合 + +現在はWiresharkが推奨されています。 +Wiresharkでキャプチャするのが良いでしょう + +* ダウンロード先: + * https://www.wireshark.org/download.html + + +### Wiresharkを利用する + +* リアルタイムでネットワークトラフィックをキャプチャし、解析することができます。 +* Windows、macOS、Linuxなど、複数のプラットフォームで利用できます。 +* グラフィカルなユーザーインターフェースがあり、直感的に操作が可能です。 +* 特定の条件に基づいてパケットをフィルタリングすることができ、効率よく抽出できます。 + + +#### コマンドラインでリアルタイムでキャプチャする + +Wiresharkに含まれているコマンドラインツール tshark を使用することで、 +リアルタイムにプロンプトにネットワークパケットを出力できます。 + +```cmd +tshark -i 1 +``` + + +# ip.src == 2400:2650:41a1:2600:7163:1836:c090:b765 +# ip.dst == 2403:b300:ff00::dd2:33e0 +# tcp.srcport == 49173 +# tcp.dstport == 8883 + + +--- + +### 標準のコマンドとしてnetshを利用する場合 + +ETLフォーマットのファイルで出力されますが +Wiresharkなどで読み取るためには PCAP 形式に変換するか、解析できるツールを使います。 +netsh trace コマンドで直接プロンプトにリアルタイムでパケットの内容を表示することはできません。 + +```sh +netsh trace start capture=yes + +netsh trace stop +``` + +```sh +netsh trace start capture=yes IPv4.Address=<ターゲットIPアドレス> +``` + + +下記のツールはMicrosoftの公式から出ておりましたが +現在はsupportが終了されています。 + +* Microsoft Message Analyzer +* Microsoft Network Monitor + + diff --git a/gcp/.gitkeep b/gcp/.gitkeep new file mode 100644 index 0000000..e69de29