认证文档
大约 3 分钟introfeature
连接说明
目前BladeX物联网平台支持设备直连认证,通信协议为MQTT。若有其他协议比如TCP、Modbus等,需要通过Node-Red边缘网关进行统一解析后进行转发至MQTT认证通信。
一、MQTT连接认证
介绍说明
在物联网的世界中,设备与平台之间的通信至关重要。MQTT协议是一种轻量级的通信协议,广泛用于设备与物联网平台之间的数据交换。与物联网平台通过MQTT协议连接通信前,设备必须与MQTT服务端进行认证,认证通过后,设备才能发布和订阅消息。
1. 连接准备
- 在设备与物联网平台通信之前,需要进行一些准备工作,主要是设备认证。认证成功后,设备才能发布和订阅消息。以下是一些关键步骤和注意事项。
2. 设备认证
- 设备证书共享风险:避免将同一设备证书(包括ProductKey、DeviceName和DeviceSecret)用于多个物理设备。这样做可能会导致设备频繁地上线和下线,影响通信的稳定性。
- 通信安全:为了确保数据传输的安全,建议使用TLS加密的连接方式。
3. 连接参数
- 接入地址:根据物联网平台的部署情况,选择合适的域名或IP地址进行接入。
- Keep Alive参数:在MQTT CONNECT指令中,需要设置Keep Alive(保活时间)。建议的保活时间范围是30秒到1200秒,推荐设置为300秒或更长,以适应可能的网络波动。
- MQTT CONNECT报文:确保报文中包含正确的设备认证信息。
4. 设备认证方式
- 一机一密设备认证:使用设备证书(ProductKey、DeviceName和DeviceSecret)进行连接。
- 一型一密预注册设备认证:首先从平台获取设备证书,然后按照一机一密的方式进行连接。
1. 连接参数如下:
{
"clientId": "4cdc1b0d335454e0289a0e741809fe7d|clienttype=2,timestamp=1721840451485|",
"username": "OCAu8nHFz4HNphIE&JkerjK97oub",
"password": "0ffec555a5934551d5f8bb7b7d6bf473",
"host": "192.168.0.1",
"port": 1883,
"webPort": 8083
}
2. 连接参数说明:
参数 | 说明 |
---|---|
clientId | 表示客户端ID,可自定义,长度不可超过64个字符。建议使用设备的MAC地址或SN码,方便您识别区分不同的客户端。若有租户id则在结尾处加上@租户id定义 |
clienttype | 标识客户端类型,0(默认值):直连设备/网关设备,1:appuser,app端用户认证, 2:web模拟器模拟设备连接认证(时间戳强制校验) |
signmethod | 表示签名算法类型。支持hmacmd5(默认值),hmacsha1和hmacsha256。 |
timestamp | 表示当前时间毫秒值,添加了此参数重连时需要重新签名。 |
encoding | 消息内容编码方式,支持 plain(原始)、hex(16进制)、base64。 |
3. 连接参数示例:
参数 | 参数值 |
---|---|
clientId | 4cdc1b0d335454e0289a0e741809fe7d@000000 |
deviceName | OCAu8nHFz4HNphIE |
deviceSecret | KtLNeGc4ZWSiTSuj8rl4ZJVmFTvV37oy |
productKey | JkerjK97oub |
timestamp | 1721840451485 |
signmethod | hmacmd5 |
4. 加密参数生成逻辑:
mqttclientId=4cdc1b0d335454e0289a0e741809fe7d@000000|signmethod=hmacmd5,timestamp=1721840451485|
mqttUsername=OCAu8nHFz4HNphIE&JkerjK97oub
mqttPassword=hmacmd5("KtLNeGc4ZWSiTSuj8rl4ZJVmFTvV37oy","clientId4cdc1b0d335454e0289a0e741809fe7ddeviceNameOCAu8nHFz4HNphIEproductKeyJkerjK97oubtimestamp1721840451485";
String plainText = "clientId" + clientId + "deviceName" + deviceName + "productKey" + productKey + "timestamp" + timestamp;
String mqttPassword = hmacmd5(deviceSecret, plainText);
5. 连接实现代码:
@Slf4j
@RequiredArgsConstructor
public class DeviceSimulator {
private final String productKey;
private final String deviceName;
private final String deviceSecret;
/**
* 启动模拟器
*/
public void start() {
// 初始化客户端认证信息
ClientSign clientSign = createClientSign();
String username = clientSign.getUsername();
String password = clientSign.getPassword();
String clientId = clientSign.getClientIdInfo().getMqttClientId();
log.info("username: {}, password: {}, clientId: {}", username, password, clientId);
// 初始化 MQTT 客户端
MqttClient client = MqttClient.create()
.username(username)
.password(password)
.clientId(clientId)
.connectSync();
}
/**
* 创建客户端认证信息
*
* @return ClientSign
*/
private ClientSign createClientSign() {
ClientIdInfo clientIdInfo = new ClientIdInfo();
//设置租户id
clientIdInfo.setTenantId("000000");
//设置客户端id
clientIdInfo.setClientId(deviceName);
ClientSign clientSign = new ClientSign();
clientSign.setClientIdInfo(clientIdInfo);
clientSign.setProductKey(productKey);
clientSign.setDeviceName(deviceName);
clientSign.setDeviceSecret(deviceSecret);
return clientSign;
}
}
6. 连接调用结果