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地址等,用于设备在接