python - 为什么我不能使用 Python(使用此代码)通过 MQTT 将图像发送到 Google Cloud IoT Core?
问题描述
下面是我尝试使用 MQTT 将图像发送到 Google Cloud IoT Core。我已阅读以下对我有所帮助的帖子,但我的代码仍然无法正常工作:如何在 Python 中使用 Mosquitto 将文件发布到 AWS-IoT以及如何在 Python 中使用 Mosquitto 发布文件?.
我猜我的错误与qos
in theclient.publish
或我如何使用循环有关,但恐怕到目前为止我对这些因素的试验对我没有帮助(尝试qos
= 0/1/2 和 eg client.loop_forever()
)。我的图像是 1.2 Mb,所以据我所知,这应该不是问题。
#!/usr/bin/python
from picamera import PiCamera
import datetime
import time
import jwt
import paho.mqtt.client as mqtt
from time import sleep
# Define some project-based variables to be used below. This should be the only
# block of variables that you need to edit in order to run this script
ssl_private_key_filepath = 'FILE1.pem'
ssl_algorithm = 'RS256' # Either RS256 or ES256
root_cert_filepath = 'FILE2.PEM'
project_id = 'PROJECT_ID'
gcp_location = 'LOCATION'
registry_id = 'REG_ID'
device_id = 'DEVICE_ID'
# end of user-variables
run = True
cur_time = datetime.datetime.utcnow()
def create_jwt():
token = {
'iat': cur_time,
'exp': cur_time + datetime.timedelta(minutes=60),
'aud': project_id
}
with open(ssl_private_key_filepath, 'r') as f:
private_key = f.read()
return jwt.encode(token, private_key, ssl_algorithm)
_CLIENT_ID = 'projects/{}/locations/{}/registries/{}/devices/{}'.format(project_id, gcp_location, registry_id, device_id)
_MQTT_TOPIC = '/devices/{}/events'.format(device_id)
client = mqtt.Client(client_id=_CLIENT_ID)
# authorization is handled purely with JWT, no user/pass, so username can be whatever
client.username_pw_set(
username='unused',
password=create_jwt())
def error_str(rc):
return '{}: {}'.format(rc, mqtt.error_string(rc))
def on_connect(unusued_client, unused_userdata, unused_flags, rc):
print('on_connect', error_str(rc))
def on_publish(unused_client, unused_userdata, unused_mid):
print('on_publish')
run = False
client.on_connect = on_connect
client.on_publish = on_publish
client.tls_set(ca_certs=root_cert_filepath) # Replace this with 3rd party cert if that was used when creating registry
client.connect('mqtt.googleapis.com', 8883)
camera = PiCamera()
camera.start_preview()
sleep(5)
camera.capture('/tmp/picture.jpg')
camera.stop_preview()
with open("/tmp/picture.jpg", 'rb') as f:
imagestring = f.read()
byteArray = bytes(imagestring)
try:
client.publish(_MQTT_TOPIC, byteArray, qos=2)
except:
print('Error')
while run:
client.loop()
client.disconnect()
解决方案
推荐阅读
- telegram - 下载发送到 Bot 的文件 (>20 MB) 是否有任何解决方法?我尝试使用“file_id”获取“file_path”,但它返回错误
- php - 在“使用苹果签名”实施期间尝试通过授权码获取刷新令牌时总是发生“invalid_client”错误
- html - 在 Powershell 中循环并将结果拆分为单独的文件
- javascript - 我可以自定义在另一个 Web 组件中使用的 Web 组件的 CSS 吗?
- reactjs - React 查询 Firestore 数据
- javascript - 了解如何使用 reduce 代替 map 和 join 这个函数
- node.js - 我们可以在节点 JS 中使用 JWT 验证 Socket IO 发出的每个事件吗?
- selenium-webdriver - 无法使用 python-selenium 单击可见的搜索按钮
- jenkins - jenkins 安装 windows 10“服务登录凭据”
- mongodb - 在MongoDB中按数组排序时忽略空值