• 沒有找到結果。

13.1 从这里开始

使用阶段 步骤

设备开发 1. 开通设备接入服务,参考开发指南,完成设备开发。

● LiteOS设备(LwM2M),设备需要具有设备发放功能。

● 原生MQTT协议设备,需要完成设备引导接口开发,使设备具有

● LiteOS设备(LwM2M):需要烧录设备发放平台接入地址、设 备标识码、引导服务端PSK。

6. 设备初次上电时,先接入到设备发放平台,随后通过Bootstrap流 程引导设备获得目标物联网平台地址。

步骤1 在浏览器中访问这里,下载并进行安装OpenSSL工具,安装完成后配置环境变量。

步骤2 在 D:\certificates 文件夹下,以管理员身份运行cmd命令行窗口。

步骤3 生成密钥对(server.key):

说明

生成“密钥对”时输入的密码在生成“证书请求文件”、“CA证书”以及“验证证书”时需要 用到,请妥善保存。

openssl genrsa -des3 -out server.key 2048

步骤4 使用密钥对生成证书请求文件:

说明

生成证书请求文件时,要求填写证书唯一标识名称(Distinguished Name,DN)信息,参数说 明如下表1 所示。

13-1

提示 参数名称 取值样例

Country Name (2 letter

code) []: 国家/地区 CN

State or Province Name

(full name) []: 省/市 GuangDong Locality Name (eg, city)

[]: 城市 ShenZhen

Organization Name (eg,

company) []: 组织机构(或公司名) Huawei Technologies Co., Ltd.

Organizational Unit

Name (eg, section) []: 机构部门 Cloud Dept.

Common Name (eg, fully

qualified host name) []: CA名称(CN) Huawei IoTDP CA Email Address []: 邮箱地址 /

A challenge password []: 证书密码,如您不设置密 码,可以直接回车

/

openssl req -new -key server.key -out server.csr

步骤5 生成CA证书(server.crt):

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

----结束

步骤3 在“上传CA证书”页面,填写“证书名称”,单击“添加文件”,上传此前“制作CA

证书”步骤中生成的“CA证书(server.crt文件)”,单击“确定”。

----结束

说明

上传的CA证书初始状态为“未验证”,需要完成“验证CA证书”过程,方可正常使用该CA证 书。

证书状态表 CA证 书状 态

说明

已验 证

可正常使用。

未验 证

不可正常使用,待验证通过后,方可正常使用。

已过

期 CA证书已过期,需更新,但不影响平台使用该CA证书验证对应的设备证 书。

即将 过期

CA证书30天内即将过期,需及时更新。

13.2.3 验证 CA 证书

对于已上传的CA证书,平台要求用户完成“验证CA证书”过程,以验证用户具备该CA 证书的签发能力。

操作步骤

步骤1 登录设备发放控制台。

步骤2 在设备发放控制台,左侧导航窗格中,选择“证书”,单击“证书列表”条目的操作 栏中的“验证证书”。

步骤3 在上传验证证书页面,单击“生成验证码”,单击“复制图标”复制此CA证书的随机 验证码。

说明

CA证书验证码有效期为一天,请及时使用验证码生成验证证书并完成验证。

验证码的生成为替换机制,即对于一个CA证书,即使此前的验证码未过期,也将被新生成的验 证码替换。

步骤4 使用OpenSSL工具为验证证书生成密钥对。

openssl genrsa -out client.key 2048

步骤5 利用此验证码生成证书请求文件CSR。

openssl req -new -key client.key -out client.csr 说明

CSR文件的Common Name (e.g. server FQDN or YOUR name) 需要填写此验证码。

步骤6 使用由CA私有密钥前面的CSR创建私有的验证证书(client.crt)。

openssl x509 req in client.csr CA server.crt CAkey server.key CAcreateserial out client.crt days 500 -sha256

说明

生成验证证书用到的“server.crt”和“server.key”这两个文件,为“制作CA证书”中所生成的 两个文件。

步骤7 上传验证证书进行验证。

----结束

13.2.4 更新 CA 证书

步骤1 登录设备发放控制台。

步骤2 在设备发放控制台,左侧导航窗格中,选择“证书”,单击“证书列表”条目的操作 栏中的“更新”。

说明

更新CA证书前,要求该证书未被设备、策略、注册组关联。

更新CA证书后,该证书状态将变为未验证,请重新完成验证CA证书过程。

----结束

13.2.5 删除 CA 证书

步骤1 登录设备发放控制台。

步骤2 在设备发放控制台,左侧导航窗格中,选择“证书”,单击“证书列表”条目的操作 栏中的“删除”。

