
# 结合函数服务通过自定义策略发放证书认证的设备
#### 场景说明
本文以MQTT.fx的设备模拟器替代真实的设备，结合[函数工作流服务（FunctionGraph）](https://www.huaweicloud.com/product/functiongraph.html)，带您快速体验结合函数服务使用设备发放服务，通过自定义策略将设备发放到指定的物联网平台（设备接入实例）上。
#### 整体流程
使用证书认证的设备采用自定义策略发放设备操作流程如下图所示。
![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001193800725.png "点击放大")
通过自定义策略发放设备功能流程图如下图所示。
![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001148000920.png "点击放大")
#### 函数开发
自定义策略的函数代码编写指南参见[创建自定义策略函数](https://support.huaweicloud.com/usermanual-iotps/iot_01_0005.html)。
此处以Java语言为例，如何编写Java语言的函数，参见[函数工作流 FunctionGraph \> 开发指南\> 如何开发函数\> Java函数开发指南](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0430.html)。
1. 创建函数工程，编写函数。 
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001147841128.png "点击放大")
   关键流程代码参考如下：
   ```
   package com.huawei.demo;
    
   import com.huawei.demo.common.logger.DefaultLogger;
   import com.huawei.demo.model.AccessPointPara;
   import com.huawei.demo.model.FunctionGraphPara;
   import com.huawei.demo.model.TdpFuncResult;
   import com.huawei.services.runtime.Context;
    
   import java.util.Optional;
    
   /**
    * 实现该抽象类。
    * WARNING：{@link #apiHandle(FunctionGraphPara, Context)} 该方法必须在子类中定义，否则函数无法触发该函数接口！！！
    * <pre>
    * {@code
    *     @Override
    *     public TdpFuncResult apiHandle(FunctionGraphPara para, Context context) {
    *         return super.apiHandle(para, context);
    *     }
    * }
    * </pre>
    */
   public abstract class TdpFunction {
       protected static final DefaultLogger LOGGER = new DefaultLogger(TdpFunction.class);
    
       /**
        * 函数定义
        */
       public TdpFuncResult apiHandle(FunctionGraphPara para, Context context) {
           // 获取日志
           DefaultLogger.init(Optional.ofNullable(context)
               .map(Context::getLogger)
               .orElse(null));
    
           // 校验入参
           TdpFuncResult result = checkPara(para, context);
           if (result != null) {
               return result;
           }
    
           // 确定接入点
           AccessPointPara accessPointPara = determineAccessPoint(para);
    
           // 发放设备
           result = provisionDevice(para, accessPointPara);
    
           LOGGER.info("result:{}", result);
           return result;
       }
    
       /**
        * 校验入参
        */
       protected abstract TdpFuncResult checkPara(FunctionGraphPara para, Context context);
    
       /**
        * 从备选的接入点中选择合适的接入点
        */
       protected abstract AccessPointPara determineAccessPoint(FunctionGraphPara para);
    
       /**
        * 调用设备发放的发放接口发放设备
        */
       protected abstract TdpFuncResult provisionDevice(FunctionGraphPara para, AccessPointPara accessPointPara);
   }
   ```
   
   
2. 打包函数，上传代码。 
   如不依赖第三方Jar包，可将工程打包成一个单独的Jar包，如下图所示。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001193880849.png "点击放大")
   如工程依赖第三方Jar包，则需将工程Jar包和所有第三方Jar包打包成一个zip包，如下图所示。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001193800727.png "点击放大")
   进入函数工作流服务控制台，创建函数。函数执行入口以\[包名\].\[类名\].\[执行函数名\]格式填写。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001148000922.png "点击放大")
   
   
3. 配置测试事件，调试函数。 
   创建并配置测试事件，调试函数，如下图所示。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001147841130.png "点击放大")
   
   
 
#### 控制台开发
登录[设备发放控制台](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/iotps/home)。
1. 进入"[证书](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/iotps/cert-list)"界面，上传并验证设备CA证书。
   
   如何上传并验证证书参见[证书](https://support.huaweicloud.com/usermanual-iotps/iot_01_0002.html) 。
   图1证书列表   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001836109829.png "点击放大")
   
   
2. 进入"[策略](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/iotps/strategy)"界面，添加自定义策略。
   
   如何添加自定义策略实例参见[添加自定义策略实例](https://support.huaweicloud.com/usermanual-iotps/iot_01_0006.html)。
   图2添加自定义策略   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001836144161.png "点击放大")
   
   
3. 进入"[设备](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/iotps/device)"界面，单击左上角"注册设备"，进行注册设备。
   
   如何注册设备，参见[设备](https://support.huaweicloud.com/usermanual-iotps/iot_01_0008.html) 。
   图3注册设备   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001789384946.png "点击放大")
   图4创建证书模式自定义策略设备   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001836107589.png "点击放大")
   
   
 
#### 设备触发放流程
1. 配置连接参数。 
   证书认证设备如何使用MQTT.fx接入设备发放请参见[MQTT X509证书认证接入示例](https://support.huaweicloud.com/qs-iotps/iot_03_0007.html)。
   **MQTT Broker Profile Settings**
   Broker Address填写设备发放设备侧接入地址，Broker Port填写设备发放设备侧接入端口，Client ID按规则（\[设备ID\]_0_0_\[10位日期时间\]）填写，具体规则参见[MQTT CONNECT连接鉴权](https://support.huaweicloud.com/qs-iotps/iot_03_0003.html)。
   **SSL/TLS**
   由于设备使用证书认证方式，"Enable SSL/TLS"勾选开启，选择Self signed certificates，CA File填写用于签发设备发放设备侧接入SSL/TLS通道证书的CA证书路径，Client Certificate File和Client Key File填写使用已上传并验证了的CA证书签发的设备证书和设备证书私钥路径。如证书为PEM格式，请勾选"PEM Formatted"。
   具体配置请参见下图：
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001193880853.png "点击放大")
   "User Credentials"的"User Name"字段填写设备ID。具体配置参见下图：
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001193800731.png "点击放大")
   
   
2. 连接鉴权。 
   连接参数配置完成后，单击"Connnect"。若右上角圆圈呈现绿色，说明设备已成功上设备发放平台。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001148000926.png "点击放大")
   
   
3. 订阅接收引导消息Topic。 
   参照[设备接收引导信息](https://support.huaweicloud.com/qs-iotps/iot_03_0005.html)填写用于接收引导地址的Topic，单击"Subscribe"订阅该Topic。若订阅Topic填写框下方的已订阅Topic列表中存在该Topic，则订阅成功。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001147841134.png "点击放大")
   
   
4. 发送请求引导消息。 
   参照[设备请求引导消息](https://support.huaweicloud.com/qs-iotps/iot_03_0004.html)填写发送请求引导消息的Topic，单击"Publish"向该Topic推送消息。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001193880855.png "点击放大")
   查看订阅的Topic，很快在订阅Topic下，接收到了目的接入点的设备侧接入地址。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001193800733.png "点击放大")
   进入函数服务控制台，通过查看使用的函数的日志，可看出自定义策略发放设备过程中，该函数被成功触发且正确执行。
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001148000928.png "点击放大")
   进入到设备发放控制台，可查看到一条该设备的发放记录。
   图5设备详情页   
   ![](https://support.huaweicloud.com/bestpractice-iotps/figure/zh-cn_image_0000001789348080.png "点击放大")
   至此，您已成功完成了，使用设备发放和函数服务将证书认证的设备通过自定义策略触发函数将设备发放到指定的设备接入实例中。
   
   
 
