Ver código fonte

feat:对接无人机服务调用开启算法,关闭算法接口

yingjian.wu 3 meses atrás
pai
commit
429f625ecd

+ 43 - 7
app/src/main/java/com/paul/drone/MainActivity.java

@@ -22,17 +22,13 @@ import androidx.appcompat.app.AppCompatActivity;
 
 import com.paul.drone.activity.LoginActivity;
 import com.paul.drone.connection.DeviceConnectionManager;
-import com.paul.drone.data.RegisterRequest;
 import com.paul.drone.manager.DJISDKManager;
 import com.paul.drone.network.SessionManager;
 import com.paul.drone.repository.NetworkRepository;
 import com.paul.drone.service.MqttService;
 import com.paul.drone.util.DeviceInfoManager;
-import com.paul.drone.util.mqtt.MqttManager;
 
-import dji.sdk.keyvalue.key.FlightControllerKey;
 import dji.sdk.keyvalue.value.common.LocationCoordinate2D;
-import dji.v5.manager.KeyManager;
 import dji.v5.manager.SDKManager;
 import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 import io.reactivex.rxjava3.disposables.CompositeDisposable;
@@ -70,6 +66,8 @@ public class MainActivity extends AppCompatActivity implements DeviceConnectionM
     private DeviceConnectionManager deviceConnectionManager;
     private Handler uiHandler;
 
+    private NetworkRepository networkRepository;
+
     // 状态变量
     private boolean isSDKInitialized = false;
     private boolean isDroneConnected = false;
@@ -217,6 +215,7 @@ public class MainActivity extends AppCompatActivity implements DeviceConnectionM
     private void initData() {
         sessionManager = new SessionManager(this);
         uiHandler = new Handler(Looper.getMainLooper());
+        networkRepository = NetworkRepository.getInstance(); // 假设 NetworkRepository 也是一个单例
         // 检查 SDK 初始化状态
         isSDKInitialized = DJISDKManager.getInstance().isSDKRegistered();
         Log.i(TAG, "MainActivity 初始化完成");
@@ -363,6 +362,43 @@ public class MainActivity extends AppCompatActivity implements DeviceConnectionM
         });
     }
 
+    @Override
+    public void onDroneTakeoff() {
+        // 在这里处理无人机起飞后的逻辑
+        Log.d(TAG, "无人机起飞了!更新UI或执行任务。");
+        //获取设备序列号
+        String flySerialNumber = DeviceInfoManager.getInstance().getFlySerialNumber();
+        // 使用 NetworkRepository 发送验证码
+        disposables.add(networkRepository.openUav(flySerialNumber,0)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(
+                        response -> {
+                        },
+                        throwable -> {
+
+                        }
+                ));
+    }
+
+    @Override
+    public void onDroneLanding() {
+        // 在这里处理无人机降落后的逻辑
+        Log.d(TAG, "无人机降落了!");
+        //获取设备序列号
+        String flySerialNumber = DeviceInfoManager.getInstance().getFlySerialNumber();
+        disposables.add(networkRepository.openUav(flySerialNumber,1)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(
+                        response -> {
+                        },
+                        throwable -> {
+
+                        }
+                ));
+    }
+
     private void registerDevice(){
         String flySerialNumber = DeviceInfoManager.getInstance().getFlySerialNumber();
         String productOrCameraType = DeviceInfoManager.getInstance().getModelByDroneTypeEnum(0);
@@ -572,9 +608,9 @@ public class MainActivity extends AppCompatActivity implements DeviceConnectionM
         super.onPause();
         Log.d(TAG, "onPause: 应用进入后台");
         // 应用退到后台时,取消注册设备连接状态回调以减少资源消耗
-        if (deviceConnectionManager != null) {
-            deviceConnectionManager.unregisterCallback(TAG);
-        }
+//        if (deviceConnectionManager != null) {
+//            deviceConnectionManager.unregisterCallback(TAG);
+//        }
     }
 
     @Override

+ 29 - 0
app/src/main/java/com/paul/drone/data/MobileAlgoRequest.java

@@ -0,0 +1,29 @@
+package com.paul.drone.data;
+
+import com.google.gson.annotations.SerializedName;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * 告知服务端无人机起飞降落
+ */
+@Data
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class MobileAlgoRequest {
+
+    @SerializedName("deviceSn")
+    private String deviceSn;
+
+    /**
+     * 操作类型 θ开启 1停止 2重启 3重设参数 画电子围栏
+     */
+    @SerializedName("operType")
+    private Integer operType;
+}