说明

关联了至少一个设备、策略或注册组的CA证书,不允许删除。

请谨慎操作,删除后的CA证书的所有数据将被删除且不可恢复。

----结束

13.3 策略

● 作用域:提供给FunctionGraph调用的用户函数必须定义为public。

● 返回参数:用户定义,FunctionGraph负责转换为字符串,作为HTTP Response返回。对于 返回参数对象类型,HTTP Response该类型的JSON字符串。

● 函数名:用户定义函数名称。

● 用户定义参数:当前函数只支持一个用户参数。对于复杂参数,建议定义为对象类型,以 JSON字符串提供数据。FunctionGraph调用函数时,解析JSON为对象。

● Context参数:runtime提供函数执行上下文,其接口定义在SDK接口说明。

创建Java函数时,函数入口参数需要提供函数完整的名字空间,参数格式为:包名.类名.函数

Java函数开发指南参见函数工作流 FunctionGraph > 开发指南 > 如何开发函数 > Java函数开发 指南。

参照如下代码编写函数,实现必要逻辑。

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);

protected abstract TdpFuncResult checkPara(FunctionGraphPara para, Context context);

/**

* 从备选的接入点中选择合适的接入点 */

protected abstract AccessPointPara determineAccessPoint(FunctionGraphPara para);

/**

* 调用设备发放的发放接口发放设备 */

protected abstract TdpFuncResult provisionDevice(FunctionGraphPara para, AccessPointPara accessPointPara);

}

步骤2 打包函数,上传代码。

说明

函数打包规范参见函数工作流 FunctionGraph > 开发指南 > 概述 > 函数工程打包规范。

如函数工程未使用到第三方库,则可将工程打成一个Jar包上传。如使用到第三方库,则需将工 程Jar包和第三方Jar包打包成一个Zip包。

本文使用到了多个第三方库,因此,如下图所示,将工程Jar包和第三方Jar包打包成一 个Zip包。

进入函数工作流服务控制台,创建函数并上传包含工程Jar包和第三方Jar包的Zip包。

为避免调试过程中函数因内存不足或超时导致调用失败,视实际使用情况调整内存大 小和超时时间。

步骤3 配置测试事件,调试函数。

创建测试事件,填写满足设备发放约束的函数参数的JSON格式。

点击“保存并测试”,查看函数运行结果,确认函数逻辑的正确性。

日志显示,已调用了发放设备接口,函数主要逻辑正确。至此,您已完成自定义策略 函数的编写,可进行后续步骤。

----结束

后续操作

完成自定义策略函数的编写后,创建关联该函数的自定义策略实例以及设备或注册 组,通过设备南向操作触发函数,将设备发放到指定目的接入点(设备接入实例)。

后续操作包括:

添加自定义策略实例;

注册设备或创建注册组;

● 南向接口:MQTT CONNECT连接鉴权、设备请求引导消息、设备接收引导消

息。

最佳实践:

● 结合函数服务通过自定义策略发放证书认证的设备。

设备发放对返回参数的约束

13-2 TdpFuncResult

名称 说明 类型

statusC

ode String 函数执行状态码,用于标识函数执行过程是否出现异常,遵 循HTTP状态码含义。

body String 字符串,但格式为JSON,结构为TdpFuncBody。

13-3 TdpFuncBody

名称 说明 类型

status String 设备发放业务功能标识,allow表示发放成功,deny表示发 放失败,设备发放使用此标识判断函数内业务功能执行成功 与否。

context TdpFuncB odyContex t

扩展字段,用于承载函数执行结果。

13-4 TdpFuncBodyContext

名称 说明 类型

allocati onResu lt

String 发放结果,存放发放接口返回的响应结构体。

errorCo

de String 错误码,如发放失败,则此值需不为空。

errorM

sg String 错误描述,如发放失败,则此值需不为空。

发放设备成功的返回参数样例

{ "statusCode": 200,

"body": "{\"status\":\"allow\",\"context\":{\"allocationResult\":\"dps返回的下发结果\"}}"

}

发放设备失败的返回参数样例

{ "statusCode": 200,

"body": "{\"status\":\"deny\",\"context\":{\"errorCode\":\"错误码\",\"errorMsg\":\"错误描述\"}}"

}

设备发放对函数参数的约束

13-5 FunctionGraphPara

名称 类型 说明

iamToken String 委托Token,便于用户调用发放接口。

deviceId String 设备ID。

deviceName String 设备名称。

accessPoints List<AccessPo

intPara> 备选接入点列表。

