gpt4 book ai didi

python-3.x - 在 azure IoT 中心上使用本地 python 创 build 备标识时出现 HTTPAPI_ERROR

转载 作者:行者123 更新时间:2023-12-03 05:03:51 26 4
gpt4 key购买 nike

我想使用我的 Azure IoT 中心中的本地计算机创建/订阅新的(模拟)设备。

我在windows7(64位)机器上使用python 3.6.4(64位)并使用spyder运行代码。

已安装的相关软件包:

  • azure-iothub-device-client (1.3.1)
  • azure-iothub-service-client (1.3.1)
  • spyder (3.2.8)

我按照这里的步骤操作:CreateDeviceIdentity.py

代码片段:

import sys
import iothub_service_client

CONNECTION_STRING = "myConnectionString"
DEVICE_ID = "pythonDevice_1"

def print_device_info(title, iothub_device):
print ( title + ":" )
print ( "iothubDevice.deviceId = {0}".format(iothub_device.deviceId) )
print ( "iothubDevice.primaryKey = {0}".format(iothub_device.primaryKey) )
print ( "iothubDevice.secondaryKey = {0}".format(iothub_device.secondaryKey) )
print ( "iothubDevice.connectionState = {0}".format(iothub_device.connectionState) )
print ( "iothubDevice.status = {0}".format(iothub_device.status) )
print ( "iothubDevice.lastActivityTime = {0}".format(iothub_device.lastActivityTime) )
print ( "iothubDevice.cloudToDeviceMessageCount = {0}".format(iothub_device.cloudToDeviceMessageCount) )
print ( "iothubDevice.isManaged = {0}".format(iothub_device.isManaged) )
print ( "iothubDevice.authMethod = {0}".format(iothub_device.authMethod) )
print ( "" )

#def iothub_createdevice():
try:
iothub_registry_manager = iothub_service_client.IoTHubRegistryManager(CONNECTION_STRING)
primary_key = ""
secondary_key = ""
auth_method = iothub_service_client.IoTHubRegistryManagerAuthMethod.SHARED_PRIVATE_KEY
new_device = iothub_registry_manager.create_device(DEVICE_ID, primary_key, secondary_key, auth_method)
print_device_info("CreateDevice", new_device)

except iothub_service_client.IoTHubError as iothub_error:
print ( "Unexpected error {0}".format(iothub_error) )
#return
except KeyboardInterrupt:
print ( "iothub_createdevice stopped" )


'''
if __name__ == '__main__':
print ( "" )
print ( "Python {0}".format(sys.version) )
print ( "Creating device using the Azure IoT Hub Service SDK for Python" )
print ( "" )
print ( " Connection string = {0}".format(CONNECTION_STRING) )
print ( " Device ID = {0}".format(DEVICE_ID) )

iothub_createdevice()
'''

如果我运行此代码,我总是会收到错误:

Unexpected error IoTHubRegistryManager.create_device, IoTHubRegistryManagerResult.HTTPAPI_ERROR

我在 inet 的几个页面上发现了这个(或类似的)错误,但从未找到有效的解决方案。微软文档 1 中的其他代码示例(SimulatedDevice.py)工作正常。

插件:通过命令行运行脚本时也可能会重现该错误。完整的错误日志:

Error: Time:Thu Apr 5 08:59:55 2018 File:C:\release\iot-sdks-internals\release\python\automation\az iotsdk_pytools\src\c\c-utility\adapters\httpapi_winhttp.c Func:HTTPAPI_Init Line:142 WinHttpOpen failed.

Error: Time:Thu Apr 5 08:59:55 2018 File:C:\release\iot-sdks-internals\release\python\automation\aziotsdk_pytools\src\c\c-utility\adapters\httpapi_winhttp.c Func:HTTPAPI_Init Line:142 GetLastError: Falscher Parameter.

