Skip to main content

理解Azure IoT Hub的直接方法调用

分类:  Azure物联网 标签:  #Azure #IoT Hub # 发布于: 2023-06-12 21:39:23

Azure IoT Hub可以从云直接调用设备的方法,这个方法就叫直接方法,该方法的是类似于HTTP的请求,属于应答式的请求,而且要求设备在过期时间范围内应答,否则就会失败。直接方法的应用场景适合于和单个或者少量设备进行交互的场景。

每个直接方法的对象都是单个的设备,如果计划一次性操作大量的设备,那么考虑使用Schedule Job, 它主要可用于:

  • 多个设备上调用直接方法。
  • 规划在掉线设备上线后调用方法。

直接方法的生命周期

直接方法的实际应用是在设备上实现的,设备可以以方法playload的形式接受参数输入。用户一般从service SDK或者是service侧开始调用设备的直接方法,如果使用rest api, service侧的URI是{iot hub}/twins/{device id}/methods/, 设备通过MQTT协议从TOPIC:iothub/methods/POST/{method name}/接受请求。(如果是AMQP协议,则使用link:IoThub-methodname and IoThub-status ), 需要注意的是playload中只能使用US-ASCII字符。

直接方法是同步方法(注意所有的SDK关于同步的实现), 在设定的超时时间内,要么失败,好么成功。注意默认超时时间是30秒,可设置的值是从5秒到300秒之间。

直接方法使用的协议是:

  • Service端是HTTPS
  • 设备端是mqttamqp或者 + Websocket

playload一定是一个json对象,最大大小是128KB

从后端应用上调用直接方法

后端应用是通过HTTPS来通过IoT Hub发起直接方法调用的,如果不使用SDK,可以直接调用reset api:

https://fully-qualified-iothubname.azure-devices.net/twins/{deviceId}/methods?api-version=2018-06-30

该rest api必须使用post来调用,传入body进行调用:

{
    "methodName": "reboot",
    "responseTimeoutInSeconds": 200,
    "payload": {
        "input1": "someInput",
        "input2": "anotherInput"
    }
}

我们可以使用curl来调用:

curl -X POST \
  https://<iothubName>.azure-devices.net/twins/<deviceId>/methods?api-version=2018-06-30 \
  -H 'Authorization: SharedAccessSignature sr=iothubname.azure-devices.net&sig=x&se=x&skn=iothubowner' \
  -H 'Content-Type: application/json' \
  -d '{
    "methodName": "reboot",
    "responseTimeoutInSeconds": 200,
    "payload": {
        "input1": "someInput",
        "input2": "anotherInput"
    }
}'

认证只需要SAS Key就可以了。

如果是在IoT Edge module上运行直接方法:

https://<iothubName>.azure-devices.net/twins/<deviceId>/modules/<moduleName>/methods?api-version=2018-06-30

Response

后端应用会接收到一个回复,主要的回复包括如下的字段:

  • HTTP状态码

    • 200 表示运行成功
    • 404 表示,给出的设备id不合法,或者设备不在线。
    • 504 表示gateway和设备之间的联系超时。
  • 头里包括ETAG, Request Id, Content Type, Content Encoding.

  • Json格式的消息体:

    {
    "status" : 201,
    "payload" : {...}
    }
    

注意这里的body和body里面的status都是由设备提供,实现自己的逻辑的。

也可以在IoT Edge Module上调用直接方法,用法一样,但是要提供module id

设备上处理直接方法

设备上可以通过协议MQTTAMQP协议来处理。

MQTT

通过MQTT的topic iothub/methods/POST/{method name}/?$rid={request id} 来接受直接方法的调用。方法收到的方法体:

{
    "input1": "someInput",
    "input2": "anotherInput"
}

注意
方法的请求QoS被设置为了0, 也就是说最多发送一次。不保证请求一定到达设备。

Response

设备送回复到topic: iothub/methods/res/{status}/?$rid={request id}

  • status属性由设备提供状态
  • $rid属性是request id,通过后端方法调用传入的。