authInfo AuthInfoPara 设备认证信息。

13-6 AccessPointPara

名称 类型 说明

regionId String 备选接入点的区域ID。

accessPointId String 备选接入点的接入点ID。

authorizingD

omainId String 备选接入点的接入点授权租户,仅在授权场景下使 用。

13-7 AuthInfoPara

名称 类型 说明

authType String 认证类型。可选 SECRET 和 CERTIFICATES。

secret String 设备密钥信息,当认证类型为 SECRET 时携带。

certInfo CertInfoPara 证书信息,当认证类型为 CERTIFICATES 时携带。

13-8 CertInfoPara

名称 类型 说明

caCert CaCertPara 设备CA证书信息。

deviceCert List<DeviceCe

rtPara> 设备证书信息。

13-9 CaCertPara

名称 类型 说明

subjectCnNa

me String 证书使用者CN NAME。

caCertName String 证书名。

fingerprint String 证书指纹。

13-10 DeviceCertPara

名称 类型 说明

subjectCnNa

me String 证书使用者CN NAME。

issuerCnNam

e String 证书颁发者CN NAME。

sha1Fingerpr

int String 证书指纹(使用SHA-1算法计算)。

sha256Finger

print String 证书指纹(使用SHA-256算法计算)。

证书认证设备触发函数策略的函数参数样例:

{ "iamToken": "MIIT3gYJKoZIhvcNAQcCoIIT...", "deviceId": "testDeviceId",

"deviceName": "testDeviceName", "accessPoints": [

{

"regionId": "cn-north-4", "accessPointId": "cn-north-4", "authorizingDomainId": null },

{

"regionId": "cn-north-4",

"accessPointId": "86a45e59-3003-24b8-4e81-df0a9a694639", "authorizingDomainId": "84fd2c95ddf03b840f18100a000d45c2"

}

], "authInfo": {

"authType": "CERTIFICATES", "certInfo": {

"caCert": {

"subjectCnName": "serverCommonName20200922204814", "caCertName": "ca20200922204814",

"fingerprint": "dc0f1016f495157344ac5f1296335cff725ef22f"

},

"deviceCert": [ {

"subjectCnName": "deviceCommonName20200922204814", "issuerCnName": "serverCommonName20200922204814",

"sha1Fingerprint": "b2217bd882968b0bc15b1c2b132ba8a598f11879",

"sha256Fingerprint": "734326bb5f3065d8e90d95ce1910b831d3856a1318770768bf9b03923d641ddd"

} ] } }}

密钥认证设备触发函数策略的函数参数样例:

{ "iamToken": "MIIT3gYJKoZIhvcNAQcCoIIT...", "deviceId": "testDeviceId",

"deviceName": "testDeviceName", "accessPoints": [

{

"regionId": "cn-north-4", "accessPointId": "cn-north-4", "authorizingDomainId": null },

{

"regionId": "cn-north-4",

"accessPointId": "86a45e59-3003-24b8-4e81-df0a9a694639", "authorizingDomainId": "84fd2c95ddf03b840f18100a000d45c2"

}

], "authInfo": {

"authType": "SECRET",

"secret": "29ccf3ff01247d731fef"

}}

13.3.1.2 添加自定义策略实例

步骤1 进入“策略”界面,单击展开“自定义策略”,单击“添加函数”。

步骤2 按照下方参数说明填写关键参数信息后,单击“确定”。

参数名称 说明 示例

函数 即在函数服务中实现的自定义策略。如果下 拉框没有你想要的函数,可以单击创建新函 数来实现你的自定义策略需求。

将需要通过函数

“function”发放的 设备发放至华北-北 京四的物联网平台。

● 需通过函数

“function”发放 的设备: WaterMeter-Beijing0001、

WaterMeter-Beijing0002

● 函数:function

● 发放区域:华北-北京四

发放区域 发放到指定区域后,设备将接入对应区域的 设备接入服务。

所选区域未开通设备接入服务时,如果确定 添加实例,系统将自动为您开通设备接入服 务。不同区域设备接入服务价格不同,收费 详情请参考价格说明。

----结束

13.3.2 证书策略

步骤1 进入“策略”界面,单击展开“证书策略”,单击“添加实例”。

步骤2 按照下方参数说明填写关键参数信息后,单击“确定”。

参数名称 说明 示例

参数名称 说明 示例

● 关键字:Beijing

参数名称 说明

设备标识码 设备唯一物理标识,如IMEI、MAC地址等,用于设备在接

设备标识码 设备唯一物理标识,如IMEI、MAC地址等,用于设备在接