DJI SDK 连接飞行器前的激活与绑定

整体过程如下图:

核心要点:

  • 初始化 DJI SDK 时的 DJISDKAPPKey 需要绑定到一个付费的开发者账号上(一年 99 刀),否则正式环境发布后很快 SDK 就会初始化失败。
  • 由于我国有着“先进”的管理体制,中国境内所有重量大于 250g 的飞行器必须实名才能飞行。因此如果用户使用时飞行器定位在中国,需要额外的操作:
    • 在 DJI Go 中绑定飞行器到个人。只需绑定一次。类似于车辆的行驶证,这个绑定表明了飞行器的所有者。
    • 使用时需要绑定 DJI 账户,三个月有效期。这样就可以明确三个月内使用这台飞行器的人。当然严格的说,每一次飞行都应该确认是不是这个 DJI 账户对应的人。所以 app 里如果有自己的用户体系,一个用户退出登出后应该也登出 DJI 账户。当然从用户体验来讲,这个操作不做也可以接受。 # DJIAppActivationManager 获取绑定状态 激活相关状态由 DJIAppActivationManager 管理:
 DJIAppActivationManager : NSObject
/**
 *  绑定状态的回调代理
 */ (nonatomic, weak) id<DJIAppActivationManagerDelegate> delegate;


/**
 *  DJIApp 账户绑定状态
 */ (nonatomic, readonly) DJIAppActivationState appActivationState;


/**
 *  飞行器绑定状态
 */ (nonatomic, readonly) DJIAppActivationAircraftBindingState aircraftBindingState;

 DJIAppActivationManagerDelegate <NSObject>

/**
 *  DJIApp 账户绑定状态更新
 */
-(void)manager:(DJIAppActivationManager *)manager didUpdateAppActivationState:(DJIAppActivationState)appActivationState;

/**
 *  飞行器绑定状态更新
 */
-(void)manager:(DJIAppActivationManager *)manager didUpdateAircraftBindingState:(DJIAppActivationAircraftBindingState)aircraftBindingState;

DJISDKManager 获取 appActivationManager :

self.activationState = [DJISDKManager appActivationManager].appActivationState;
self.aircraftBindingState = [DJISDKManager appActivationManager].aircraftBindingState;

DJI 账户绑定状态值

typedef NS_ENUM(NSInteger, DJIAppActivationState) {

    /**
     *  硬件不支持账户绑定
     */
    DJIAppActivationStateNotSupported,

    /**
     *  飞行器定位在中国,需要绑定 DJI 账户
     */
    DJIAppActivationStateLoginRequired,

    /**
     *  已经绑定过
     */
    DJIAppActivationStateActivated,

    /**
     *  未识别到设备或者设备不是 DJI 产品
     */
    DJIAppActivationStateUnknown = 0xFF,
};

那么如何绑定 DJI 账户呢?这个功能由 DJIUserAccountManager 管理:

 DJIUserAccountManager : NSObject
 (nonatomic, readonly) DJIUserAccountState userAccountState;
(nonatomic, readonly, nullable) NSString *loggedInDJIUserAccountName;

/**
 *  登录 DJI 账户。
 */
-(void)logIntoDJIUserAccountWithAuthorizationRequired:(BOOL)authorizationRequired
                                       withCompletion:(DJIAccountStateCompletionBlock)completion;

/**
 *  退出当前绑定的 DJI 账户
 */
-(void)logOutOfDJIUserAccountWithCompletion:(DJICompletionBlock)completion;

登录方法的 authorizationRequired 针对海外用户,表示是否要求登录账户是禁飞区授权账户,如果绑定的账户不是授权账户会再进行一次跳转。日常的场景设置为 false 就可以,只要求普通注册用户。

飞行器绑定状态值

typedef NS_ENUM (NSUInteger, DJIAppActivationAircraftBindingState) {
    /**
     *  飞行器绑定要求不确定,飞行器处于飞行限制状态
     */
    DJIAppActivationAircraftBindingStateInitial,

    /**
     *  飞行器未绑定,飞行高度会被限制在30米以下,飞行距离在50米内。需要进入 DJI Go 进行绑定
     */
    DJIAppActivationAircraftBindingStateUnbound,

    /**
     *  飞行器未绑定,但是此时飞行器没有连接过 DJI Go 或者 DJI SDK 无法连接网络,无法同步是否已经绑定过飞机。
     */
    DJIAppActivationAircraftBindingStateUnboundButCannotSync,

    /**
     *  飞行器已绑定
     */
    DJIAppActivationAircraftBindingStateBound,

    /**
     *  不用绑定
     */
    DJIAppActivationAircraftBindingStateNotRequired,

    /**
     *  硬件不支持飞行器绑定
     */
    DJIAppActivationAircraftBindingStateNotSupported,

    /**
     *  未识别到设备或者设备不是 DJI 产品
     */
    DJIAppActivationAircraftBindingStateUnknown = 0xFF,
};

AircraftBindingStateInitial

目前只有中国需要绑定飞行器,因此 SDK 或者 DJI Go 需要先检查当前所处的国家地区。如果检查后发现不在中国,状态会更新为 NotRequired。但是如果地区检查失败,飞行器会被置于限制飞行状态。用户需要去 DJI Go 更新绑定状态。

AircraftBindingStateUnboundButCannotSync

如果绑定过,连接 DJI GO 时会把绑定结果同步到飞行器。绑定结果也会同步到服务器,所以如果 SDK 连接网络也可以把绑定结果同步下来。因此这两个条件都不具备时,飞行器的状态是未绑定,但是也许飞行器已经绑定过,只是绑定结果没有同步到飞行器。
这种情况发生在刚开始绑定时飞行器是连接的状态,但是绑定成功之前飞行器的连接断开了,因此绑定结果没有同步到飞行器中。


Reference

Application Activation and Aircraft Binding

© 著作权归作者所有
这个作品真棒,我要支持一下!
奇志技术团队博客 http://meshtech.co/
1条评论
Soldier
#1

cool!

top Created with Sketch.