
为什么需要开发 USP Agent:
开发目标:
与 Controller 开发的关系:
C:\Users\zhuangpengli\AppData\Roaming\Qoder\SharedClientCache\cli\specs\usp-tr369-controller-dev.md新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/agent/IotUspAgentProtocol.java
IotProtocol 接口(与 Controller 共享)参照 Controller 的 IotUspProtocol.java 架构,但增加 Agent 特有组件
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/IotUspDataModelManager.java
核心职责:
getObjectInstance(String path) → ObjectInstancegetParameterValue(String path) → StringsetParameterValue(String path, String value) → voidcreateObjectInstance(String objPath, Map<String,String> params) → String (返回实例路径)deleteObjectInstance(String objPath) → voidgetSupportedObjects(String rootPath) → List数据模型模块设计:
interface DataModelModule {
String getRootPath(); // 如 "Device.WiFi."
boolean isSupported(String path);
void initialize(); // 初始化默认实例
}
// 模块化实现
class DeviceInfoDataModel implements DataModelModule
class LocalAgentDataModel implements DataModelModule
class WiFiDataModel implements DataModelModule
class IPDataModel implements DataModelModule新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/IotUspInstanceManager.java
核心职责:
Device.WiFi.SSID.[Name=="MyNetwork"].)新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/IotUspUniqueKeyManager.java
核心职责:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/IotUspSearchExpressionParser.java
核心职责:
[Type=="Normal"&&Stats.ErrorsSent>0])==, !=, ~=, <, >, <=, >=&&, ||技术选型:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/notification/IotUspNotificationManager.java
核心职责:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/notification/IotUspSubscriptionManager.java
核心职责:
Device.LocalAgent.Subscription.{i}.)PeriodicNotifInterval)新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/identity/IotUspEndpointIdManager.java
核心职责:
支持的 scheme:
os: - OUI + SerialNumber(推荐用于设备)ops: - OUI + ProductClass + SerialNumberuuid: - UUIDself: - 自生成标识验证:启动 Agent,确认可通过配置设置 Endpoint ID,且格式符合规范。
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/IotUspAgentMessagePipeline.java
核心方法:byte[] processIncoming(byte[] rawPayload, String controllerId, UspMtpTypeEnum mtpType)
处理流程:
ProtobufCodec.decodeRecord → RecordProtobufCodec.decodeMessage → MsgProtobufCodec.encodeRecord → 返回 byte[]与 Controller Pipeline 的差异:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspGetHandler.java(Agent 版本)
核心逻辑:
Get.param_paths(支持 Object Path、Object Instance Path、Parameter Path、Search Path)Device.WiFi.SSID.*.)Device.WiFi.SSID.[SSID=="MyNetwork].)GetResp(包含完整的对象树和参数值)关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspSetHandler.java(Agent 版本)
核心逻辑:
Set.update_objs(obj_path + param_settings)SetResp事务处理:
@Transactional 保证原子性关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspAddHandler.java(Agent 版本)
核心逻辑:
Add.create_objs(obj_path + param_settings)AddResp(返回 instantiated_path 和 unique_keys)关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspDeleteHandler.java(Agent 版本)
核心逻辑:
Delete.obj_pathsDeleteResp引用处理:
关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspOperateHandler.java(Agent 版本)
核心逻辑:
Operate.command_pathOperateResp 或返回异步请求 ID内置命令处理器:
interface CommandHandler {
String getCommandPath(); // 如 "Device.Reboot()"
Map<String,String> execute(Map<String,String> inputArgs);
CmdType getCommandType(); // SYNC/ASYNC
}
// 内置命令实现
class RebootCommandHandler implements CommandHandler
class ResetCommandHandler implements CommandHandler
class PingCommandHandler implements CommandHandler
class FactoryResetCommandHandler implements CommandHandler关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspGetSupportedDMHandler.java
核心逻辑:
GetSupportedDM.obj_pathsGetSupportedDMResp支持的数据模型定义:
class SupportedDataModelDefinition {
String objPath; // 对象路径
ObjAccessType access; // 访问权限
boolean isMultiInstance; // 是否多实例
List<SupportedParam> params; // 参数列表
List<SupportedCommand> commands; // 命令列表
List<SupportedEvent> events; // 事件列表
List<UniqueKeySet> uniqueKeys; // 唯一键集合
}关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspGetInstancesHandler.java
核心逻辑:
GetInstances.obj_pathsGetInstancesResp关键要求:
验证:通过 Controller 发送 GetSupportedDM 和 GetInstances 请求,确认返回正确的数据模型结构和实例列表。
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/modules/DeviceInfoDataModel.java
实现的对象:
Device.DeviceInfo. (Single-Instance) 数据库表:
CREATE TABLE iot_usp_device_info (
id BIGINT PRIMARY KEY,
manufacturer VARCHAR(128),
model_name VARCHAR(128),
serial_number VARCHAR(128) UNIQUE,
hardware_version VARCHAR(64),
software_version VARCHAR(64),
product_class VARCHAR(128),
-- ... 其他参数
tenant_id BIGINT,
create_time DATETIME,
update_time DATETIME
);新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/modules/LocalAgentDataModel.java
实现的对象:
Device.LocalAgent. (Single-Instance)Device.LocalAgent.Controller.{i}. (Multi-Instance) Device.LocalAgent.MTP.{i}. (Multi-Instance) Device.LocalAgent.Subscription.{i}. (Multi-Instance) 关键功能:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/modules/WiFiDataModel.java
实现的对象:
Device.WiFi. (Single-Instance)Device.WiFi.Radio.{i}. (Multi-Instance) Device.WiFi.SSID.{i}. (Multi-Instance) Device.WiFi.AccessPoint.{i}. (Multi-Instance) Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}. (Multi-Instance) 数据库表:
-- WiFi Radio
CREATE TABLE iot_usp_wifi_radio (
instance_number INT PRIMARY KEY,
enable BOOLEAN,
status VARCHAR(32),
channel INT,
channel_width INT,
-- ... 其他参数
UNIQUE KEY uk_instance (instance_number)
);
-- WiFi SSID
CREATE TABLE iot_usp_wifi_ssid (
instance_number INT PRIMARY KEY,
enable BOOLEAN,
status VARCHAR(32),
ssid VARCHAR(64),
bssid VARCHAR(32) UNIQUE,
name VARCHAR(64) UNIQUE,
alias VARCHAR(64) UNIQUE,
-- ... 其他参数
UNIQUE KEY uk_bssid (bssid),
UNIQUE KEY uk_name (name),
UNIQUE KEY uk_alias (alias)
);
-- WiFi AccessPoint
CREATE TABLE iot_usp_wifi_ap (
instance_number INT PRIMARY KEY,
enable BOOLEAN,
status VARCHAR(32),
ssid_reference VARCHAR(128),
alias VARCHAR(64) UNIQUE,
-- ... 其他参数
FOREIGN KEY (ssid_reference) REFERENCES iot_usp_wifi_ssid(path)
);
-- AssociatedDevice
CREATE TABLE iot_usp_wifi_assoc_device (
ap_instance INT,
instance_number INT,
mac_address VARCHAR(32),
associated BOOLEAN,
active BOOLEAN,
-- ... 其他参数
PRIMARY KEY (ap_instance, instance_number),
UNIQUE KEY uk_mac (ap_instance, mac_address)
);新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/modules/IPDataModel.java
实现的对象:
Device.IP. (Single-Instance)Device.IP.Interface.{i}. (Multi-Instance) Device.IP.Interface.{i}.IPv4Address.{i}. (Multi-Instance) Device.IP.Interface.{i}.IPv6Address.{i}. (Multi-Instance) 新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/modules/EthernetDataModel.java
实现的对象:
Device.Ethernet. (Single-Instance)Device.Ethernet.Interface.{i}. (Multi-Instance) 新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/datamodel/IotUspDataModelInitializer.java
核心职责:
验证:启动 Agent 后,通过 GetSupportedDM 确认可查看完整的数据模型结构,通过 GetInstances 确认实例存在。
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/mtp/IotUspAgentMtpManager.java
核心职责:
与 Controller MTP 的差异:
修改 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/mtp/IotUspMqttMtp.java(增强)
Agent 特有逻辑:
usp-endpoint-id User Property(MQTT 5.0)usp/{agentEndpointId}/to_agent/#usp/{agentEndpointId}/to_controller/{sessionId}关键要求:
修改 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/mtp/IotUspWebSocketMtp.java(增强)
Agent 客户端模式:
ws://controller-host:port/usp?eid={agentEndpointId}Sec-WebSocket-Protocol: v1.uspAgent 服务端模式(可选):
关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/notification/IotUspNotificationTrigger.java
核心职责:
实现方式:
推荐方案 2 示例:
// 定义事件
class ParameterValueChangedEvent extends ApplicationEvent {
String endpointId;
String parameterPath;
String oldValue;
String newValue;
}
// 发布事件
applicationEventPublisher.publishEvent(new ParameterValueChangedEvent(...));
// 监听事件
@EventListener
public void handleParameterChange(ParameterValueChangedEvent event) {
notificationManager.notifyValueChange(...);
}新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/notification/IotUspNotifyMessageBuilder.java
核心职责:
验证:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/security/IotUspAgentCertificateManager.java
核心职责:
证书要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/security/IotUspControllerAuthenticator.java
核心职责:
认证流程:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/security/IotUspRoleBasedAccessControl.java
核心职责:
角色权限检查:
boolean hasPermission(String controllerId, String path, PermissionType type) {
Role role = roleManager.getRole(controllerId);
return role.hasPermission(path, type);
}
enum PermissionType {
READ, // r
WRITE, // w
EXECUTE, // x (Create/Command)
NOTIFY // n
}关键要求:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/security/IotUspSecuredParameterProtection.java
核心职责:
Secured 参数示例:
Device.LocalAgent.Controller.{i}.EndpointIDDevice.LocalAgent.Controller.{i}.AssignedRoleDevice.Security. 下的参数验证:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/dataobject/IotUspObjectInstanceDO.java
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/mysql/IotUspObjectInstanceMapper.java
核心职责:
数据库表:
CREATE TABLE iot_usp_object_instance (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
endpoint_id VARCHAR(128),
object_path VARCHAR(256),
instance_number INT,
unique_keys_json JSON,
parent_instance_id BIGINT,
create_time DATETIME,
update_time DATETIME,
UNIQUE KEY uk_endpoint_object_instance (endpoint_id, object_path, instance_number),
KEY idx_object_path (object_path),
KEY idx_unique_keys ((CAST(unique_keys_json->>'$.Name' AS CHAR(64))))
);新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/dataobject/IotUspParameterValueDO.java
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/mysql/IotUspParameterValueMapper.java
核心职责:
数据库表:
CREATE TABLE iot_usp_parameter_value (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
endpoint_id VARCHAR(128),
object_instance_id BIGINT,
parameter_name VARCHAR(256),
parameter_value TEXT,
parameter_type VARCHAR(32),
last_modified DATETIME,
UNIQUE KEY uk_endpoint_object_param (endpoint_id, object_instance_id, parameter_name),
KEY idx_object_instance (object_instance_id)
);新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/dataobject/IotUspSessionDO.java
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/mysql/IotUspSessionMapper.java
核心职责:
数据库表:
CREATE TABLE iot_usp_session (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
endpoint_id VARCHAR(128),
controller_id VARCHAR(128),
session_id BIGINT,
sequence_id BIGINT,
expected_id BIGINT,
mtp_type VARCHAR(32),
status TINYINT,
start_time DATETIME,
last_active_time DATETIME,
UNIQUE KEY uk_endpoint_controller_session (endpoint_id, controller_id, session_id),
KEY idx_controller (controller_id)
);新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/dataobject/IotUspNotificationLogDO.java
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/dal/mysql/IotUspNotificationLogMapper.java
核心职责:
验证:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspRegisterHandler.java
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/handler/upstream/IotUspDeregisterHandler.java
核心逻辑:
应用场景:USP Broker 架构中的 USP Service 动态注册
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/command/IotUspAsyncCommandManager.java
核心职责:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/bulkdata/IotUspBulkDataCollector.java
核心职责:
新建 yudao-module-iot/yudao-module-iot-tr369/src/main/java/cn/iocoder/yudao/module/iot/tr369/software/IotUspSoftwareModuleManager.java
核心职责:
验证:通过 Controller 发送 Register 请求,确认成功注册服务元素。
文件路径 | 用途 |
|---|---|
tr369/agent/IotUspAgentProtocol.java | Agent 协议主类 |
tr369/datamodel/IotUspDataModelManager.java | 数据模型管理器 |
tr369/datamodel/IotUspInstanceManager.java | 实例管理器 |
tr369/datamodel/IotUspUniqueKeyManager.java | 唯一键管理器 |
tr369/datamodel/IotUspSearchExpressionParser.java | 搜索表达式解析器 |
tr369/notification/IotUspNotificationManager.java | 通知管理器 |
tr369/notification/IotUspSubscriptionManager.java | 订阅管理器 |
tr369/identity/IotUspEndpointIdManager.java | Endpoint ID 管理 |
文件路径 | 用途 |
|---|---|
tr369/handler/IotUspAgentMessagePipeline.java | Agent 消息流水线 |
tr369/handler/upstream/IotUspGetHandler.java | Get 处理器(Agent) |
tr369/handler/upstream/IotUspSetHandler.java | Set 处理器(Agent) |
tr369/handler/upstream/IotUspAddHandler.java | Add 处理器(Agent) |
tr369/handler/upstream/IotUspDeleteHandler.java | Delete 处理器(Agent) |
tr369/handler/upstream/IotUspOperateHandler.java | Operate 处理器(Agent) |
tr369/handler/upstream/IotUspGetSupportedDMHandler.java | GetSupportedDM 处理器 |
tr369/handler/upstream/IotUspGetInstancesHandler.java | GetInstances 处理器 |
文件路径 | 用途 |
|---|---|
tr369/datamodel/modules/DeviceInfoDataModel.java | DeviceInfo 模块 |
tr369/datamodel/modules/LocalAgentDataModel.java | LocalAgent 模块 |
tr369/datamodel/modules/WiFiDataModel.java | WiFi 模块 |
tr369/datamodel/modules/IPDataModel.java | IP 模块 |
tr369/datamodel/modules/EthernetDataModel.java | Ethernet 模块 |
tr369/datamodel/IotUspDataModelInitializer.java | 数据模型初始化器 |
文件路径 | 用途 |
|---|---|
tr369/mtp/IotUspAgentMtpManager.java | Agent MTP 管理器 |
tr369/mtp/IotUspMqttMtp.java | 增强 MQTT 客户端逻辑 |
tr369/mtp/IotUspWebSocketMtp.java | 增强 WebSocket 客户端/服务端 |
tr369/notification/IotUspNotificationTrigger.java | 通知触发器 |
tr369/notification/IotUspNotifyMessageBuilder.java | Notify 消息构建器 |
文件路径 | 用途 |
|---|---|
tr369/security/IotUspAgentCertificateManager.java | Agent 证书管理 |
tr369/security/IotUspControllerAuthenticator.java | Controller 认证 |
tr369/security/IotUspRoleBasedAccessControl.java | RBAC 实现 |
tr369/security/IotUspSecuredParameterProtection.java | Secured 参数保护 |
文件路径 | 用途 |
|---|---|
tr369/dal/dataobject/IotUspObjectInstanceDO.java | 对象实例 DO |
tr369/dal/dataobject/IotUspParameterValueDO.java | 参数值 DO |
tr369/dal/dataobject/IotUspSessionDO.java | 会话 DO |
tr369/dal/dataobject/IotUspNotificationLogDO.java | 通知日志 DO |
tr369/dal/mysql/IotUspObjectInstanceMapper.java | 对象实例 Mapper |
tr369/dal/mysql/IotUspParameterValueMapper.java | 参数值 Mapper |
tr369/dal/mysql/IotUspSessionMapper.java | 会话 Mapper |
tr369/dal/mysql/IotUspNotificationLogMapper.java | 通知日志 Mapper |
文件路径 | 用途 |
|---|---|
tr369/handler/upstream/IotUspRegisterHandler.java | Register 处理器 |
tr369/handler/upstream/IotUspDeregisterHandler.java | Deregister 处理器 |
tr369/command/IotUspAsyncCommandManager.java | 异步命令管理 |
tr369/bulkdata/IotUspBulkDataCollector.java | 批量数据采集 |
tr369/software/IotUspSoftwareModuleManager.java | 软件模块管理 |
Device.WiFi.SSID.[Name=="MyNetwork"].)→ 确认正确解析可复用的组件:
IotUspProtobufCodec)需要独立实现的组件:
联调测试:
P0 - 必须完成(MVP):
P1 - 重要功能:
P2 - 高级功能:
实现 USP Agent 比 Controller 复杂得多,主要挑战在于:
建议采用渐进式实现策略,从 MVP(Phase 0-3)开始,逐步扩展到完整功能。