# 数据转发至FunctionGraph函数工作流
#### 场景说明
对于设备上报到平台的数据，使用函数工作流FunctionGraph处理实时流数据。通过函数服务，用户只需编写业务函数代码并设置运行的条件，无需配置和管理服务器等基础设施，即可跟踪设备的设备属性、消息上报，状态变更，分析、整理和计量数据流。
本示例为将所有设备上报的属性转发至FunctionGraph函数工作流，根据设备资源空间Id的不同推送到用户Http服务器的不同路径，请您提供自行部署的Http服务器。本示例通过设备接入服务的数据转发能力来驱动事件函数，不需要额外配置触发器。
#### 构建函数工程
本例提供了设备属性上报格式转换并转发到第三方应用的源码（包含函数依赖），用户可以下载学习使用。
**创建工程**
本例使用Java语言实现设备接入属性数据流式转换功能与推送功能，有关函数开发的过程请参考FunctionGraph的[Java函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0430.html)，本例不再介绍函数工作流函数实现的代码。
[下载样例源码](https://obs-pipeline.obs.cn-north-4.myhuaweicloud.com/sdkDeploy/FunctionGraphFun.zip)，解压缩并在Idea中导入工程。代码说明可参考：[Java函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0430.html)，其中用户自己的服务器地址通过函数环境变量NA_MOCK_SERVER_ADDRESS传入。
图1样例代码说明   
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000002590384546.png "点击放大")
**打包工程**
使用Idea的Build Artifacts打包Jar，Idea配置及打包如下图所示。
图2工程Artifacts Output 配置参考   
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001573920081.png "点击放大")
图3Build Artifacts   
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000002622050031.png "点击放大")
#### 上传函数至FunctionGraph
在函数工作流工作台创建函数
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph)，在左侧导航栏选择"函数 \> 函数列表"，进入函数列表界面。
2. 单击"创建函数"，进入创建函数流程。
3. 填写函数配置信息，如下图所示。 
   选择："创建空白函数"。
   函数名称输入："IoTDA_FUNCTION_HTTPCLIENT_DEMO"。
   运行时语言选择："Java 8"。
   图4创建函数界面   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001574239625.png "点击放大")
   
   
4. 单击下方"创建函数"，完成函数创建，完成函数创建后将自动跳转到该函数详情页。
5. 在函数详情页中选择"代码"\>"上传自"\>"JAR文件"，上传程序打包文件夹中的代码包：FunctionGraphFun.jar。 
   图5上传代码界面   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001523799690.png "点击放大")
   
   
6. 修改函数运行时参数，选择"设置\>常规设置"配置函数执行入口："com.huawei.iot.function.gamma.IoTDataFlowHttpClientTrigger.funTest"，填写完成后，单击"保存"，保存配置信息。 
   图6设置函数执行入口   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001523959670.png "点击放大")
   ![](https://support.huaweicloud.com/usermanual-iothub/public_sys-resources/notice_3.0-zh-cn.png)
   函数默认内存为512MB，超时时间默认为15s，该样例仅演示功能，如需商用，请结合实际使用场景进行参数优化。
   
   
7. 修改调用函数时传递的环境变量，配置环境变量"NA_MOCK_SERVER_ADDRESS"传入函数要推送的HttpServer地址，注意示例中服务器地址非真实服务器地址，请替换成您真实的http服务器地址，填写完成后，单击"保存"，保存配置信息。 
   图7配置函数调用环境变量   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001523479838.png "点击放大")
   
   
 
#### 添加事件源
函数创建以后，可以为函数添加事件源，本例通过配置Http推送测试事件，模拟IoT数据转发过来的设备数据，步骤如下。
1. 用户进入"IoTDA_FUNCTION_HTTPCLIENT_DEMO"函数详情页，选择"代码"\>"配置测试事件"，弹出"配置测试事件"窗口。 
   图8配置测试事件   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001523639766.png "点击放大")
   
   
