Python3
paho
AzureIoTHub

Azure IoT Hub に paho で publish

Hub は、iot-aa
Device は pansy
と設定されている Azure IoT Hub に paho でpublish するサンプルです。
サンプルは2つあります。

サンプル1

paho_publish.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
#   paho_publish.py
#
#                       Feb/05/2018
# ------------------------------------------------------------------
import  sys
import  ssl
import  paho.mqtt.publish as publish
import  paho.mqtt.client as mqtt

from generate_sas_token import generate_sas_token
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
uri = "iot-aa.azure-devices.net/devices/pansy"
key = "2eQ2wF5OjZLP7tq6PG123456789RTfAnMJbZ8wtJPu4="
policy_name = None
iexpire = 3600
sas_token = generate_sas_token(uri, key, policy_name, iexpire)
auth = {
    'username':"iot-aa.azure-devices.net/pansy/api-version=2016-11-14",
    'password': sas_token
    }

tls = {
    'ca_certs': "/etc/ssl/certs/ca-certificates.crt",
    'tls_version': ssl.PROTOCOL_TLSv1
    }
#
msg="Hello World Feb/05/2018"
try:
    publish.single("devices/pansy/messages/events/",
        payload=msg,
        hostname="iot-aa.azure-devices.net",
        client_id="pansy",
        auth=auth,
        tls=tls,
        port=8883,
        protocol=mqtt.MQTTv311)
except Exception as ee:
    sys.stderr.write("*** error *** in publish.single ***\n")
    sys.stderr.write(str(ee) + "\n")
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------

サンプル 2

paho_ex01.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#   paho_ex01.py
#
#                   Feb/05/2018
# ------------------------------------------------------------------
import  sys
import  ssl
from    paho.mqtt import client as mqtt
from generate_sas_token import generate_sas_token
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
uri = "iot-aa.azure-devices.net/devices/pansy"
key = "2eQ2wF5OjZLP7tq6PG123456789RTfAnMJbZ8wtJPu4="
policy_name = None
iexpire = 3600
sas_token = generate_sas_token(uri, key, policy_name, iexpire)
#
path_to_root_cert = "/etc/ssl/certs/ca-certificates.crt"
#
client = mqtt.Client(client_id="pansy", protocol=mqtt.MQTTv311)

client.username_pw_set(username="iot-aa.azure-devices.net/pansy", password=sas_token)

client.tls_set(ca_certs=path_to_root_cert, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1, ciphers=None)

client.tls_insecure_set(False)
host="iot-aa.azure-devices.net"
sys.stderr.write("host = " + host + "\n")

topic = "devices/pansy/messages/events/"
msg = '{"aa": "Hello","bb": "Good"}'
try:
    client.connect(host, port=8883)
    client.publish(topic, payload=msg)
    client.disconnect()
except Exception as ee:
    sys.stderr.write("*** error *** in client.connect ***\n")
    sys.stderr.write(str(ee) + "\n")
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------

sas_token を計算するプログラム

generate_sas_token.py
# -*- coding: utf-8 -*-
#
#   generate_sas_token.py
#
#                       Feb/05/2018
# ------------------------------------------------------------------
from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC

# ------------------------------------------------------------------
def generate_sas_token(uri, key, policy_name, expiry=3600):
    ttl = time() + expiry
    sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
    signature = b64encode(HMAC(b64decode(key), sign_key.encode("utf-8"), sha256).digest())

    rawtoken = {
        'sr' :  uri,
        'sig': signature,
        'se' : str(int(ttl))
        }

    if policy_name is not None:
        rawtoken['skn'] = policy_name
#
    rvalue = 'SharedAccessSignature ' + urlencode(rawtoken)
#
    return rvalue
#
# ------------------------------------------------------------------