FunctionGraph开发说明
概述
物联网平台支持使用FunctionGraph编解码的功能,根据您提交的脚本文件,实现设备二进制格式与JSON格式相互转换。常在设备能力比较弱,只能上报简单的二进制数据的设备场景下使用。FunctionGraph的函数托管计算服务支持Node.js、Python、Java、Go、C#、PHP、Cangjie和定制运行时语言,可以满足多种开发需求;具有实时查看运行日志、查看图形化监控等功能,大大的提高了开发者开发、调试效率。

- FunctionGraph是一项基于事件驱动的函数托管计算服务。使用FunctionGraph函数,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。
- FunctionGraph的收费标准可见:FunctionGraph函数工作流计费概述。此外,FunctionGraph按函数实际执行资源计费,不执行不产生费用。

下面将讲述数据转换格式及其原理,您可以根据您接入协议选择对应示例代码直接进行IoTDA接入实践(推荐):
使用流程
- 创建产品:在IoTDA创建一个CoAP协议或MQTT协议的产品及设备。具体说明可见:创建产品。
- 访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。
- 单击左侧导航栏“产品”,单击页面左侧的“创建产品”。根据页面提示填写参数,然后单击“确定”,完成产品的创建。
- 编写FunctionGraph插件:
- 创建函数方法可见:FunctionGraph创建函数。需要注意的是,创建的事件函数要与在IoTDA中创建的产品局点一致,否则无法被产品引用,局点可在控制台左上方知晓。
图2 FunctionGraph开发-局点查看
- 编写编解码插件:FunctionGraph支持多种运行时语言,包括Python 、Node.js、Java、Go、C#、PHP、Cangjie及定制运行时等,不同语言所支持的版本有所差异。具体使用说明可见:FunctionGraph编程语言说明及开发指导。
- 创建函数方法可见:FunctionGraph创建函数。需要注意的是,创建的事件函数要与在IoTDA中创建的产品局点一致,否则无法被产品引用,局点可在控制台左上方知晓。
- 部署FunctionGraph插件:
IoTDA+FunctionGraph通信说明(API)
- 当上报数据为二进制数据时,IoTDA会自动将数据data进行Base64编码,在IoTDA内部以Base64编码后的数据格式存储。例如:设备上报数据[0x01, 0x02],在IoTDA中存储的数据为“AQI=”。
- IoTDA接收到数据后,若存在编解码插件,将会把数据以特定格式传输到FunctionGraph。参数及数据格式(固定格式A)为:
表1 上行数据格式 字段名
必选/可选
类型
参数描述
codecType
必选
String
参数解释:
编解码类型。decode为上行解码(二进制流转换为JSON格式);encode为下行编码(JSON格式转换为二进制流)
message
必选
String
参数解释:
是JSON格式转换成的字符串数据,其中包含topic和payload两个参数。
- topic:当为MQTT协议时,会携带上报的Topic;当为CoAP协议时,值为null。
- payload:设备上报数据的Base64编码后数据(若为MQTT协议,可在产品选择编码格式)。
IoTDA发送给FunctionGraph解码请求示例(CoAP):{ "codecType": "decode", "message": "{\"topic\": null,\"payload\": \"AABQAFo=\"}" }
IoTDA发送给FunctionGraph解码请求示例(MQTT):
{ "codecType": "decode", "message": "{\"topic\": \"$oc/devices/661f99d6da14e268414f0af6_longsj123/sys/properties/report\",\"payload\": \"AABQAFo=\"}" }
- 经过FunctionGraph解码后,返回编解码结果。其发送给平台(IoTDA)的数据格式及参数(固定格式B)为:
表2 下行数据格式 字段名
必选/可选
类型
参数描述
status
必选
String
参数解释:
标识编解码的执行结果,200表示成功,其他表示设备执行结果为失败。
message
必选
String
参数解释:
用于解码数据(二进制流解码为JSON格式),为JSON格式转换成的字符串。
FunctionGraph发送给IoTDA的解码请求示例:{ "status": 200, "message": "{\"msg_type\":\"properties_report\",\"services\":[{\"service_id\":\"smokerdector\",\"properties\":{\"level\":258,\"temperature\":3.4}}]}" }
- 当平台或应用侧进行数据下发时,IoTDA会下发JSON格式的数据,需要经过编解码功能把JSON格式数据转换为二进制码流再进行数据下发。
- IoTDA下发数据前,若存在编解码插件,将会把数据以特定格式传输到FunctionGraph。传输到FunctionGraph的数据格式及参数(固定格式A)为:
表3 上行数据格式 字段名
必选/可选
类型
参数描述
codecType
必选
String
参数解释:
编解码类型。decode为上行解码(二进制流转换为JSON格式);encode为下行编码(JSON格式转换为二进制流)
message
必选
String
参数解释:
是JSON格式转换成的字符串数据。
IoTDA发送给FunctionGraph编码请求示例:{ "codecType": "encode", "message": "{\"msg_type\":\"commands\",\"service_id\": \"smokerdector\",\"paras\": {\"value\": 1},\"command_name\": \"SET_ALARM\",\"hasMore\": 0,\"request_id\": 1}" }
- 经过FunctionGraph解码后,返回编码结果。其发送给平台(IoTDA)的数据格式及参数(固定格式C)为:
表4 下行数据格式 字段名
必选/可选
类型
参数描述
status
必选
String
参数解释:
标识编解码的执行结果,200表示成功,其他表示失败。
message
必选
String
参数解释:
是JSON格式转换成的字符串数据,其中包含payload参数。
- payload:FunctionGraph解码后的byte[]数据。
FunctionGraph发送给IoTDA的编码码请求示例:{ "status": 200, "message": "{\"payload\":[2,1,0,0,1]}" }
- 经过编解码插件后,平台将返回给设备二进制流数据。比如说:[2,1,0,0,1]。
IoTDA物模型数据格式
编解码 |
数据类型 |
msg_type |
支持协议 |
说明 |
---|---|---|---|---|
解码 (二进制码流转换成JSON格式数据) |
设备属性上报 |
properties_report |
ALL |
|
设备返回命令响应 |
command_response |
ALL |
||
设备返回平台设置设备属性响应 |
properties_set_response |
MQTT/MQTTS |
||
设备返回平台查询设备属性响应 |
properties_get_response |
MQTT/MQTTS |
||
设备消息上报 |
message_up |
MQTT/MQTTS |
||
编码 (JSON格式转换成二进制码流) |
平台命令下发 |
commands |
ALL |
|
平台响应设备属性上报 |
properties_report_reply |
NB-IoT(CoAP) |
||
平台设置设备属性 |
properties_set |
MQTT/MQTTS |
||
平台查询设备属性 |
properties_get |
MQTT/MQTTS |
||
平台消息下发 |
messages |
MQTT/MQTTS |
{ "status": 200, "message": "${解码后的JSON数据格式}" }
其中${解码后的JSON数据格式},为平台对FunctionGraph解析后要求的JSON格式,其要求的数据格式为:
- 设备属性上报
1 2 3 4 5 6 7 8 9 10
{ "msg_type": "properties_report", "services": [{ "service_id": "Battery", "properties": { "batteryLevel": 57 }, "event_time": "20151212T121212Z" }] }
表6 设备属性上报数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
属性上报的消息类型,固定为:properties_report。
services
必选
List<ServiceProperty>
设备服务数据列表(具体结构参考下表ServiceProperty定义表)。
表7 ServiceProperty结构定义 字段名
必选/可选
类型
参数描述
service_id
必选
String
设备的服务ID。
properties
必选
Object
设备服务的属性列表,具体字段在设备关联的产品模型中定义。
event_time
可选
String
设备采集数据UTC时间(格式:yyyyMMddTHHmmssZ),如:20161219T114920Z。
设备上报数据不带该参数或参数格式错误时,则数据上报时间以平台时间为准。
- 平台设置设备属性的响应消息
1 2 3 4 5 6
{ "msg_type": "properties_set_response", "request_id": "42aa08ea-84c1-4025-a7b2-c1f6efe547c2", "result_code": 0, "result_desc": "success" }
表8 设备属性的响应消息数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
属性上报的消息类型,固定为:
properties_set_response
request_id
可选
String
用于唯一标识这次请求,设备侧收到的消息带该参数时,响应消息需要将该参数值返回给平台。如果解码后的消息不带该字段,则以topic中带的request_id为准。
result_code
可选
Integer
命令的执行结果,0表示成功,其他表示失败。不带默认认为成功。
result_desc
可选
String
属性设置的响应描述。
- 平台查询设备属性的响应消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14
{ "msg_type": "properties_get_response", "request_id": "42aa08ea-84c1-4025-a7b2-c1f6efe547c2", "services": [ { "service_id": "analog", "properties": { "PhV_phsA": "1", "PhV_phsB": "2" }, "event_time": "20190606T121212Z" } ] }
表9 平台查询设备属性的响应数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:properties_get_response
request_id
可选
String
用于唯一标识这次请求,设备侧收到的消息带该参数时,响应消息需要将该参数值返回给平台。如果解码后的消息不带该字段,则以topic中带的request_id为准。
services
必选
List<ServiceProperty>
设备服务数据列表(具体结构参考下表ServiceProperty定义表)。
表10 ServiceProperty结构定义 字段名
必选/可选
类型
参数描述
service_id
必选
String
设备的服务ID。
properties
必选
Object
设备服务的属性列表,具体字段在设备关联的产品模型中定义。
event_time
可选
String
设备采集数据UTC时间(格式:yyyyMMddTHHmmssZ),如:20161219T114920Z。
设备上报数据不带该参数或参数格式错误时,则数据上报时间以平台时间为准。
- 平台命令下发的响应消息
1 2 3 4 5 6 7 8 9 10
{ "msg_type": "command_response", "request_id": "42aa08ea-84c1-4025-a7b2-c1f6efe547c2", "result_code": 0, "command_name": "ON_OFF", "service_id": "WaterMeter", "paras": { "value": "1" } }
表11 平台命令下发数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:command_response
request_id
可选
String
用于唯一标识这次请求,设备侧收到的消息带该参数时,响应消息需要将该参数值返回给平台。如果解码后的消息不带该字段,则以topic中带的request_id为准。
result_code
可选
Integer
标识命令的执行结果,0表示成功,其他表示失败。不带默认认为成功。
response_name
可选
String
命令的响应名称,在设备关联的产品模型中定义。
paras
可选
Object
命令的响应参数,具体字段在设备关联的产品模型中定义。
- 设备消息上报
1 2 3 4
{ "msg_type": "message_up", "content": "hello" }
表12 设备消息上报数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:message_up
content
可选
String
消息内容。
{ "codecType": "encode", "message": "${平台发送给FunctionGraph的JSON数据格式}" }
其中${平台发送给FunctionGraph的JSON数据格式},为平台发送给FunctionGraph的编码前的JSON数据,其发送的格式为:
- 平台命令下发
1 2 3 4 5 6 7 8 9
{ "msg_type": "commands", "request_id": "42aa08ea-84c1-4025-a7b2-c1f6efe547c2", "command_name": "ON_OFF", "service_id": "WaterMeter", "paras": { "value": 1 } }
表13 设备命令下发数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:commands
request_id
必选
String
用于唯一标识这次请求,该标识会通过topic下发给设备。
service_id
可选
String
设备的服务ID。
command_name
可选
String
设备命令名称,在设备关联的产品模型中定义。
paras
可选
Object
设备命令的执行参数,具体字段在设备关联的产品模型中定义。
- 平台设置设备属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{ "msg_type": "properties_set", "request_id": "42aa08ea-84c1-4025-a7b2-c1f6efe547c2", "services": [{ "service_id": "Temperature", "properties": { "value": 57 } }, { "service_id": "Battery", "properties": { "level": 80 } } ] }
表14 平台设置设备属性数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:properties_set
request_id
必选
String
用于唯一标识这次请求,设备侧收到的消息带该参数时,响应消息需要将该参数值返回给平台。
services
必选
List<ServiceProperty>
设备服务数据列表。
ServiceProperty结构定义:
表15 ServiceProperty结构定义 字段名
必选/可选
类型
参数描述
service_id
必选
String
设备的服务ID。
properties
必选
Object
设备服务的属性列表,具体字段在产品模型里定义。
- 平台查询设备属性
1 2 3 4 5
{ "msg_type": "properties_get", "request_id": "42aa08ea-84c1-4025-a7b2-c1f6efe547c2", "service_id": "Temperature" }
表16 平台查询设备属性数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:properties_get
request_id
必选
String
用于唯一标识这次请求,该标识会通过topic下发给设备。
service_id
可选
String
设备的服务ID。
- 平台响应设备属性上报(NB-IoT设备)
1 2 3 4 5
{ "msg_type": "properties_report_reply", "request": "213355656", "result_code": 0 }
表17 平台响应设备属性上报数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:properties_report_reply
request
可选
String
属性上报的BASE64编码字符串。
result_code
可选
Integer
属性上报的执行结果。
has_more
可选
Boolean
是否存在缓存命令。
- 平台消息下发
1 2 3 4
{ "msg_type": "messages", "content": "hello" }
表18 设备消息下发数据格式 字段名
必选/可选
类型
参数描述
msg_type
必选
String
固定为:messages
content
可选
String
消息下发的内容。