package cn.iocoder.yudao.module.iot.core.mq.message;
|
|
import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
|
import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum;
|
import cn.iocoder.yudao.module.iot.core.enums.device.IotDeviceStateEnum;
|
import cn.iocoder.yudao.module.iot.core.topic.state.IotDeviceStateUpdateReqDTO;
|
import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils;
|
import lombok.AllArgsConstructor;
|
import lombok.Builder;
|
import lombok.Data;
|
import lombok.NoArgsConstructor;
|
|
import java.time.LocalDateTime;
|
|
/**
|
* IoT 设备消息
|
*/
|
@Data
|
@NoArgsConstructor
|
@AllArgsConstructor
|
@Builder
|
public class IotDeviceMessage {
|
|
/**
|
* 【消息总线】应用的设备消息 Topic,由 iot-gateway 发给 iot-biz 进行消费
|
*/
|
public static final String MESSAGE_BUS_DEVICE_MESSAGE_TOPIC = "iot_device_message";
|
|
/**
|
* 【消息总线】设备消息 Topic,由 iot-biz 发送给 iot-gateway 的某个 "server"(protocol) 进行消费
|
*
|
* 其中,%s 就是该"server"(protocol) 的标识
|
*/
|
public static final String MESSAGE_BUS_GATEWAY_DEVICE_MESSAGE_TOPIC = MESSAGE_BUS_DEVICE_MESSAGE_TOPIC + "_%s";
|
|
/**
|
* 消息编号
|
*
|
* 由后端生成,通过 {@link IotDeviceMessageUtils#generateMessageId()}
|
*/
|
private String id;
|
/**
|
* 上报时间
|
*
|
* 由后端生成,当前时间
|
*/
|
private LocalDateTime reportTime;
|
|
/**
|
* 设备编号
|
*/
|
private Long deviceId;
|
/**
|
* 租户编号
|
*/
|
private Long tenantId;
|
|
/**
|
* 服务编号,该消息由哪个 server 发送
|
*/
|
private String serverId;
|
|
// ========== serialize(序列化)相关字段 ==========
|
|
/**
|
* 请求编号
|
*
|
* 由设备生成,对应阿里云 IoT 的 Alink 协议中的 id、华为云 IoTDA 协议的 request_id
|
*/
|
private String requestId;
|
/**
|
* 请求方法
|
*
|
* 枚举 {@link IotDeviceMessageMethodEnum}
|
* 例如说:thing.property.post 属性上报
|
*/
|
private String method;
|
/**
|
* 请求参数
|
*
|
* 例如说:属性上报的 properties、事件上报的 params
|
*/
|
private Object params;
|
/**
|
* 响应结果
|
*/
|
private Object data;
|
/**
|
* 响应错误码
|
*/
|
private Integer code;
|
/**
|
* 返回结果信息
|
*/
|
private String msg;
|
|
// ========== 基础方法:只传递"serialize(序列化)相关字段" ==========
|
|
public static IotDeviceMessage requestOf(String method) {
|
return requestOf(null, method, null);
|
}
|
|
public static IotDeviceMessage requestOf(String method, Object params) {
|
return requestOf(null, method, params);
|
}
|
|
public static IotDeviceMessage requestOf(String requestId, String method, Object params) {
|
return of(requestId, method, params, null, null, null);
|
}
|
|
/**
|
* 创建设备请求消息(包含设备信息)
|
*
|
* @param deviceId 设备编号
|
* @param tenantId 租户编号
|
* @param serverId 服务标识
|
* @param method 消息方法
|
* @param params 消息参数
|
* @return 消息对象
|
*/
|
public static IotDeviceMessage requestOf(Long deviceId, Long tenantId, String serverId,
|
String method, Object params) {
|
IotDeviceMessage message = of(null, method, params, null, null, null);
|
return message.setId(IotDeviceMessageUtils.generateMessageId())
|
.setDeviceId(deviceId).setTenantId(tenantId).setServerId(serverId);
|
}
|
|
public static IotDeviceMessage replyOf(String requestId, String method,
|
Object data, Integer code, String msg) {
|
if (code == null) {
|
code = GlobalErrorCodeConstants.SUCCESS.getCode();
|
msg = GlobalErrorCodeConstants.SUCCESS.getMsg();
|
}
|
return of(requestId, method, null, data, code, msg);
|
}
|
|
public static IotDeviceMessage of(String requestId, String method,
|
Object params, Object data, Integer code, String msg) {
|
// 通用参数
|
IotDeviceMessage message = new IotDeviceMessage()
|
.setId(IotDeviceMessageUtils.generateMessageId()).setReportTime(LocalDateTime.now());
|
// 当前参数
|
message.setRequestId(requestId).setMethod(method).setParams(params)
|
.setData(data).setCode(code).setMsg(msg);
|
return message;
|
}
|
|
// ========== 核心方法:在 of 基础方法之上,添加对应 method ==========
|
|
public static IotDeviceMessage buildStateUpdateOnline() {
|
return requestOf(IotDeviceMessageMethodEnum.STATE_UPDATE.getMethod(),
|
new IotDeviceStateUpdateReqDTO(IotDeviceStateEnum.ONLINE.getState()));
|
}
|
|
public static IotDeviceMessage buildStateOffline() {
|
return requestOf(IotDeviceMessageMethodEnum.STATE_UPDATE.getMethod(),
|
new IotDeviceStateUpdateReqDTO(IotDeviceStateEnum.OFFLINE.getState()));
|
}
|
|
}
|