HTTP 动态注册
大约 3 分钟devicefeature
介绍说明
物联网平台需要设备动态注册的原因主要包括以下几点:
扩展性:物联网平台通常需要支持成千上万甚至更多的设备接入。动态注册允许平台灵活地添加新设备,而无需进行复杂的预配置。
灵活性:设备可能因为各种原因需要更换或更新,动态注册使得设备更换过程更加简单,无需人工干预即可重新注册。
安全性:通过动态注册,平台可以实时验证设备的合法性,确保只有授权的设备能够接入,从而提高整个系统的安全性。
维护性:动态注册简化了设备的维护和管理过程。当设备需要更新或下线时,平台可以自动更新其注册信息。
自动化:自动化的注册流程可以减少人工操作,降低错误率,提高整个物联网系统的运行效率。
可追踪性:动态注册过程中,平台可以记录设备的注册信息,包括时间、地点等,便于进行设备管理和追踪。
适应性:随着物联网技术的发展,新的设备类型和协议可能不断出现。动态注册机制使得平台能够快速适应这些变化,无需进行大规模的系统升级。
1. 动态注册地址:
https://${域名}/auth/register/device2. 请求数据格式:
POST /auth/register/device HTTP/1.1
Content-Type: application/x-www-form-urlencoded
productKey=JkerjK97oub&uniqueNo=U1mo8BokA&random=qaCXMpHE&sign=6ff700b87a5dd1a22a5827d2e2e179c3&signMethod=hmacmd53. 请求参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| Method | String | POST |
| Content-Type | String | application/x-www-form-urlencoded |
| productKey | String | 产品唯一标识。 |
| uniqueNo | String | 动态注册时指定的设备唯一编码(如sn、mac)。 |
| deviceName | String | 设备名deviceName字段,留空则平台会默认生成。 |
| random | String | 动态注册时指定的随机数。 |
| sign | String | 根据指定的签名方法将设备信息加密后生成的签名。 |
| signMethod | String | 签名方法,目前支持hmacmd5、hmacsha1、hmacsha256。 |
| tenantId | String | 用户租户ID,留空则默认为000000。 |
4. 响应数据格式:
{
"code": 200,
"data": {
"productKey": "JkerjK97oub",
"deviceName": "27OY2cgYUsW",
"deviceSecret": "0cb56d6a63c8ffdb",
"mqttIp": "127.0.0.1",
"mqttPort": "1883"
},
"message": "success"
}5. 响应参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| code | Integer | 结果信息,200 为成功 |
| productKey | String | 产品唯一标识 |
| deviceName | String | 设备名,用于设备 mqtt 认证参数 |
| deviceSecret | String | 设备密钥,用于设备 mqtt 认证密码签名 |
| mqttIp | String | MQTT服务器地址 |
| mqttPort | String | MQTT服务端口 |
6. 注册实现代码
public class DeviceRegisterTest {
public static void main(String[] args) {
// 产品 key 和产品密钥
String productKey = "JkerjK97oub";
String productSecret = "0yg2zfAgmGgaY8pS";
// 设备唯一编号 sn 或者 mac 之类,确保不会变
String uniqueNo1 = "U1mo8BokA";
RegisterResp register1 = register(productKey, productSecret, uniqueNo1);
System.out.println("设备1\t" + register1);
String uniqueNo2 = "U1mo8BokB";
RegisterResp register2 = register(productKey, productSecret, uniqueNo2);
System.out.println("设备2\t" + register2);
String uniqueNo3 = "U1mo8BokC";
RegisterResp register3 = register(productKey, productSecret, uniqueNo3);
System.out.println("设备3\t" + register3);
}
private static RegisterResp register(String productKey, String productSecret, String uniqueNo) {
String random = StringUtil.random(8);
// 签名原文从 uniqueNo->productKey->random 依次拼接而成
// 若未传递 deviceName参数,则底层会默认生成一个随机的deviceName,另外deviceName不参与认证逻辑
//String plainText = "deviceName" + deviceName + "uniqueNo" + uniqueNo + "productKey" + productKey + "random" + random;
String plainText = "uniqueNo" + uniqueNo + "productKey" + productKey + "random" + random;
// 签名方法
SignMethod signMethod = SignMethod.HMAC_MD5;
// 生成签名
String sign = signMethod.sign(plainText, productSecret);
// 注册请求参数
RegisterReq req = new RegisterReq();
// 设置产品唯一标识
req.setProductKey(productKey);
// 设置设备唯一标识
req.setUniqueNo(uniqueNo);
// 设置设备名,留空则由平台生成
//req.setDeviceName(deviceName);
// 设置随机值
req.setRandom(random);
// 设置签名
req.setSign(sign);
// 设置签名方法
req.setSignMethod(signMethod.getMethod());
// 设置租户编号,留空默认为000000
//req.setTenantId("000000");
// http 动态注册
return HttpRequest.post("http://localhost:8888/auth/register/device")
.useSlf4jLog()
.queryMap(BeanUtil.toMap(req))
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.execute()
.asValue(new TypeReference<ApiResult<RegisterResp>>() {})
.getData();
}
}7. 注册调用结果

