设备管理服务

设备管理服务提供了本地设备管理操作,如:设置手表左/右手佩戴方式,安装/删除应用,解绑手表,获取绑定状态等。

基本概念

DeviceManagerService(设备管理服务)

代表设备管理核心服务,集合了设置手表左/右手佩戴方式、安装/删除/获取应用信息、绑定状态管理、BLE广播管理、设置蓝牙扫描模式、蓝牙与降低功耗策略功能。

DeviceManagerServiceManager(设备管理器)

代表手表端设备管理器,提供了DeviceManagerService设备管理服务对外的一系列公开接口,例如:设置手表左/右手佩戴方式,安装/删除应用,解绑手表,获取绑定状态等。

//把设备设置为右手或左手佩戴模式
public void setWearOnRightHand(boolean isOnRightHand);

//判断设备是否佩戴在右手
public boolean isWearOnRightHand();

//卸载APP
public void deletePackage(String packageName);

//删除APP数据与缓存
public void deleteAllAppDataAndCache();

//获取与手机的绑定状态
public boolean getBondStatus();

//获取与手机定义的绑定类型
public int getBondType();

//获取绑定的手机描述符
public DeviceDescriptor getBondDescriptor();

//开启BLE广播
public void startAdvertising(AdvertiseSettings settings, AdvertiseData advertiseData, AdvertiseData scanResponse, IIwdsAdvertiseCallback callback);

//停止BLE广播
public void stopAdvertising(IIwdsAdvertiseCallback callback);

//设置蓝牙扫描模式,在保证系统功能正常运行的情况下才允许设置
public boolean setBluetoothScanMode(int mode);

//获取蓝牙扫描模式
public int getBluetoothScanMode();

IIwdsAdvertiseCallback(BLE广播回调接口)

代表BluetoothLeAdvertiseManager发BLE广播的回调接口,它是AIDL生成的接口,用户需要实现它的服务端,与android原生AdvertiseCallback提供一样的接口。

// IIwdsAdvertiseCallback.aidl
interface IIwdsAdvertiseCallback {
    void onStartSuccess(in AdvertiseSettings settingsInEffect);
    void onStartFailure(in int errorCode);
}

使用方法

1、首先通过ServiceClient对象并传递SERVICE_DEVICE_MANAGER参数连接设备管理服务 。

private ServiceClient m_serviceClient;
private DeviceManagerServiceManager m_deviceManager;
m_serviceClient = new ServiceClient(getAppContext(), ServiceManagerContext.SERVICE_DEVICE_MANAGER, mServiceCallback);
m_serviceClient.connect();

2、DeviceManagerServiceManager设备管理服务实例对象,获取到DeviceManagerServiceManager实例后就可以调用其公开接口进行设备管理相关操作了。

//在mServiceCallback的回调函数onConnected中获取DeviceManagerServiceManager实例
public void onConnected(ServiceClient serviceClient) {
    m_deviceManager = (DeviceManagerServiceManager) serviceClient.getServiceManagerContext();
    boolean isBond = m_deviceManager.getBondStatus();
    ... ...
}

绑定状态与降低功耗策略

互联服务中介绍到,互联服务中Link代表一条实际的物理连接,支持与Android系统的经典蓝牙连接(链路简称BT Link),支持与IOS系统的低功耗蓝牙连接(链路简称BLE Link),我们规定了手表同时只能与一台手机相连,因此BT Link与BLE Link同时只有一个链路在使用,另外一个不使用链路的予以关闭降低功耗。而且在使用BT Link的情况下,若链路已经连通,则可以将经典蓝牙扫描模式切换为None模式。为此就需要记录Link的类型,我们就加入了绑定状态。

绑定状态

手机与手表连接成后,双方记录下对方的设备描述符(DeviceDescripter类型,包含设备详细信息)、记录绑定状态(boolean类型,true绑定/false解绑)、记录绑定类型(目前有三种取值:君正BT绑定、君正BLE绑定、Other BLE绑定),重启后还能知道之前连接的设备,因此我们在重启后根据记录的绑定设备Link类型(BT/BLE),手表端只启动一个Link服务端,节省功耗。

