理解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
- 设备端是
mqtt
,amqp
或者 +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
设备上处理直接方法
设备上可以通过协议MQTT
和AMQP
协议来处理。
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,通过后端方法调用传入的。