4GPiでPython言語のスクリプトを使ってAzure IoT Hubにアクセスします。C言語のプログラムを使ってのAzure IoT Hubにアクセスは「3GPIを 用いたAzure IoT Hub への環境データの送信」で行いました。また、4GPiとraspberryPiとの設定は「イプシムを使って4GPiでネットワーク接続 」を参照してください。

Azure IoT Hub へのアクセスプログラム作成

PythonでAzure IoT Hub へアクセスするには「Azure IoT SDK for Python」を使用します。

最初に、Python3のpipを次のコマンドでインストールします。

$ sudo apt-get -y install python3-pip
$ pip3 --version
pip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7)
$ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.2.0] on linux

次に、次のコマンドでSDKライブラリをインストールします。

$ pip3 install azure-iot-device
$ pip3 install azure-iot-hub

Pythonスクリプトは、提供されている次のサンプルコード「send_message.py」を使用します。13行目で環境変数「IOTHUB_DEVICE_CONNECTION_STRING」からAzure IoT Hubの接続文字列を取得します。

# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------

import os
import time
import uuid
from azure.iot.device import IoTHubDeviceClient, Message

# The connection string for a device should never be stored in code. For the sake of simplicity we're using an environment variable here.
conn_str = os.getenv("IOTHUB_DEVICE_CONNECTION_STRING")
# The client object is used to interact with your Azure IoT hub.
device_client = IoTHubDeviceClient.create_from_connection_string(conn_str)

# Connect the client.
device_client.connect()

# send 2 messages with 2 system properties & 1 custom property with a 1 second pause between each message
for i in range(1, 3):
    print("sending message #" + str(i))
    msg = Message("test wind speed " + str(i))
    msg.message_id = uuid.uuid4()
    msg.correlation_id = "correlation-1234"
    msg.custom_properties["tornado-warning"] = "yes"
    device_client.send_message(msg)
    time.sleep(1)

# send 2 messages with only custom property with a 1 second pause between each message
for i in range(3, 5):
    print("sending message #" + str(i))
    msg = Message("test wind speed " + str(i))
    msg.custom_properties["tornado-warning"] = "yes"
    device_client.send_message(msg)
    time.sleep(1)

# send 2 messages with only system properties with a 1 second pause between each message
for i in range(5, 7):
    print("sending message #" + str(i))
    msg = Message("test wind speed " + str(i))
    msg.message_id = uuid.uuid4()
    msg.correlation_id = "correlation-1234"
    device_client.send_message(msg)
    time.sleep(1)

# send 2 messages with 1 system property and 1 custom property with a 1 second pause between each message
for i in range(7, 9):
    print("sending message #" + str(i))
    msg = Message("test wind speed " + str(i))
    msg.message_id = uuid.uuid4()
    msg.custom_properties["tornado-warning"] = "yes"
    device_client.send_message(msg)
    time.sleep(1)

# send only string messages
for i in range(9, 11):
    print("sending message #" + str(i))
    device_client.send_message("test payload message " + str(i))
    time.sleep(1)


# finally, disconnect
device_client.disconnect()

Azure IoT Hub へのデータ送信実行

Raspberry Pi 3がイプシムを利用した4GPiを経由して、Azure IoT Hubにデータを送信し、DeviceExplorerに表示します。

DeviceExploreのDataタブを選択し、Monitorボタンを押します。そしてRaspberry Pi 3から、サンプルプログラムを次のコマンドで実行します。

$ python3 send_message.py
2020-01-20 04:16:38,865 client.py:2415 Sending CONNECT (u1, p1, wr0, wq0, wf0, c0, k60) client_id=b'xxx'
2020-01-20 04:16:39,263 client.py:2415 Received CONNACK (0, 0)
sending message #1
2020-01-20 04:16:39,279 client.py:2415 Sending PUBLISH (d0, q1, r0, m1), 'b'devices/xxxx/messages/events/%24.mid=xxxx.cid=correlation-1234&%24.ct=application%2Fjson&%24.ce=utf-8&tornado-warning=yes'', ... (17 bytes)
2020-01-20 04:16:39,785 client.py:2415 Received PUBACK (Mid: 1)
sending message #2
2020-01-20 04:16:40,799 client.py:2415 Sending PUBLISH (d0, q1, r0, m2), 
    ・・・・

DeviceExplorerのDataタブに、受信した環境データが次のように表示されます。