AWS IoTにpub/subするPythonのライブラリ`awsiot`はデフォルトport=443使ってた。

# 概要
AWS IoTにpythonでアクセスしてみた。
awsiotでアクセスしたら、port=443使ってた。

# awsiot

これをそのままコピペ。
[Python を使用してデバイスから AWS IoT Core に MQTT メッセージを発行する](https://aws.amazon.com/jp/premiumsupport/knowledge-center/iot-core-publish-mqtt-messages-python/)

```python
from awscrt import io, mqtt, auth, http
from awsiot import mqtt_connection_builder
import time as t
import json

# Define ENDPOINT, CLIENT_ID, PATH_TO_CERT, PATH_TO_KEY, PATH_TO_ROOT, MESSAGE, TOPIC, and RANGE
ENDPOINT = "xxx-ats.iot.us-east-2.amazonaws.com"
CLIENT_ID = "python"
PATH_TO_CERT = "certificates/yyy-certificate.pem.crt"
PATH_TO_KEY = "certificates/yyy-private.pem.key"
PATH_TO_ROOT = "certificates/AmazonRootCA1.pem"
MESSAGE = "Hello World"
TOPIC = "test/testing"
RANGE = 2

# Spin up resources
event_loop_group = io.EventLoopGroup(1)
host_resolver = io.DefaultHostResolver(event_loop_group)
client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)
mqtt_connection = mqtt_connection_builder.mtls_from_path(
            endpoint=ENDPOINT,
            cert_filepath=PATH_TO_CERT,
            pri_key_filepath=PATH_TO_KEY,
            client_bootstrap=client_bootstrap,
            ca_filepath=PATH_TO_ROOT,
            client_id=CLIENT_ID,
            clean_session=False,
            keep_alive_secs=6
            )
print("Connecting to {} with client ID '{}'...".format(
        ENDPOINT, CLIENT_ID))
# Make the connect() call
connect_future = mqtt_connection.connect()
# Future.result() waits until a result is available
connect_future.result()
print("Connected!")
# Publish message to server desired number of times.
print('Begin Publish')
for i in range (RANGE):
    data = "{} [{}]".format(MESSAGE, i+1)
    message = {"message" : data}
    mqtt_connection.publish(topic=TOPIC, payload=json.dumps(message), qos=mqtt.QoS.AT_LEAST_ONCE)
    print("Published: '" + json.dumps(message) + "' to the topic: " + "'test/testing'")
    t.sleep(0.1)
print('Publish End')
disconnect_future = mqtt_connection.disconnect()
disconnect_future.result()
```

Wiresharkでパケット見てたら、port 443を使ってる。まじか。デフォルト443なのか。

参考：
[AWS IoT Core は、ポート 443 を使った証明書によるクライアント認証で MQTT 接続をサポートできるようになりました](https://aws.amazon.com/jp/about-aws/whats-new/2018/02/aws-iot-core-now-supports-mqtt-connections-with-certificate-based-client-authentication-on-port-443/)

試しにportを指定したら、`8883`になった。

```python
mqtt_connection = mqtt_connection_builder.mtls_from_path(
            endpoint=ENDPOINT,
            port=8883,
            cert_filepath=PATH_TO_CERT,
            pri_key_filepath=PATH_TO_KEY,
            client_bootstrap=client_bootstrap,
            ca_filepath=PATH_TO_ROOT,
            client_id=CLIENT_ID,
            clean_session=False,
            keep_alive_secs=6
            )
```

# paha
比較のため、pahoのコードもためしてみた。
この方のコードをコピペさせてもらった。
[Paho(MQTT Client Library) -Python- - Qiita](https://qiita.com/n-yamanaka/items/91dbd7bd9fed5b3fbed4)

```python
#!/usr/bin/python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import ssl

host = 'xxx-ats.iot.us-east-2.amazonaws.com'
### パスワード認証を使用する時に使用する
#username = 'mqtt'
#password = 'mqtt'
### SSL
port = 8883
cacert = './certificates/AmazonRootCA1.pem'
clientCert = './certificates/yyy-certificate.pem.crt'
clientKey = './certificates/yyy-private.pem.key'

topic = "esp32/pub"
message = 'test message'

def on_connect(client, userdata, flags, respons_code):
    """broker接続時のcallback関数
    """
    print('status {0}'.format(respons_code))
    client.publish(topic, message)

def on_publish(client, userdata, mid):
    """メッセージをpublishした後のcallback関数
    """
    client.disconnect()

if __name__ == '__main__':
    ### インスタンス作成時にprotocol v3.1.1を指定
    client = mqtt.Client(client_id= "python",protocol=mqtt.MQTTv311)
    ### パスワード認証を使用する時に使用する
    #client.username_pw_set(username, password=password)
    ### SSL
    client.tls_set(cacert,
        certfile = clientCert,
        keyfile = clientKey,
        tls_version = ssl.PROTOCOL_TLSv1_2)
    client.tls_insecure_set(True)

    ### callback function
    client.on_connect = on_connect
    client.on_publish = on_publish

    client.connect(host, port=port, keepalive=6)
    client.loop_forever()
```

指定してるから当たり前やけど、port=8883で接続した。

# さいごに
ライブラリ使うとき、どんな動きしてるかちゃんと確認するようにしよ。当たり前やろけど。