大疆无人机开源项目源码分析:MQTT指令定义源码分析

以下是代码中无人机 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)、timestampdata

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 指令定义采用分层结构:

  1. Topic 定义层:TopicConst.javaCloudApiTopicEnum.java
  2. 方法枚举层:RequestsMethodEnumEventsMethodEnumDrcUpMethodEnumControlMethodEnumDebugMethodEnum
  3. 数据模型层:CommonTopicRequestTopicServicesRequestTopicRequestsRequest
  4. 发布订阅层:ServicesPublishDrcDownPublish
  5. 路由处理层:各种 Router 类

指令类型包括:

  • Services:服务指令(双向通信)
  • Requests:设备请求指令(设备主动请求)
  • Events:事件指令(设备主动上报)
  • DRC:实时控制指令(上行/下行)
  • State/OSD:状态和遥测数据

该架构支持通过 MQTT 与无人机设备进行多种类型的指令交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值