2. 在"配置测试事件"窗口中，输入配置信息。 
   配置测试事件选择："创建新的测试事件"。
   事件模板选择："空白模板"。
   事件名称输入："event-property"。
   设备属性上报测试参数示例如下：
   ```
   {
       "resource":"device.property",
       "event":"report",
       "event_time":"string",
       "notify_data":{
           "header":{
               "app_id":"********",
               "device_id":"********",
               "node_id":"ABC123456789",
               "product_id":"ABC123456789",
               "gateway_id":"********",
               "tags":[{
                       "tag_key":"testTagName",
                       "tag_value":"testTagValue"
                }]
           },
           "body":{
               "services":[{
                       "service_id":"string",
                       "properties":{
                       },
                       "event_time":"string"
                }]
           }
       }
   }
   ```
   图9配置测试事件   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001955148694.png "点击放大")
   
   
3. 单击"保存"，完成测试事件配置。
 
#### 测试数据
处理模拟数据步骤如下。
1. 用户进入函数详情页，选择"event-property"测试事件，单击"测试"，测试函数。 
   图10配置测试事件   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001573920085.png "点击放大")
   
   
2. 函数执行成功后，可在函数详情页右侧通过日志查看函数执行情况。 
   图11函数执行结果   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001991029949.png "点击放大")
   
   
 
#### 配置设备接入服务
在设备接入服务中设置数据转发规则，实现当设备上报数据时将数据转发至FunctionGraph。
1. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"管理控制台"进入设备接入控制台。选择您的实例，单击实例卡片进入。
2. 在左侧导航栏选择"规则\>数据转发"，单击左上角的"创建规则"。
3. 参考下表参数说明，填写规则内容。以下参数取值仅为示例，您可参考[操作步骤](https://support.huaweicloud.com/usermanual-iothub/iot_01_0024.html#ZH-CN_TOPIC_0264671221__section1919615255459)创建自己的规则，填写完成后单击"创建规则"。
   
   
   | 参数名  | 参数说明                                 |
   |:---|:---|
   | 规则名称  | **参数说明：**自定义，如"iotda-functiongraph"。  |
   | 规则描述    | **参数说明：**自定义，如"数据转发至FunctionGraph"。 |
   | 数据来源 | **参数说明：**选择"设备属性"。                    |
   | 触发事件 | **参数说明：**自动匹配"设备属性上报"。                |
   | 资源空间  | **参数说明：**选择"所有资源空间"。                |
      
   图12新建属性上报流转规则-数据转发至FunctionGraph   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000001955182940.png "点击放大")
   
   
4. 单击"设置转发目标"页签，单击"添加"，设置转发目标，设置完成后单击"确定"按钮。 
   
   | 参数名     | 参数说明                                                              |
   |:---|:---|
   | 转发目标 | **参数说明：**选择"函数工作流(FunctionGraph)"                                |
   | 区域     | **参数说明：**函数工作流当前仅支持转发至同区域的函数工作流服务。若未授权访问此区域的服务，请根据界面提示，配置云服务访问授权。 |
   | 目标函数    | **参数说明：**选择在函数工作流创建的函数名称。                                         |
   | 版本    | **参数说明：**选择函数工作流的具体版本。                                              |
      
   图13新建转发目标-转发至FunctionGraph   
   ![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000002405647201.png "点击放大")
   
   
5. 单击"启动规则"，激活配置好的数据转发规则。
 
#### 验证操作
- 您可以使用设备接入服务中注册的真实设备接入平台，上报对应产品物模型中定义的属性参数。
- 您也可以使用模拟器模拟设备属性上报，操作方法请参考[在线开发MQTT协议的智慧路灯](https://support.huaweicloud.com/bestpractice-iothub/iot_bp_00016.html)。
期望结果：能在用户服务端日志中查看到设备上报的数据。
图14期望结果   
![](https://support.huaweicloud.com/usermanual-iothub/figure/zh-cn_image_0000002572023076.png "点击放大")
