Azure IoT C SDK中连接状态的语义

时间:2017-05-25 10:09:15

标签: c iot azure-iot-hub

我正在尝试了解Azure IoT C SDK的特定连接和错误状态。

我可以注册IoTHubClient_SetConnectionStatusCallback进行回调,以便接收IOTHUB_CLIENT_CONNECTION_STATUSIOTHUB_CLIENT_CONNECTION_STATUS_REASON

第一个的值是IOTHUB_CLIENT_CONNECTION_AUTHENTICATEDIOTHUB_CLIENT_CONNECTION_UNAUTHENTICATED,我认为这仅仅意味着"已连接"并且"没有连接"。原因更有趣:

  • 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

所以我的第一个问题是:各个原因的语义是什么?它们什么时候发生?沟通错误需要什么?错误是如此通用,它可能只是意味着"我们没有明确指出任何错误"。

我的第二个问题超出了这个范围。我正在尝试使用X.509证书。但是,由于某些要求,我可能拥有不再有效的证书或已删除的设备ID。我可以通过使用可用的原因以某种方式区分这些案例吗?当我尝试连接不存在的Id时,我只得到了IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR。从我的角度来看,我不再需要尝试连接到IoT Hub,因为我的设备不存在。但是沟通错误可能是任何事情。当我尝试连接无效的证书或私钥时,出现了同样的问题。

每次尝试我都会得到错误:

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)

根据这些信息,我无法确定何时连接或重新连接。

1 个答案:

答案 0 :(得分:4)

感谢您的提问。

上面列出的原因是由以下条件触发的:

IOTHUB_CLIENT_CONNECTION_EXPIRED_SAS_TOKEN

  • SAS令牌(由用户提供)已过期,不再可用于针对Azure IoT Hub对设备进行身份验证。解决方案:提供新的有效SAS令牌。

IOTHUB_CLIENT_CONNECTION_DEVICE_DISABLED

  • 无法对设备进行身份验证,因为Azure IoT Hub上的用户已禁用该设备(请参阅设备资源管理器中的字段状态)

IOTHUB_CLIENT_CONNECTION_BAD_CREDENTIAL

  • 根据Azure IoT Hub在尝试进行身份验证时的响应,用户提供的设备密钥被视为无效

IOTHUB_CLIENT_CONNECTION_RETRY_EXPIRED

  • Azure IoT Hub Client具有一个名为RetryPolicy的功能(可以使用IotHubClient_SetRetryPolicy进行设置)。它具有一个属性,可以限制客户端在发生故障时尝试重新连接的最长时间。如果达到该最大时间,则调用连接状态,状态为UNAUTHENTICATED,并且原因为RETRY_EXPIRED。

IOTHUB_CLIENT_CONNECTION_NO_NETWORK IOTHUB_CLIENT_CONNECTION_COMMUNICATION_ERROR

  • 如果禁用了重试策略,则可能会提供这些错误原因以指示存在网络连接问题。

IOTHUB_CLIENT_CONNECTION_OK

  • 提供状态AUTHENTICATED。