约法三章:

  1. 手表与手机双方Link第一次成功连接(收到ACTION_CONNECTED_ADDRESS广播)认为绑定,手机端需要将手表设备描述符DeviceDescriptor、boolean类型绑定状态、绑定类型存储在SharedPreferences中。
    if (ConnectionServiceManager.ACTION_CONNECTED_ADDRESS.equals(action)) {
        DeviceDescriptor descriptor = intent.getParcelableExtra("DeviceDescriptor");
        synchronized (mLocked) {
            if (!mIsBondWatch) { //之前未绑定过
                mIsBondWatch = true;
                mBondDescriptor = descriptor;
                broadcastBondStatusChange(mIsBondWatch, mBondDescriptor);
                IwdsUtils.saveBondStatus(mContext, mIsBondWatch); //存储绑定状态
                IwdsUtils.saveBondDescriptor(mContext, mBondDescriptor); //存储DeviceDescripter
            }
        }
    }
        
  2. 当手机与手表远离或开关蓝牙等情况,会使Link连接断开,但绑定状态依然维持不变;需要手机端主动发起解绑请求待手表收到请求后才能解除(远程设备管理中介绍)绑定关系,清除记录存储的绑定信息。
  3. 一台手机只能与一只手表绑定,手机端需要通过记录的绑定手表设备描述符进行比较,是同一设备则连接不是就拒绝连接。

    private boolean bondAddressLocked(String pkg, String addr) {
            if (mIsBondWatch && mBondDescriptor != null
                    && !mBondDescriptor.devAddress.equals(addr)) {
                return false;
            }
        ... ...
    }

  4. 手表一旦绑定成功就不要再显示二维码,直到解除绑定关系后才显示二维码,同时手机也不弹出扫描二维码界面,直到解绑才能弹出扫描二维码界面。

降低功耗策略

Link代表实际物理链路,它分为服务端与客户端,服务端运行在手表端,实时等待客户端来连接;客户端运行在手机端,手机通过扫描手表带有蓝牙地址的二维码与之连接。

君正已经实现好的大体策略:

  1. 如果是Android系统的手机则通过BT Link连接绑定,绑定成功后手表就可将BLE Link关掉,停止BLE广播。
  2. 如果是IOS系统则通过BLE Link连接绑定,绑定成功后手表就可以将BT Link关掉,将经典蓝牙扫描模式设为None。
  3. 如果BT Link连接成功,则将经典蓝牙扫描模式设为None;若果BT Link连接断开则将经典蓝牙扫描模式设为Connectable

用户特殊需求:

  1. 有用户自己定义了BLE连接关系,使用我们的BT Link,不使用我们的BLE Link,需要我们的降低功耗策略。
  2. 有用户不需要君正的绑定状态来进行降低功耗策略,仅仅使用Link的连接状态做简单的降低功耗策略。

因此我们综合考虑了自己的大体策略和客户的特殊需求,定义了如下相关变量属性,用户可以根据需求选取使用。

1、用户需要配置key为"ro.iwds.uniconnect.enableBle"值为boolean类型的SystemProperties属性,表示是否使用君正定BLE服务

2、用户需要配置key为"ro.iwds.uniconnect.useBondState"值为boolean类型的SystemProperties属性,表示是否使用君正定义的绑定状态来执行降低功耗策略

3、用户使用自己定义的BLE连接服务需要君正的降低功耗策略,则需发action为"com.ingenic.otherBle.bondStateChange",携带key为"bond_state"的boolean(true绑定、false解绑)类型参数,君正iwds服务收到后会执行降低功耗策略

具体降低功耗策略如下图列出:

是否使用君正绑定状态降低功耗 绑定状态 绑定类型 是否使用君正BLE服务 Link连接状态 手机系统 降低功耗
false     false false   stopBleServer()
startClassBtServer()
setScanMode(Connectable)
false     false true Android stopBleServer()
startClassBtServer()
setScanMode(None)
false     true false   startBleServer()
startClassBtServer()
setScanMode(Connectable)
false     true true Android stopBleServer()
startClassBtServer()
setScanMode(None)
false     true true IOS startBleServer()
stopClassBtServer()
setScanMode(None)
true false NONE true false   startBleServer()
startClassBtServer()
setScanMode(Connectable)
true true INGENIC_BT true false Android stopBleServer()
startClassBtServer()
setScanMode(Connectable)
true true INGENIC_BT true true Android stopBleServer()
startClassBtServer()
setScanMode(None)
true true INGENIC_BLE true false IOS startBleServer()
stopClassBtServer()
setScanMode(None)
true true INGENIC_BLE true true IOS startBleServer()
stopClassBtServer()
setScanMode(None)
true true OTHER_BLE false     stopBleServer()
stopClassBtServer()
setScanMode(None)