# 设备认证
# 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 请求,动态获取三元组信息,然后再按一机一密方式进行接入。
api 接口: POST https://$ (opens new window){host}/api/v1/auth/register/device
请求参数(json 格式):
{
"product_key": "12345678",
"mac": "00000000", //设备mac地址
"sign_method": "hmacsha1", //hmac算法,可选:hmacmd5, hmacsha1
"sign": "20a9af62f630ce54eae18a424905cae3da909371", //hmac签名
"random": "123fadff" // 随机字符串,长度大于5字节
} 签名计算方式:使用 sign_method 字段的 hmac 算法,product_secret 作为秘钥,对固定格式字符串进行签名,并将得到的字节码转为 hex 字符串即可。 被签名的字符串固定格式为:mac${mac}productKey${product_key}random${random}
返回参数(json 格式):
{
"code": 0, //0-成功
"message": "", //错误信息
"data": {
"product_key": "12345678",
"device_name": "00000000",
"device_secret": "xxxx"
}
}