RaspberryPi 正在向 AWS IoT 发送消息 - 我无法在 aws 控制台上测试它
RaspberryPi is sending messages to AWS IoT - I cant test it on the aws console
我将我的 RaspberryPi 注册为 Aws IoT 中的一个事物。
我正在执行这个 python 脚本:
from __future__ import print_function
import sys
import ssl
import time
import datetime
import logging, traceback
import paho.mqtt.client as mqtt
IoT_protocol_name = "x-amzn-mqtt-ca"
aws_iot_endpoint = "a132ag21b212..." # <random>.iot.<region>.amazonaws.com
url = "https://{}".format(aws_iot_endpoint)
ca = "/root/awsiotNew/root-CA.crt"
cert = "/root/awsiotNew/6d9asad65a-certificate.pem.crt"
private = "/root/awsiotNew/6d9aadas5a-private.pem.key"
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(log_format)
logger.addHandler(handler)
def ssl_alpn():
try:
#debug print opnessl version
logger.info("open ssl version:{}".format(ssl.OPENSSL_VERSION))
ssl_context = ssl.create_default_context()
ssl_context.set_alpn_protocols([IoT_protocol_name])
ssl_context.load_verify_locations(cafile=ca)
ssl_context.load_cert_chain(certfile=cert, keyfile=private)
return ssl_context
except Exception as e:
print("exception ssl_alpn()")
raise e
if __name__ == '__main__':
topic = "test/date"
try:
mqttc = mqtt.Client()
ssl_context= ssl_alpn()
mqttc.tls_set_context(context=ssl_context)
logger.info("start connect")
mqttc.connect(aws_iot_endpoint, port=8883)
logger.info("connect success")
mqttc.loop_start()
while True:
now = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
logger.info("try to publish into:{}".format(now))
mqttc.publish(topic, now)
time.sleep(1)
except Exception as e:
logger.error("exception main()")
logger.error("e obj:{}".format(vars(e)))
logger.error("message:{}".format(e.message))
traceback.print_exc(file=sys.stdout)
当我现在尝试通过 putty 在我的树莓派上 运行 这个脚本时,它似乎工作正常,因为我在树莓派控制台中收到的消息如下所示:
root@DietPi:~/awsiotNew# python3 pythoniotnew.py
2020-06-25 12:08:52,944 - root - INFO - open ssl version:OpenSSL 1.1.1d 10 Sep 2019
2020-06-25 12:08:52,947 - root - INFO - start connect
2020-06-25 12:08:53,019 - root - INFO - connect success
2020-06-25 12:08:53,020 - root - INFO - try to publish into:2020-06-25T12:08:53
2020-06-25 12:08:54,022 - root - INFO - try to publish into:2020-06-25T12:08:54
2020-06-25 12:08:55,024 - root - INFO - try to publish into:2020-06-25T12:08:55
2020-06-25 12:08:56,026 - root - INFO - try to publish into:2020-06-25T12:08:56
2020-06-25 12:08:57,027 - root - INFO - try to publish into:2020-06-25T12:08:57
现在我想检查消息是否正确插入到 aws IoT - 所以我按照以下步骤操作:Aws Guide view mqtt messages。基本上我只需要插入一个“#”作为主题,这样每条收到的消息都会显示出来。但事实并非如此。我没有在控制台中显示任何消息。
Screenshot of my subscribed topics in the mqtt client / Aws IoT Console
如何确保连接正常?
谢谢!
我知道问题出在哪里了:
我不知道我必须将 东西和政策 附加到证书上。
这似乎是问题所在,现在我正在将消息直接发送到我的测试控制台。
如果有人遇到这个问题,请查看这个 Blog Entry,它帮助我解决了这个问题。
我将我的 RaspberryPi 注册为 Aws IoT 中的一个事物。
我正在执行这个 python 脚本:
from __future__ import print_function
import sys
import ssl
import time
import datetime
import logging, traceback
import paho.mqtt.client as mqtt
IoT_protocol_name = "x-amzn-mqtt-ca"
aws_iot_endpoint = "a132ag21b212..." # <random>.iot.<region>.amazonaws.com
url = "https://{}".format(aws_iot_endpoint)
ca = "/root/awsiotNew/root-CA.crt"
cert = "/root/awsiotNew/6d9asad65a-certificate.pem.crt"
private = "/root/awsiotNew/6d9aadas5a-private.pem.key"
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(log_format)
logger.addHandler(handler)
def ssl_alpn():
try:
#debug print opnessl version
logger.info("open ssl version:{}".format(ssl.OPENSSL_VERSION))
ssl_context = ssl.create_default_context()
ssl_context.set_alpn_protocols([IoT_protocol_name])
ssl_context.load_verify_locations(cafile=ca)
ssl_context.load_cert_chain(certfile=cert, keyfile=private)
return ssl_context
except Exception as e:
print("exception ssl_alpn()")
raise e
if __name__ == '__main__':
topic = "test/date"
try:
mqttc = mqtt.Client()
ssl_context= ssl_alpn()
mqttc.tls_set_context(context=ssl_context)
logger.info("start connect")
mqttc.connect(aws_iot_endpoint, port=8883)
logger.info("connect success")
mqttc.loop_start()
while True:
now = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
logger.info("try to publish into:{}".format(now))
mqttc.publish(topic, now)
time.sleep(1)
except Exception as e:
logger.error("exception main()")
logger.error("e obj:{}".format(vars(e)))
logger.error("message:{}".format(e.message))
traceback.print_exc(file=sys.stdout)
当我现在尝试通过 putty 在我的树莓派上 运行 这个脚本时,它似乎工作正常,因为我在树莓派控制台中收到的消息如下所示:
root@DietPi:~/awsiotNew# python3 pythoniotnew.py
2020-06-25 12:08:52,944 - root - INFO - open ssl version:OpenSSL 1.1.1d 10 Sep 2019
2020-06-25 12:08:52,947 - root - INFO - start connect
2020-06-25 12:08:53,019 - root - INFO - connect success
2020-06-25 12:08:53,020 - root - INFO - try to publish into:2020-06-25T12:08:53
2020-06-25 12:08:54,022 - root - INFO - try to publish into:2020-06-25T12:08:54
2020-06-25 12:08:55,024 - root - INFO - try to publish into:2020-06-25T12:08:55
2020-06-25 12:08:56,026 - root - INFO - try to publish into:2020-06-25T12:08:56
2020-06-25 12:08:57,027 - root - INFO - try to publish into:2020-06-25T12:08:57
现在我想检查消息是否正确插入到 aws IoT - 所以我按照以下步骤操作:Aws Guide view mqtt messages。基本上我只需要插入一个“#”作为主题,这样每条收到的消息都会显示出来。但事实并非如此。我没有在控制台中显示任何消息。 Screenshot of my subscribed topics in the mqtt client / Aws IoT Console
如何确保连接正常?
谢谢!
我知道问题出在哪里了:
我不知道我必须将 东西和政策 附加到证书上。 这似乎是问题所在,现在我正在将消息直接发送到我的测试控制台。
如果有人遇到这个问题,请查看这个 Blog Entry,它帮助我解决了这个问题。