我目前正在尝试使用 python 更新设备孪生中的属性。但由于 SSL 错误而无法执行此操作。
下面是代码
from azure.iot.hub import IoTHubRegistryManager
import certifi
import ssl
# Connect to IoT Hub and send message to device
CONNECTION_STRING = "HostName=iothub-jein02-np-eas-ua-eztr01.azure-devices.net;SharedAccessKeyName=service;SharedAccessKey=Mmjc..."
DEVICE_ID = "NodeMCU"
'''first used this method'''
#ca_cert_path = "D:/new/cacert.pem"
'''later used this method'''
# Set the CA certificates globally
ssl_context = ssl.create_default_context(cafile=certifi.where())
try:
# Create IoTHubRegistryManager
registry_manager = IoTHubRegistryManager.from_connection_string(CONNECTION_STRING, connection_verify = False)
# Update the desired properties
twin = registry_manager.update_twin(DEVICE_ID, {
"properties": {
"desired": {
"temp": "100"
}
}
})
except Exception as ex:
print(f"Error sending message to device: {str(ex)}")
raise
以下是我收到的错误
msrest.exceptions.ClientRequestError: 请求中发生错误。,SSLError: HTTPSConnectionPool(host=' iothub-jein02-np-eas-ua-eztr01.azure-devices.net',端口=443):超过最大重试次数,网址:/twins/NodeMCU?api-version=2021-04-12(由 SSLError(SSLCertVerificationError 引起) (1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败: 无法获取本地颁发者证书 (_ssl.c:997)')))
另外,如何在 443 端口(开放端口)中执行此操作,它尝试了 connection_verify =错误的。 它说connection_verify命令错误
如何纠正此错误。
该 SSL 错误表明的 Python 脚本无法验证 IoT 中心证书。下面介绍了如何解决该问题以及一些优秀的做法:
1. 使用
certifi
包(推荐):
看起来正试图使用
certifi
,但并未以正确的方式使用。无需直接修改
ssl_context
,
certifi
应该通过 Python 的
requests
库自动处理。请尝试如下简化代码:
from azure.iot.hub import IoTHubRegistryManager
CONNECTION_STRING = "HostName=iothub-jein02-np-eas-ua-eztr01.azure-devices.net;SharedAccessKeyName=service;SharedAccessKey=Mmjc..."
DEVICE_ID = "NodeMCU"
try:
registry_manager = IoTHubRegistryManager.from_connection_string(CONNECTION_STRING)
twin = registry_manager.update_twin(DEVICE_ID, {
"properties": {
"desired": {
"temp": "100"
}
}
})
print("孪生更新成功")
except Exception as ex:
print(f"错误:{ex}")
说明:
-
certifi
应该自动工作:certifi
包附带了 Python 安装程序,并提供根证书的精选列表。requests
库(由azure.iot.hub
内部使用)默认使用certifi
。 -
不要禁用 SSL 验证:
connection_verify=False
会使的连接易受攻击,因为它允许中间人攻击。应始终使用适当的 SSL 验证。
如果问题仍然存在:
-
检查 IoT 中心主机名: 确保的
CONNECTION_STRING
中的 IoT 中心主机名正确无误。 -
网络连接: 确认的机器可以连接到的 IoT 中心。如果是在企业网络之后,可能需要配置代理服务器或防火墙例外。
-
Python 版本和依赖关系: 请确保使用的是最新版本的
azure-iot-hub
库。可以使用pip install --upgrade azure-iot-hub
进行更新。
其他提示:
-
错误处理:
的
try...except
块做得很好。考虑添加更具体的异常处理以获得更好的调试体验。 - 日志记录: 为了进行更深入的故障排除,请使用 Python 的日志记录模块来记录调试信息。
如果已尝试以上步骤并且仍然遇到问题,请提供以下信息,以便我可以更好地帮助:
- 的操作系统和 Python 版本
- 是否使用任何代理服务器或公司防火墙?
- 是否可以连接到其他使用 SSL 的服务?