Azure IoT C SDK 中连接状态的语义
Semantic of Connection Status in the Azure IoT C SDK
我正在尝试了解 Azure IoT C SDK 的具体连接和错误状态。
我可以在 IoTHubClient_SetConnectionStatusCallback
注册回调,以便接收 IOTHUB_CLIENT_CONNECTION_STATUS
和 IOTHUB_CLIENT_CONNECTION_STATUS_REASON
。
第一个的值是 IOTHUB_CLIENT_CONNECTION_AUTHENTICATED
和 IOTHUB_CLIENT_CONNECTION_UNAUTHENTICATED
,我认为这只是表示 "connected" 和 "not connected"。然而原因更有趣:
IOTHUB_CLIENT_CONNECTION_EXPIRED_SAS_TOKEN
IOTHUB_CLIENT_CONNECTION_DEVICE_DISABLED
IOTHUB_CLIENT_CONNECTION_BAD_CREDENTIAL
IOTHUB_CLIENT_CONNECTION_RETRY_EXPIRED
IOTHUB_CLIENT_CONNECTION_NO_NETWORK
IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR
IOTHUB_CLIENT_CONNECTION_OK
所以我的第一个问题是:各自原因的语义是什么?它们什么时候发生?通信错误意味着什么?该错误非常普遍,可能只是表示 "any error we didn't want to specify explicitely".
我的第二个问题不止于此。我正在尝试使用 X.509 证书。但是,由于某些要求,我可能拥有不再有效或已删除设备 ID 的证书。我可以使用可用的原因以某种方式区分这些情况吗?当我尝试连接一个不存在的 Id 时,我只是得到 IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR
。从我的角度来看,我不再需要尝试连接到 IoT 中心,因为我的设备不存在。但是通信错误可能是任何事情。当我尝试连接无效的证书或私钥时出现同样的问题。
每次我尝试都会得到错误:
Error: Time:Thu May 25 12:04:00 2017 File:~/azure-iot-sdk-c/iothub_client/src/iothubtransport_amqp_messenger.c Func:process_state_changes Line:1563 messagesender reported unexpected state 4 while messenger is starting
Error: Time:Thu May 25 12:04:00 2017 File:~/azure-iot-sdk-c/iothub_client/src/iothubtransport_amqp_device.c Func:device_do_work Line:848 Device 'MyDevice' messenger failed to be started (messenger got into error state)
根据这些信息我无法确定何时连接或重新连接。
感谢您的提问。
您上面列出的原因是由以下条件触发的:
IOTHUB_CLIENT_CONNECTION_EXPIRED_SAS_TOKEN
- SAS 令牌(由用户提供)已过期,不能再用于根据 Azure IoT 中心对设备进行身份验证。解决方案:提供新的有效 SAS 令牌。
IOTHUB_CLIENT_CONNECTION_DEVICE_DISABLED
- 设备无法通过身份验证,因为它已被 Azure IoT 中心的用户禁用(请参阅设备资源管理器中的字段状态)
IOTHUB_CLIENT_CONNECTION_BAD_CREDENTIAL
- 根据 Azure IoT 中心在尝试验证时的响应,用户提供的设备密钥被视为无效
IOTHUB_CLIENT_CONNECTION_RETRY_EXPIRED
- Azure IoT 中心客户端有一个称为 RetryPolicy 的功能(可以使用 IotHubClient_SetRetryPolicy 设置)。它有一个 属性 限制客户端在发生故障时可以尝试重新连接的最长时间。如果达到该最长时间,将调用连接状态,状态为 UNAUTHENTICATED,原因为 RETRY_EXPIRED.
IOTHUB_CLIENT_CONNECTION_NO_NETWORK
IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR
- 如果禁用重试策略,可能会提供这些错误原因以指示存在网络连接问题。
IOTHUB_CLIENT_CONNECTION_OK
- 已提供状态 AUTHENTICATED。
我正在尝试了解 Azure IoT C SDK 的具体连接和错误状态。
我可以在 IoTHubClient_SetConnectionStatusCallback
注册回调,以便接收 IOTHUB_CLIENT_CONNECTION_STATUS
和 IOTHUB_CLIENT_CONNECTION_STATUS_REASON
。
第一个的值是 IOTHUB_CLIENT_CONNECTION_AUTHENTICATED
和 IOTHUB_CLIENT_CONNECTION_UNAUTHENTICATED
,我认为这只是表示 "connected" 和 "not connected"。然而原因更有趣:
IOTHUB_CLIENT_CONNECTION_EXPIRED_SAS_TOKEN
IOTHUB_CLIENT_CONNECTION_DEVICE_DISABLED
IOTHUB_CLIENT_CONNECTION_BAD_CREDENTIAL
IOTHUB_CLIENT_CONNECTION_RETRY_EXPIRED
IOTHUB_CLIENT_CONNECTION_NO_NETWORK
IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR
IOTHUB_CLIENT_CONNECTION_OK
所以我的第一个问题是:各自原因的语义是什么?它们什么时候发生?通信错误意味着什么?该错误非常普遍,可能只是表示 "any error we didn't want to specify explicitely".
我的第二个问题不止于此。我正在尝试使用 X.509 证书。但是,由于某些要求,我可能拥有不再有效或已删除设备 ID 的证书。我可以使用可用的原因以某种方式区分这些情况吗?当我尝试连接一个不存在的 Id 时,我只是得到 IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR
。从我的角度来看,我不再需要尝试连接到 IoT 中心,因为我的设备不存在。但是通信错误可能是任何事情。当我尝试连接无效的证书或私钥时出现同样的问题。
每次我尝试都会得到错误:
Error: Time:Thu May 25 12:04:00 2017 File:~/azure-iot-sdk-c/iothub_client/src/iothubtransport_amqp_messenger.c Func:process_state_changes Line:1563 messagesender reported unexpected state 4 while messenger is starting
Error: Time:Thu May 25 12:04:00 2017 File:~/azure-iot-sdk-c/iothub_client/src/iothubtransport_amqp_device.c Func:device_do_work Line:848 Device 'MyDevice' messenger failed to be started (messenger got into error state)
根据这些信息我无法确定何时连接或重新连接。
感谢您的提问。
您上面列出的原因是由以下条件触发的:
IOTHUB_CLIENT_CONNECTION_EXPIRED_SAS_TOKEN
- SAS 令牌(由用户提供)已过期,不能再用于根据 Azure IoT 中心对设备进行身份验证。解决方案:提供新的有效 SAS 令牌。
IOTHUB_CLIENT_CONNECTION_DEVICE_DISABLED
- 设备无法通过身份验证,因为它已被 Azure IoT 中心的用户禁用(请参阅设备资源管理器中的字段状态)
IOTHUB_CLIENT_CONNECTION_BAD_CREDENTIAL
- 根据 Azure IoT 中心在尝试验证时的响应,用户提供的设备密钥被视为无效
IOTHUB_CLIENT_CONNECTION_RETRY_EXPIRED
- Azure IoT 中心客户端有一个称为 RetryPolicy 的功能(可以使用 IotHubClient_SetRetryPolicy 设置)。它有一个 属性 限制客户端在发生故障时可以尝试重新连接的最长时间。如果达到该最长时间,将调用连接状态,状态为 UNAUTHENTICATED,原因为 RETRY_EXPIRED.
IOTHUB_CLIENT_CONNECTION_NO_NETWORK IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR
- 如果禁用重试策略,可能会提供这些错误原因以指示存在网络连接问题。
IOTHUB_CLIENT_CONNECTION_OK
- 已提供状态 AUTHENTICATED。