Error: Time:Thu Apr 5 08:59:55 2018 File:C:\release\iot-sdks-internals\release\python\automation\aziotsdk_pytools\src\c\c-utility\src\httpapiex.c Func:HTTPAPIEX_ExecuteRequest Line:475 unable to recover sending to a working state

Error: Time:Thu Apr 5 08:59:55 2018 File:C:\release\iot-sdks-internals\release\python\automation\az iotsdk_pytools\src\c\iothub_service_client\src\iothub_registrymanager.c Func:sendHttpRequestCRUD Line:982 HTTPAPIEX_SAS_ExecuteRequest failed Unexpected error IoTHubRegistryManager.create_device, IoTHubRegistryManagerResult.HTTPAPI_ERROR

最佳答案

这已经很旧了,但我不断遇到类似的事情,并想分享一些我找到的解决方案。

我在最新的 pip 安装(1.4.5)和 python3.7 中遇到了同样的问题,并将其诊断为不正确的 openssl/curl 库。我通过自己编译 Azure IOTHub Python SDK 解决了这个问题,该 SDK 为设备和服务客户​​端创建 .so 文件,您可以将这些文件放在 Python 文件旁边的代码目录中。

这是我追踪它的方法:

  1. 使用 pip 查找模块的目录:

    pip3 show azure-iothub-service-client
  2. 这将我指向/usr/local/lib/python3.7/site-packages。下面是导入使用的文件夹 -/iothub_service_client。我使用 Apple 的“otool”实用程序列出服务客户端调用的库(这可以在 Linux 上使用“ldd”完成):

    otool -L /usr/local/lib/python3.7/site-packages/iothub_service_client/iothub_service_client.so
  3. 这表明该库正在使用 MacOSX 附带的 libcurl:

    /usr/local/lib/python3.7/site-packages/iothub_service_client/iothub_service_client.so:
    @rpath/iothub_service_client.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/opt/boost-python3/lib/libboost_python37-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/Python (compatibility version 3.7.0, current version 3.7.0)
    /usr/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 9.0.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1452.23.0)
    /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork (compatibility version 1.0.0, current version 897.15.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1452.23.0)

我记得关于新的基于 MacOS LibreSSL 的curl 不适用于 MSFT 客户端,即使我在 DYLD_LIBRARY_PATH 环境变量中设置了安装了brew的curl库目录,我还是决定编译iothub服务和设备客户端我自己看看它是否解决了问题。我基本上遵循了https://github.com/Azure/azure-iot-sdk-python/blob/master/doc/python-devbox-setup.md上的建议。 .

为了确保成功编译,我做了一些额外的事情:

  1. 首先,使用brew info <package>获取curl和openssl的brew信息
  2. Brew 版本的curl 和openssl 已经在我的路径中了。编译不需要它们,但由于针对curl和openssl的版本检查,我的其他安装脚本失败了,因此暂存脚本可能需要它们。 brew info为您提供将它们放入您的路径所需的命令。它会是这样的:

    echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
    echo 'export PATH="/usr/local/opt/curl/bin:$PATH"' >> ~/.bash_profile
  3. 确保构建将使用您的库并包含curl和openssl:

    export LDFLAGS="-L/usr/local/opt/curl/lib -L/usr/local/opt/openssl/lib"
    export CPPFLAGS="-I/usr/local/opt/curl/include -I/usr/local/opt/openssl/include"
  4. 由于这些 SDK 使用 Boost,因此您需要正确安装它。我终于找到了为 python3 安装 boost 和 boost-python 的正确命令,而无需安装 python2 并拖入大量额外的东西:

    brew install boost-python3 --with-python3 --without-python

一旦一切顺利,您应该能够毫无问题地编译客户端。最新版本的 SDK 支持 Python 3.7,一年来第一次,我第一次编译就没有错误。 :D

关于python-3.x - 在 azure IoT 中心上使用本地 python 创 build 备标识时出现 HTTPAPI_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49625315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com