android 蓝牙连接rtk,DJI Mobile SDK:RTK API 使用简介(Android)

本文详细介绍了如何在Android上利用DJI Mobile SDK进行RTK设置,包括检查设备RTK支持、启用RTK模块、设置网络RTK信号源、验证千寻账号、检测RTK服务状态以及处理断电续飞时的RTK连接问题。通过监听飞机连接状态并自动保存和恢复用户RTK账户信息,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文 RTK 设置流程基于 DJI SDK 4.9 版本

RTK 设置流程

设置步骤:

1eecb9e259c3dda7403d2e63f2c34b9a.png

检查设备是否 support RTK

setRtkEnabled 设置 RTK 模块可用

设置 RTK 的信号源,目前 4.9 版本仅提供了两种信号源设置,本地基站(D-RTK) 和网络 RTK。DJI 自带的平板遥控器是有与本地基站进行对频设置信号源,但本篇的讲解主要基于网络 RTK

网络 RTK 的设置需要 千寻账号

启用网络服务会去校验当前千寻账号是否可用

检测 RTK 服务是否成功启用

代码

检查设备是否支持 RTKfun isRTKSupport(): Boolean? {

return getFlightControl()?.isRTKSupported

}

启用 RTK 模块getFlightControl()?.rtk?.setRtkEnabled(enable) { p0 -> p0.toDJIResult(djiResult) }

设置 RTK 信号源getFlightControl()?.rtk?.setReferenceStationSource(ReferenceStationSource.CUSTOM_NETWORK_SERVICE){

p0 -> p0.toDJIResult(djiResult)

}

设置 RTK 信号源为网络信号,ReferenceStationSource 所支持的信号有:

NONE

BASE_STATION

CUSTOM_NETWORK_SERVICE

UNKNOWN

设置 RTK 网络账号

在设置网络账号之前,需要知道千寻账号所包含的信息:

884c4013aa97ae5f5b78d13ea65967e6.png

设置账号

val settings = NetworkServiceSettings.Builder()

.userName(userName)

.password(psw)

.ip(ip)

.port(port)

.mountPoint(mountPoint).build()

DJISDKManager.getInstance().rtkNetworkServiceProvider.customNetworkSettings = settings

启用网络 RTK 服务

1、 启用网络服务

DJISDKManager.getInstance().rtkNetworkServiceProvider.startNetworkServiceWithCompletion { djiError -> djiError.toDJIResult(djiResult) }

在启用网络账户成功之后,我们需要检测当前的账户是否可用。

2、 检测账户是否可用

DJISDKManager.getInstance().rtkNetworkServiceProvider.addNetworkServiceStateCallback {

netWorkServiceState ->

val state = netWorkServiceState.channelState

}

检测账户是一个监听的过程,他会不停的返回当前账户的设置状态,channelState 返回的是枚举类 NetworkServiceChannelState,这里列举几个常见的信息:

TRANSMITTING (已连接,即账户设置成功)

LOGIN_FAILURE (登录失败,账号错误或是过期)

AIRCRAFT_DISCONNECTED (飞机未连接)

DISABLED (当前不可用)

NETWORK_NOT_REACHABLE (当前连接设备没有网络)

READY (准备开始连接)

DISCONNECTED (服务断开)

检测 RTK 是否启动使用

DJI 提供了 setStateCallback 实时监听当前飞机是否正在使用 RTK 信号

getFlightControl()?.rtk?.setStateCallback {

rtkState ->

}


rtkState 实时返回当前 RTK 情况,包括基站、定位、GPS、北斗、卫星数量等信息,但最重要的信息是判断当前 RTK 信号是否正在被使用:

rtkState.isRTKBeingUsed()

拓展

由于电池的局限性,对于土方测量工程来说,飞完一块地表一块电池是完全不够用的,为了实现一个 feature 的完整性,我们采用断电续飞的方式,即低电量作业时返航更换电池,重新飞回到返航工作点继续剩余的飞行。但目前我们遇到的挑战是 Phantom 4 RTK 的账户信息是保存在飞机上的,更换电池时飞机就失去了 RTK 信号,这时我们需要重新设置一遍千寻的账号,重新启动 RTK 网络服务,但重复的流程会给用户带来极不友好的体验,我们需要的是在用户无感知的情况下,重新连接上 RTK 信号。

提出解决方案

用户在第一次进入应用设置 RTK 账户时,检测当前账户可用时将用户信息保存到 SharedPreferences。每次断电开机时,我们能检测到当前飞机的连接状态,我们可以根据这个状态获取到飞机是否已连接,如果连接的话,取出第一次操作时存储的用户信息,我们自动为用户设置一遍账户,并启动 RTK 网络服务。

实现

保存账户信息

if (networkServiceState.getChannelState() == NetworkServiceChannelState.TRANSMITTING) {

SpManager.putString(MeshConstant.QianXunAccount.NAME, strAccount);

SpManager.putString(MeshConstant.QianXunAccount.PASSWORD, strPassword);

SpManager.putString(MeshConstant.QianXunAccount.HOST, strHost);

SpManager.putString(MeshConstant.QianXunAccount.PORT, strPort);

SpManager.putString(MeshConstant.QianXunAccount.MOUNT, strMount);

}

连接监听

在 registerSDK 时,conComponentChange 会返回当前连接无人机的状态

mDJISDKManagerCallback = new DJISDKManager.SDKManagerCallback() {

...

public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent baseComponent, BaseComponent baseComponent1) {

if (baseComponent1 != null) {

baseComponent1.setComponentListener(new BaseComponent.ComponentListener() {

public void onConnectivityChange(boolean isConnected) {

Log.d("TAG", "onComponentConnectivityChanged: " + isConnected);

notifyStatusChange(isConnected);

}

});

}

}

这个地方为了解耦,采用了 EventBus 通知需要该状态的页面

private void notifyStatusChange(boolean isConnected) {

DJIProductEvent event = new DJIProductEvent();

event.setConnect(isConnected));

EventBus.getDefault().post(event);

}

自动注册

public void onConnectEvent(DJIProductEvent event) {

if(!event.isConnect()) return;

//todo 实现上述设置 RTK 账号步骤

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值