以下是代码中无人机 MQTT 指令定义文件的分析:
MQTT 指令定义文件分析
1. 核心 Topic 定义文件
TopicConst.java - Topic 常量定义
package com.dji.sdk.mqtt;
/**
* All the topics that need to be used in the project.
* @author sean.zhou
* @date 2021/11/10
* @version 0.1
*/
public class TopicConst {
public static final String BASIC_PRE = "sys/";
public static final String THING_MODEL_PRE = "thing/";
public static final String PRODUCT = "product/";
public static final String STATUS_SUF = "/status";
public static final String _REPLY_SUF = "_reply";
public static final String STATE_SUF = "/state";
public static final String SERVICES_SUF = "/services";
public static final String OSD_SUF = "/osd";
public static final String REQUESTS_SUF = "/requests";
public static final String EVENTS_SUF = "/events";
public static final String PROPERTY_SUF = "/property";
public static final String SET_SUF = "/set";
public static final String REGEX_SN = "[A-Za-z0-9]+";
public static final String DRC = "/drc";
public static final String UP = "/up";
public static final String DOWN = "/down";
}
定义了所有 MQTT Topic 的前缀和后缀常量。
CloudApiTopicEnum.java - Topic 枚举和路由
public enum CloudApiTopicEnum {
STATUS(Pattern.compile("^" + BASIC_PRE + PRODUCT + REGEX_SN + STATUS_SUF + "$"), ChannelName.INBOUND_STATUS),
STATE(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + STATE_SUF + "$"), ChannelName.INBOUND_STATE),
SERVICE_REPLY(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + SERVICES_SUF + _REPLY_SUF + "$"), ChannelName.INBOUND_SERVICES_REPLY),
OSD(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + OSD_SUF + "$"), ChannelName.INBOUND_OSD),
REQUESTS(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + REQUESTS_SUF + "$"), ChannelName.INBOUND_REQUESTS),
EVENTS(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + EVENTS_SUF + "$"), ChannelName.INBOUND_EVENTS),
PROPERTY_SET_REPLY(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + PROPERTY_SUF + SET_SUF + _REPLY_SUF + "$"), ChannelName.INBOUND_PROPERTY_SET_REPLY),
DRC_UP(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + DRC + UP + "$"), ChannelName.INBOUND_DRC_UP),
UNKNOWN(Pattern.compile("^.*$"), ChannelName.DEFAULT);
private final Pattern pattern;
private final String beanName;
CloudApiTopicEnum(Pattern pattern, String beanName) {
this.pattern = pattern;
this.beanName = beanName;
}
public Pattern getPattern() {
return pattern;
}
public String getBeanName() {
return beanName;
}
public static CloudApiTopicEnum find(String topic) {
return Arrays.stream(CloudApiTopicEnum.values()).filter(topicEnum -> topicEnum.pattern.matcher(topic).matches()).findAny().orElse(UNKNOWN);
}
}
定义了 Topic 类型枚举,包含正则匹配和对应的 Channel 名称。
2. 指令方法枚举文件
RequestsMethodEnum.java - 请求指令枚举
public enum RequestsMethodEnum {
STORAGE_CONFIG_GET("storage_config_get", ChannelName.INBOUND_REQUESTS_STORAGE_CONFIG_GET, StorageConfigGet.class),
AIRPORT_BIND_STATUS("airport_bind_status", ChannelName.INBOUND_REQUESTS_AIRPORT_BIND_STATUS, AirportBindStatusRequest.class),
AIRPORT_ORGANIZATION_BIND("airport_organization_bind", ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_BIND, AirportOrganizationBindRequest.class),
AIRPORT_ORGANIZATION_GET("airport_organization_get", ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_GET, AirportOrganizationGetRequest.class),
FLIGHT_TASK_RESOURCE_GET("flighttask_resource_get", ChannelName.INBOUND_REQUESTS_FLIGHTTASK_RESOURCE_GET, FlighttaskResourceGetRequest.class),
CONFIG("config", ChannelName.INBOUND_REQUESTS_CONFIG, RequestsConfigRequest.class),
FLIGHT_AREAS_GET("flight_areas_get", ChannelName.INBOUND_REQUESTS_FLIGHT_AREAS_GET, FlightAreasGetRequest.class),
OFFLINE_MAP_GET("offline_map_get", ChannelName.INBOUND_REQUESTS_OFFLINE_MAP_GET, OfflineMapGetRequest.class),
UNKNOWN("", ChannelName.DEFAULT, Object.class);
private final String method;
private final String channelName;
private final Class classType;
RequestsMethodEnum(String method, String channelName, Class classType) {
this.method = method;
this.channelName = channelName;
this.classType = classType;
}
public String getMethod() {
return method;
}
public String getChannelName() {
return channelName;
}
public Class getClassType() {
return classType;
}
public static RequestsMethodEnum find(String method) {
return Arrays.stream(RequestsMethodEnum.values())
.filter(methodEnum -> methodEnum.method.equals(method))
.findAny().orElse(UNKNOWN);
}
}
定义了设备主动请求的方法枚举,包括存储配置、机场绑定、飞行任务资源等。
EventsMethodEnum.java - 事件指令枚举
public enum EventsMethodEnum {
FLIGHTTASK_PROGRESS("flighttask_progress", ChannelName.INBOUND_EVENTS_FLIGHTTASK_PROGRESS, new TypeReference<EventsDataRequest<FlighttaskProgress>>() {}),
DEVICE_EXIT_HOMING_NOTIFY("device_exit_homing_notify", ChannelName.INBOUND_EVENTS_DEVICE_EXIT_HOMING_NOTIFY, new TypeReference<DeviceExitHomingNotify>() {}),
FILE_UPLOAD_CALLBACK("file_upload_callback", ChannelName.INBOUND_EVENTS_FILE_UPLOAD_CALLBACK, new TypeReference<FileUploadCallback>() {}),
HMS("hms", ChannelName.INBOUND_EVENTS_HMS, new TypeReference<Hms>() {}),
DEVICE_REBOOT("device_reboot", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
DRONE_OPEN("drone_open", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
DRONE_CLOSE("drone_close", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
DRONE_FORMAT("drone_format", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
DEVICE_FORMAT("device_format", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
COVER_OPEN("cover_open", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
COVER_CLOSE("cover_close", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
PUTTER_OPEN("putter_open", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
PUTTER_CLOSE("putter_close", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
CHARGE_OPEN("charge_open", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
CHARGE_CLOSE("charge_close", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
ESIM_ACTIVATE("esim_activate", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
ESIM_OPERATOR_SWITCH("esim_operator_switch", ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, new TypeReference<EventsDataRequest<RemoteDebugProgress>>() {}),
OTA_PROGRESS("ota_progress", ChannelName.INBOUND_EVENTS_OTA_PROGRESS, new TypeReference<EventsDataRequest<OtaProgress>>() {}),
FILE_UPLOAD_PROGRESS("fileupload_progress", ChannelName.INBOUND_EVENTS_FILEUPLOAD_PROGRESS, new TypeReference<EventsDataRequest<FileUploadProgress>>() {}),
HIGHEST_PRIORITY_UPLOAD_FLIGHT_TASK_MEDIA("highest_priority_upload_flighttask_media", ChannelName.INBOUND_EVENTS_HIGHEST_PRIORITY_UPLOAD_FLIGHT_TASK_MEDIA, new TypeReference<HighestPriorityUploadFlightTaskMedia>() {}),
FLIGHT_TASK_READY("flighttask_ready", ChannelName.INBOUND_EVENTS_FLIGHTTASK_READY, new TypeReference<FlighttaskReady>() {}),
FLY_TO_POINT_PROGRESS("fly_to_point_progress", ChannelName.INBOUND_EVENTS_FLY_TO_POINT_PROGRESS, new TypeReference<FlyToPointProgress>() {}),
TAKE_OFF_TO_POINT_PROGRESS("takeoff_to_point_progress", ChannelName.INBOUND_EVENTS_TAKEOFF_TO_POINT_PROGRESS, new TypeReference<TakeoffToPointProgress>() {}),
DRC_STATUS_NOTIFY("drc_status_notify", ChannelName.INBOUND_EVENTS_DRC_STATUS_NOTIFY, new TypeReference<DrcStatusNotify>() {}),
JOYSTICK_INVALID_NOTIFY("joystick_invalid_notify", ChannelName.INBOUND_EVENTS_JOYSTICK_INVALID_NOTIFY, new TypeReference<JoystickInvalidNotify>() {}),
RETURN_HOME_INFO("return_home_info", ChannelName.INBOUND_EVENTS_RETURN_HOME_INFO, new TypeReference<ReturnHomeInfo>() {}),
CUSTOM_DATA_TRANSMISSION_FROM_ESDK("custom_data_transmission_from_esdk", ChannelName.INBOUND_EVENTS_CUSTOM_DATA_TRANSMISSION_FROM_ESDK, new TypeReference<CustomDataTransmissionFromEsdk>() {}),
CUSTOM_DATA_TRANSMISSION_FROM_PSDK("custom_data_transmission_from_psdk", ChannelName.INBOUND_EVENTS_CUSTOM_DATA_TRANSMISSION_FROM_PSDK, new TypeReference<CustomDataTransmissionFromPsdk>() {}),
AIRSENSE_WARNING("airsense_warning", ChannelName.INBOUND_EVENTS_AIRSENSE_WARNING, new TypeReference<List<AirsenseWarning>>() {}),
FLIGHT_AREAS_SYNC_PROGRESS("flight_areas_sync_progress", ChannelName.INBOUND_EVENTS_FLIGHT_AREAS_SYNC_PROGRESS, new TypeReference<FlightAreasSyncProgress>() {}),
FLIGHT_AREAS_DRONE_LOCATION("flight_areas_drone_location", ChannelName.INBOUND_EVENTS_FLIGHT_AREAS_DRONE_LOCATION, new TypeReference<FlightAreasDroneLocation>() {}),
OFFLINE_MAP_SYNC_PROGRESS("offline_map_sync_progress", ChannelName.INBOUND_EVENTS_OFFLINE_MAP_SYNC_PROGRESS, new TypeReference<OfflineMapSyncProgress>() {}),
POI_STATUS_NOTIFY("poi_status_notify", ChannelName.INBOUND_EVENTS_POI_STATUS_NOTIFY, new TypeReference<PoiStatusNotify>() {}),
CAMERA_PHOTO_TAKE_PROGRESS("camera_photo_take_progress", ChannelName.INBOUND_EVENTS_CAMERA_PHOTO_TAKE_PROGRESS, new TypeReference<EventsDataRequest<CameraPhotoTakeProgress>>() {}),
UNKNOWN("", ChannelName.DEFAULT, new TypeReference<>() {});
private final String method;
private final String channelName;
private final TypeReference classType;
EventsMethodEnum(String method, String channelName, TypeReference classType) {
this.method = method;
this.channelName = channelName;
this.classType = classType;
}
public String getMethod() {
return method;
}
public String getChannelName() {
return channelName;
}
public TypeReference getClassType() {
return classType;
}
public static EventsMethodEnum find(String method) {
return Arrays.stream(EventsMethodEnum.values())
.filter(methodEnum -> methodEnum.method.equals(method))
.findAny().orElse(UNKNOWN);
}
}
定义了设备上报的事件方法枚举,包括飞行任务进度、OTA 进度、文件上传进度等。
DrcUpMethodEnum.java - DRC 上行指令枚举
public enum DrcUpMethodEnum {
DRONE_CONTROL("drone_control", ChannelName.INBOUND_DRC_UP_DRONE_CONTROL, new TypeReference<DrcUpData<DroneControlResponse>>() {}),
DRONE_EMERGENCY_STOP("drone_emergency_stop", ChannelName.INBOUND_DRC_UP_DRONE_EMERGENCY_STOP, new TypeReference<DrcUpData>() {}),
HEART_BEAT("heart_beat", ChannelName.INBOUND_DRC_UP_HEART_BEAT, new TypeReference<HeartBeatRequest>() {}),
HSI_INFO_PUSH("hsi_info_push", ChannelName.INBOUND_DRC_UP_HSI_INFO_PUSH, new TypeReference<HsiInfoPush>() {}),
DELAY_INFO_PUSH("delay_info_push", ChannelName.INBOUND_DRC_UP_DELAY_INFO_PUSH, new TypeReference<DelayInfoPush>() {}),
OSD_INFO_PUSH("osd_info_push", ChannelName.INBOUND_DRC_UP_OSD_INFO_PUSH, new TypeReference<OsdInfoPush>() {}),
UNKNOWN("", ChannelName.DEFAULT, new TypeReference<>() {});
private final String method;
private final String channelName;
private final TypeReference classType;
DrcUpMethodEnum(String method, String channelName, TypeReference classType) {
this.method = method;
this.channelName = channelName;
this.classType = classType;
}
public String getMethod() {
return method;
}
public String getChannelName() {
return channelName;
}
public TypeReference getClassType() {
return classType;
}
public static DrcUpMethodEnum find(String method) {
return Arrays.stream(DrcUpMethodEnum.values())
.filter(methodEnum -> methodEnum.method.equals(method))
.findAny().orElse(UNKNOWN);
}
}
定义了 DRC(Direct Remote Control)上行方法枚举,用于实时控制。
ControlMethodEnum.java - 控制指令枚举
public enum ControlMethodEnum {
FLIGHT_AUTHORITY_GRAB("flight_authority_grab"),
PAYLOAD_AUTHORITY_GRAB("payload_authority_grab"),
DRC_MODE_ENTER("drc_mode_enter"),
DRC_MODE_EXIT("drc_mode_exit"),
FLY_TO_POINT("fly_to_point"),
FLY_TO_POINT_STOP("fly_to_point_stop"),
FLY_TO_POINT_UPDATE("fly_to_point_update"),
TAKEOFF_TO_POINT("takeoff_to_point"),
CAMERA_MODE_SWITCH("camera_mode_switch"),
CAMERA_PHOTO_TAKE("camera_photo_take"),
CAMERA_PHOTO_STOP("camera_photo_stop"),
CAMERA_RECORDING_START("camera_recording_start"),
CAMERA_RECORDING_STOP("camera_recording_stop"),
CAMERA_AIM("camera_aim"),
CAMERA_FOCAL_LENGTH_SET("camera_focal_length_set"),
GIMBAL_RESET("gimbal_reset"),
CAMERA_LOOK_AT("camera_look_at"),
CAMERA_SCREEN_SPLIT("camera_screen_split"),
PHOTO_STORAGE_SET("photo_storage_set"),
VIDEO_STORAGE_SET("video_storage_set"),
CAMERA_EXPOSURE_SET("camera_exposure_set"),
CAMERA_EXPOSURE_MODE_SET("camera_exposure_mode_set"),
CAMERA_FOCUS_MODE_SET("camera_focus_mode_set"),
CAMERA_FOCUS_VALUE_SET("camera_focus_value_set"),
IR_METERING_MODE_SET("ir_metering_mode_set"),
IR_METERING_POINT_SET("ir_metering_point_set"),
IR_METERING_AREA_SET("ir_metering_area_set"),
CAMERA_POINT_FOCUS_ACTION("camera_point_focus_action"),
DRONE_CONTROL("drone_control"),
DRONE_EMERGENCY_STOP("drone_emergency_stop"),
HEART_BEAT("heart_beat"),
POI_MODE_ENTER("poi_mode_enter"),
POI_MODE_EXIT("poi_mode_exit"),
POI_CIRCLE_SPEED_SET("poi_circle_speed_set"),
;
private final String method;
ControlMethodEnum(String method) {
this.method = method;
}
public String getMethod() {
return method;
}
}
定义了控制方法枚举,包括飞行控制、相机控制、云台控制等。
DebugMethodEnum.java - 调试指令枚举
public enum DebugMethodEnum {
DEBUG_MODE_OPEN("debug_mode_open", null),
DEBUG_MODE_CLOSE("debug_mode_close", null),
SUPPLEMENT_LIGHT_OPEN("supplement_light_open", null),
SUPPLEMENT_LIGHT_CLOSE("supplement_light_close", null),
DEVICE_REBOOT("device_reboot", null),
DRONE_OPEN("drone_open", null),
DRONE_CLOSE("drone_close", null),
DRONE_FORMAT("drone_format", null),
DEVICE_FORMAT("device_format", null),
COVER_OPEN("cover_open", null),
COVER_CLOSE("cover_close", null),
PUTTER_OPEN("putter_open", null),
PUTTER_CLOSE("putter_close", null),
CHARGE_OPEN("charge_open", null),
CHARGE_CLOSE("charge_close", null),
BATTERY_MAINTENANCE_SWITCH("battery_maintenance_switch", BatteryMaintenanceSwitchRequest.class),
ALARM_STATE_SWITCH("alarm_state_switch", AlarmStateSwitchRequest.class),
BATTERY_STORE_MODE_SWITCH("battery_store_mode_switch", BatteryStoreModeSwitchRequest.class),
SDR_WORKMODE_SWITCH("sdr_workmode_switch", SdrWorkmodeSwitchRequest.class),
AIR_CONDITIONER_MODE_SWITCH("air_conditioner_mode_switch", AirConditionerModeSwitchRequest.class),
ESIM_ACTIVATE("esim_activate", EsimActivateRequest.class),
SIM_SLOT_SWITCH("sim_slot_switch", SimSlotSwitchRequest.class),
ESIM_OPERATOR_SWITCH("esim_operator_switch", EsimOperatorSwitchRequest.class),
;
private final String method;
private final Class<? extends BaseModel> clazz;
DebugMethodEnum(String method, Class<? extends BaseModel> clazz) {
this.method = method;
this.clazz = clazz;
}
public String getMethod() {
return method;
}
public Class<? extends BaseModel> getClazz() {
return clazz;
}
public static DebugMethodEnum find(String method) {
return Arrays.stream(values()).filter(methodEnum -> methodEnum.method.equals(method)).findAny()
.orElseThrow(() -> new CloudSDKException(DebugMethodEnum.class, method));
}
}
定义了调试方法枚举,包括设备重启、无人机开关、舱门控制等。
3. 请求/响应模型文件
CommonTopicRequest.java - 通用请求模型
public class CommonTopicRequest<T> {
/**
* The command is sent and the response is matched by the tid and bid fields in the message,
* and the reply should keep the tid and bid the same.
*/
protected String tid;
protected String bid;
protected Long timestamp;
protected T data;
public CommonTopicRequest() {
}
@Override
public String toString() {
return "CommonTopicRequest{" +
"tid='" + tid + '\'' +
", bid='" + bid + '\'' +
", timestamp=" + timestamp +
", data=" + data +
'}';
}
public String getTid() {
return tid;
}
public CommonTopicRequest<T> setTid(String tid) {
this.tid = tid;
return this;
}
public String getBid() {
return bid;
}
public CommonTopicRequest<T> setBid(String bid) {
this.bid = bid;
return this;
}
public Long getTimestamp() {
return timestamp;
}
public CommonTopicRequest<T> setTimestamp(Long timestamp) {
this.timestamp = timestamp;
return this;
}
public T getData() {
return data;
}
public CommonTopicRequest<T> setData(T data) {
this.data = data;
return this;
}
}
定义了通用请求格式,包含 tid(事务ID)、bid(业务ID)、timestamp 和 data。
4. 发布/订阅文件
ServicesPublish.java- 服务指令发布DrcDownPublish.java- DRC 下行指令发布RequestsSubscribe.java- 请求订阅EventsSubscribe.java- 事件订阅ServicesSubscribe.java- 服务订阅
5. 路由文件
RequestsRouter.java- 请求路由EventsRouter.java- 事件路由StateRouter.java- 状态路由OsdRouter.java- OSD 路由DrcUpRouter.java- DRC 上行路由
总结
MQTT 指令定义采用分层结构:
- Topic 定义层:
TopicConst.java、CloudApiTopicEnum.java - 方法枚举层:
RequestsMethodEnum、EventsMethodEnum、DrcUpMethodEnum、ControlMethodEnum、DebugMethodEnum - 数据模型层:
CommonTopicRequest、TopicServicesRequest、TopicRequestsRequest等 - 发布订阅层:
ServicesPublish、DrcDownPublish等 - 路由处理层:各种 Router 类
指令类型包括:
- Services:服务指令(双向通信)
- Requests:设备请求指令(设备主动请求)
- Events:事件指令(设备主动上报)
- DRC:实时控制指令(上行/下行)
- State/OSD:状态和遥测数据
该架构支持通过 MQTT 与无人机设备进行多种类型的指令交互。
6242

被折叠的 条评论
为什么被折叠?



