diff --git a/viewsh-module-iot/viewsh-module-iot-api/pom.xml b/viewsh-module-iot/viewsh-module-iot-api/pom.xml
index 4a83d63..2983427 100644
--- a/viewsh-module-iot/viewsh-module-iot-api/pom.xml
+++ b/viewsh-module-iot/viewsh-module-iot-api/pom.xml
@@ -1,48 +1,63 @@
-
-
-
- viewsh-module-iot
- com.viewsh
- ${revision}
-
- 4.0.0
- viewsh-module-iot-api
- jar
-
- ${project.artifactId}
-
-
- 物联网 模块 API,暴露给其它模块调用
-
-
-
-
- com.viewsh
- viewsh-common
-
-
-
-
- org.springframework
- spring-web
- provided
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- provided
-
-
-
-
- org.springframework.boot
- spring-boot-starter-validation
- true
-
-
-
-
+
+
+
+ viewsh-module-iot
+ com.viewsh
+ ${revision}
+
+ 4.0.0
+ viewsh-module-iot-api
+ jar
+
+ ${project.artifactId}
+
+
+ 物联网 模块 API,暴露给其它模块调用
+
+
+
+
+ com.viewsh
+ viewsh-common
+
+
+
+
+ org.springframework
+ spring-web
+ provided
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ provided
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ provided
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ true
+
+
+
+
+
diff --git a/viewsh-module-iot/viewsh-module-iot-api/src/main/java/com/viewsh/module/iot/api/device/IotDeviceControlApi.java b/viewsh-module-iot/viewsh-module-iot-api/src/main/java/com/viewsh/module/iot/api/device/IotDeviceControlApi.java
new file mode 100644
index 0000000..0b96245
--- /dev/null
+++ b/viewsh-module-iot/viewsh-module-iot-api/src/main/java/com/viewsh/module/iot/api/device/IotDeviceControlApi.java
@@ -0,0 +1,44 @@
+package com.viewsh.module.iot.api.device;
+
+import com.viewsh.framework.common.pojo.CommonResult;
+import com.viewsh.module.iot.api.device.dto.IotDeviceServiceInvokeReqDTO;
+import com.viewsh.module.iot.api.device.dto.IotDeviceServiceInvokeRespDTO;
+import com.viewsh.module.iot.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * IoT 设备控制 API
+ *
+ * 提供 RPC 接口供其他模块(如 Ops 模块)调用 IoT 设备服务
+ *
+ * 支持功能:
+ * - 服务调用(语音播报、震动提醒等)
+ * - 批量服务调用
+ *
+ * @author lzh
+ */
+@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
+@Tag(name = "RPC 服务 - IoT 设备服务控制")
+public interface IotDeviceControlApi {
+
+ String PREFIX = ApiConstants.PREFIX + "/device/control";
+
+ // ==================== 服务调用 ====================
+
+ @PostMapping(PREFIX + "/invoke-service")
+ @Operation(summary = "调用设备服务")
+ CommonResult invokeService(@Valid @RequestBody IotDeviceServiceInvokeReqDTO reqDTO);
+
+ @PostMapping(PREFIX + "/invoke-service-batch")
+ @Operation(summary = "批量调用设备服务")
+ CommonResult> invokeServiceBatch(@Valid @RequestBody List reqDTOList);
+
+}
diff --git a/viewsh-module-iot/viewsh-module-iot-api/src/main/java/com/viewsh/module/iot/api/device/IotDevicePropertyQueryApi.java b/viewsh-module-iot/viewsh-module-iot-api/src/main/java/com/viewsh/module/iot/api/device/IotDevicePropertyQueryApi.java
new file mode 100644
index 0000000..3a27625
--- /dev/null
+++ b/viewsh-module-iot/viewsh-module-iot-api/src/main/java/com/viewsh/module/iot/api/device/IotDevicePropertyQueryApi.java
@@ -0,0 +1,63 @@
+package com.viewsh.module.iot.api.device;
+
+import com.viewsh.framework.common.pojo.CommonResult;
+import com.viewsh.module.iot.api.device.dto.property.DevicePropertyBatchQueryReqDTO;
+import com.viewsh.module.iot.api.device.dto.property.DevicePropertyHistoryQueryReqDTO;
+import com.viewsh.module.iot.api.device.dto.property.DevicePropertyHistoryRespDTO;
+import com.viewsh.module.iot.api.device.dto.property.DevicePropertyRespDTO;
+import com.viewsh.module.iot.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import jakarta.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * IoT 设备属性查询 API
+ *
+ * 提供 RPC 接口供其他模块(如 Ops 模块)查询设备属性
+ *
+ * @author lzh
+ */
+@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
+@Tag(name = "RPC 服务 - IoT 设备属性查询")
+public interface IotDevicePropertyQueryApi {
+
+ String PREFIX = ApiConstants.PREFIX + "/device/property";
+
+ // ==================== 单个属性查询 ====================
+
+ @GetMapping(PREFIX + "/get")
+ @Operation(summary = "获取设备单个属性")
+ @Parameter(name = "deviceId", description = "设备ID", required = true, example = "1")
+ @Parameter(name = "identifier", description = "属性标识符", required = true, example = "battery_level")
+ CommonResult getProperty(@RequestParam("deviceId") Long deviceId,
+ @RequestParam("identifier") String identifier);
+
+ @GetMapping(PREFIX + "/get-latest")
+ @Operation(summary = "获取设备最新属性(从缓存)")
+ @Parameter(name = "deviceId", description = "设备ID", required = true, example = "1")
+ CommonResult