+ 25 - 0
app/src/main/java/com/paul/drone/data/MobileAlgoResponse.java

@@ -0,0 +1,25 @@
+package com.paul.drone.data;
+
+import com.google.gson.annotations.SerializedName;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Data
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class MobileAlgoResponse {
+    @SerializedName("code")
+    private int code;
+
+    @SerializedName("msg")
+    private String msg;
+
+    @SerializedName("data")
+    private Object data;
+}

+ 8 - 0
app/src/main/java/com/paul/drone/network/ChinaTowerApiService.java

@@ -1,5 +1,7 @@
 package com.paul.drone.network;
 
+import com.paul.drone.data.MobileAlgoRequest;
+import com.paul.drone.data.MobileAlgoResponse;
 import com.paul.drone.data.OAuth2TokenResponse;
 import com.paul.drone.data.RefreshTokenResponse;
 import com.paul.drone.data.RegisterRequest;
@@ -84,4 +86,10 @@ public interface ChinaTowerApiService {
     Call<UpdateInfoResponse> checkUpdate(
             @Body UpdateInfoRequest request
     );
+
+    @POST("hntt-uav/uav/algo/mobile/open")
+    Call<MobileAlgoResponse> uavOpen(
+            @Header("Authorization") String authorization,
+            @Body MobileAlgoRequest request
+    );
 }

+ 40 - 2
app/src/main/java/com/paul/drone/repository/NetworkRepository.java

@@ -6,6 +6,8 @@ import android.util.Log;
 import androidx.annotation.OptIn;
 import androidx.media3.common.util.UnstableApi;
 
+import com.paul.drone.data.MobileAlgoRequest;
+import com.paul.drone.data.MobileAlgoResponse;
 import com.paul.drone.data.OAuth2TokenResponse;
 import com.paul.drone.data.RefreshTokenResponse;
 import com.paul.drone.data.RegisterRequest;
@@ -45,8 +47,8 @@ import retrofit2.converter.gson.GsonConverterFactory;
 public class NetworkRepository {
     private static final String TAG = NetworkRepository.class.getSimpleName();
 
-//    private static final String BASE_URL = "http://111.22.178.69:53064";
-    private static final String BASE_URL = "https://hunan-ib.chinatowercom.cn";
+    private static final String BASE_URL = "http://111.22.178.69:53064";
+    //private static final String BASE_URL = "https://hunan-ib.chinatowercom.cn";
     private static final int NETWORK_TIMEOUT = 30000; // 30秒超时
 
 
@@ -386,6 +388,42 @@ public class NetworkRepository {
                 .observeOn(AndroidSchedulers.mainThread());
     }
 
+
+    /**
+     * 告知服务端无人机状态
+     * @param deviceSn
+     * @param operationType
+     * @return
+     */
+    public Single<MobileAlgoResponse> openUav(String deviceSn,Integer operationType) {
+        return Single.fromCallable(() -> {
+                    // 检查token是否有效
+                    String token = getValidToken();
+                    if (token == null) {
+                        Log.e(TAG, "没有有效的token");
+                        throw new IOException("没有有效的token,请先登录");
+                    }
+
+
+                    try {
+                        retrofit2.Response<MobileAlgoResponse> response = chinaTowerApiService.uavOpen(
+                                "Bearer "+sessionManager.fetchAuthToken(),
+                                new MobileAlgoRequest(deviceSn,operationType)
+                        ).execute();
+                        if (response.isSuccessful() && response.body() != null && response.code() == 200) {
+                            Log.i(TAG, "告知服务端无人机状态成功: " + response.body());
+                            return response.body();
+                        } else {
+                            throw new IOException("告知服务端无人机状态失败: " + response.message());
+                        }
+                    } catch (Exception e) {
+                        Log.e(TAG, "告知服务端无人机状态异常: " + e.getMessage(), e);
+                        throw new IOException("网络请求失败: " + e.getMessage());
+                    }
+                }).subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread());
+    }
+
     /**
      * 检查用户是否已登录且token有效
      * 会自动尝试刷新即将过期的token