diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaFirmwareDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaFirmwareDO.java
new file mode 100644
index 0000000000..12e5147edd
--- /dev/null
+++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaFirmwareDO.java
@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * IoT OTA 固件 DO
+ *
+ * @see https://help.aliyun.com/zh/iot/user-guide/ota-upgrade-overview
+ *
+ * @author 芋道源码
+ */
+@TableName(value = "iot_ota_firmware", autoResultMap = true)
+@KeySequence("iot_ota_firmware_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotOtaFirmwareDO extends BaseDO {
+
+ /**
+ * 固件编号
+ */
+ @TableField
+ private Long id;
+ /**
+ * 固件名称
+ */
+ private String name;
+ /**
+ * 固件版本
+ */
+ private String description;
+ /**
+ * 版本号
+ */
+ private String version;
+
+ /**
+ * 产品编号
+ *
+ * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}
+ */
+ private String productId;
+ /**
+ * 产品标识
+ *
+ * 冗余 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getProductKey()}
+ */
+ private String productKey;
+
+ /**
+ * 签名方式
+ *
+ * 例如说:MD5、SHA256
+ */
+ private String signMethod;
+ /**
+ * 固件文件签名
+ */
+ private String fileSign;
+ /**
+ * 固件文件大小
+ */
+ private Long fileSize;
+ /**
+ * 固件文件 URL
+ */
+ private String fileUrl;
+
+ /**
+ * 自定义信息,建议使用 JSON 格式
+ */
+ private String information;
+
+}
\ No newline at end of file
diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeRecordDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeRecordDO.java
new file mode 100644
index 0000000000..b4868f3875
--- /dev/null
+++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeRecordDO.java
@@ -0,0 +1,83 @@
+package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * IoT OTA 升级记录 DO
+ *
+ * @author 芋道源码
+ */
+@TableName(value = "iot_ota_upgrade_record", autoResultMap = true)
+@KeySequence("iot_ota_upgrade_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotOtaUpgradeRecordDO extends BaseDO {
+
+ @TableId
+ private Long id;
+
+ /**
+ * 固件编号
+ *
+ * 关联 {@link IotOtaFirmwareDO#getId()}
+ */
+ private Long firmwareId;
+ /**
+ * 任务编号
+ *
+ * 关联 {@link IotOtaUpgradeTaskDO#getId()}
+ */
+ private Long taskId;
+
+ /**
+ * 升级状态
+ *
+ * TODO
+ */
+ private Integer status;
+ /**
+ * 升级进度,百分比
+ */
+ private Integer progress;
+
+ /**
+ * 产品标识
+ *
+ * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}
+ */
+ private String productKey;
+ /**
+ * 设备名称
+ *
+ * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()}
+ */
+ private String deviceName;
+ /**
+ * 设备编号
+ *
+ * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()}
+ */
+ private String deviceId;
+
+ /**
+ * 升级开始时间
+ */
+ private LocalDateTime startTime;
+ /**
+ * 升级结束时间
+ */
+ private LocalDateTime endTime;
+
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeTaskDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeTaskDO.java
new file mode 100644
index 0000000000..529accfdd5
--- /dev/null
+++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaUpgradeTaskDO.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.*;
+
+import java.util.List;
+
+/**
+ * IoT OTA 升级任务 DO
+ *
+ * @author 芋道源码
+ */
+@TableName(value = "iot_ota_upgrade_task", autoResultMap = true)
+@KeySequence("iot_ota_upgrade_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotOtaUpgradeTaskDO extends BaseDO {
+
+ /**
+ * 任务编号
+ */
+ @TableField
+ private Long id;
+ /**
+ * 任务名称
+ */
+ private String name;
+ /**
+ * 任务描述
+ */
+ private String description;
+
+ /**
+ * 固件编号
+ *
+ * 关联 {@link IotOtaFirmwareDO#getId()}
+ */
+ private Long firmwareId;
+
+ /**
+ * 任务类型
+ *
+ * TODO @芋艿:1-全部、2-指定设备
+ */
+ private Integer type;
+ /**
+ * 选中的设备名字数组
+ *
+ * 关联 {@link IotDeviceDO#getDeviceName()}
+ */
+ @TableField(typeHandler = JacksonTypeHandler.class)
+ private List deviceNames;
+
+}
\ No newline at end of file
diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertRecordDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertRecordDO.java
index 2fc01ba7d3..fbcf1fe79d 100644
--- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertRecordDO.java
+++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotAlertRecordDO.java
@@ -63,6 +63,7 @@ public class IotAlertRecordDO extends BaseDO {
@TableField(typeHandler = JacksonTypeHandler.class)
private IotDeviceMessage deviceMessage;
+ // TODO @芋艿:换成枚举,枚举对应 ApiErrorLogProcessStatusEnum
/**
* 处理状态
*
diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceDownstreamServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceDownstreamServiceImpl.java
index 006636c230..bac2ef6c90 100644
--- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceDownstreamServiceImpl.java
+++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceDownstreamServiceImpl.java
@@ -57,6 +57,7 @@ public class IotDeviceDownstreamServiceImpl implements IotDeviceDownstreamServic
public IotDeviceMessage downstreamDevice(IotDeviceDownstreamReqVO downstreamReqVO) {
// 校验设备是否存在
IotDeviceDO device = deviceService.validateDeviceExists(downstreamReqVO.getId());
+ // TODO @芋艿:离线设备,不允许推送
// TODO 芋艿:父设备的处理
IotDeviceDO parentDevice = null;