# 设备认证
为了将设备连接至 FogCloud,您需要首先在 FogCloud 创建设备,创建包括定义产品,并在该产品下创建设备。您可以使用 FogCloud 管理后台或者云端 API 来创建产品和设备。FogCloud 目前支持 MQTT 通信协议,您的设备需要经过身份认证才能连接至 FogCloud。FogCloud 使用密钥认证:设备使用 device_secret 进行签名,该签名会传递至 FogCloud 作为身份证明。
# 1. 设备密钥认证
连接地址:
地区 | mqtt 地址 |
中国 | mqtts://app.mqtt.fogcloud.io:8883 |
欧洲 | mqtts://mqtt-eu.fogcloud.io:8883 |
设备认证方式目前支持密钥认证。密钥认证有两种认证方案:「一机一密」和「一型一密」,两种方案在易用性和安全性上各有优势。为系统安全性考虑,推荐使用“一机一密”,但由于密钥是服务端生成,所以使用“一机一密”的前提是物联网模组或者主控 MCU 芯片支持烧录每个芯片都不一样的 ID。
# 1.1 一机一密
一机一密
需要预先为设备烧录三元组信息:product_key
,device_name
,device_secret
。当设备与FogCloud
平台建立 mqtt 连接时,FogCloud
会对三元组组成的连接参数进行认证。认证通过后,设备可与FogCloud
平台进行通信。
# 1.1.1 mqtt 连接参数
- client_id
固定格式:${client_id}|signmethod=${signmethod},authType=${auth_type}|
参数说明:
参数 | 说明 |
${client_id} | mqtt 客户端 id,需要自定义。建议使用 |
${signmethod} | 签名算法,支持: |
${auth_type} | 认证方式:1-一机一密,2-一型一密预注册,3-一型一密免预注册。不传则默认为 1 |
- username
固定格式:${device_name}<span>&</span>${product_key}
- password
使用client_id
参数中的${signmethod}
为签名算法,以device_secret
为密码,对拼接字符串计算签名,并将得到的字节码转为 hex 字符串即可得到password
。
进行签名的字符串为固定格式:clientId${client_id}deviceName${device_name}productKey{$product_key}
# 1.1.2 示例
一个设备的三元组为:
{
"product_key": "7153abc4",
"device_name": "00000000",
"device_secret": "10dbb5bd4328feda67376318ac4ac714"
}
client_id 参数为:
{
"authType": 1,
"client_id": "00000000&7153abc4",
"signmethod": "hmacsha1"
}
则其 MQTT 连接参数如下:
client_id=00000000&7153abc4|signmethod=hmacsha1,authType=1|
username=00000000&7153abc4
password=hmacsha1("10dbb5bd4328feda67376318ac4ac714", "clientId00000000&7153abc4deviceName00000000productKey7153abc4").toHexString()
加密后的 password 为 16 进制字符串:
ea2d65261c829ee0902d021dbcba8512479e6c02
# 1.2 一型一密
一型一密
可以为同一产品下所有设备烧录相同的信息:product_key
和product_secret
。设备激活时需发送激活请求,FogCloud
平台会进行身份认证,认证通过后,返回设备接入所需信息
# 1.2.1 基本步骤
创建产品
在产品详情里开启动态注册功能
添加设备
烧录
product_key, product_secret
到设备动态注册
# 1.2.2 基于 http 的动态激活
设备直接向FogCloud
平台发起 HTTP 请求,动态获取三元组信息,然后再按一机一密
方式进行接入。
- 接口地址
POST https://${host}/openapi/v1/auth/register/device
- 请求体
{
"product_key": "12345678",
"mac": "00000000", //设备mac地址
"sign_method": "hmacsha1", //hmac算法,可选:hmacmd5, hmacsha1
"sign": "20a9af62f630ce54eae18a424905cae3da909371", //hmac签名
"random": "123fadff" // 随机字符串,长度5~20个字节
}
- 返回参数
{
"code": 0, //0-成功
"message": "", //错误信息
"data": {
"product_key": "string",
"device_name": "string",
"device_secret": "string"
}
}
- 签名计算方式
使用sign_method
字段的hmac
算法,product_secret
作为秘钥,对固定格式字符串进行签名,并将得到的字节码转为 hex 字符串即可。 被签名的字符串固定格式为:"mac${mac}productKey${product_key}random${random}"
- 签名示例
一个设备的请求参数为:
{
"product_key": "5a2cb046",
"mac": "00aa9ea12",
"sign_method": "hmacsha1",
"random": "123fadff"
}
product_secret
为:"567bf9c3ac1cc983265a3099efd9477c"
需要计算签名的字符串为:"mac00aa9ea12productKey5a2cb046random123fadff"
使用 hmacsha1 算法计算签名的伪代码:hmacsha1("567bf9c3ac1cc983265a3099efd9477c", "mac00aa9ea12productKey5a2cb046random123fadff").toHexString()
最后计算得到的签名为:"7aa0b6ffd103e6facd952c5088beb1b5ecfb305c"
# 1.2.3 基于 http 的动态生成
设备直接向FogCloud
平台发起 HTTP 请求,动态生成三元组信息,device_name
由设备指定,然后再按一机一密
方式进行接入。
- 接口地址
POST https://${host}/openapi/v1/auth/generator/device
- 请求体
{
"product_key": "string",
"device_name": "string", //长度6~20个字节,仅支持英文数字字符
"sign_method": "string", //hmac算法,可选:hmacmd5, hmacsha1
"sign": "string", //hmac签名
"random": "string" //随机字符串,长度5~20个字节
}
- 返回参数
{
"code": 0,
"message": "SUCCESS",
"data": {
"product_key": "string",
"device_name": "string",
"device_secret": "string"
}
}
- 签名计算方式
使用sign_method
字段的hmac
算法,product_secret
作为秘钥,对固定格式字符串进行签名,并将得到的字节码转为 hex 字符串即可。 被签名的字符串固定格式为:"deviceName${device_name}productKey${product_key}random${random}"
- 签名示例
一个设备的请求参数为:
{
"product_key": "5a2cb046",
"device_name": "00aa9ea12",
"sign_method": "hmacsha1",
"random": "123fadff"
}
product_secret
为:"567bf9c3ac1cc983265a3099efd9477c"
需要计算签名的字符串为:"deviceName00aa9ea12productKey5a2cb046random123fadff"
使用 hmacsha1 算法计算签名的伪代码:hmacsha1("567bf9c3ac1cc983265a3099efd9477c", "deviceName00aa9ea12productKey5a2cb046random123fadff").toHexString()
最后计算得到的签名为:"733786f4e1a2a6c0e13aebfc3e228ec463971f43"