Skip to content

设备配对

Android SDK 的设备配对流程说明。

配对流程

┌─────────────────────────────────────────────────────────────┐
│                        配对流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 扫描设备                                                │
│       │                                                     │
│       ▼                                                     │
│  2. 用户选择设备                                            │
│       │                                                     │
│       ▼                                                     │
│  3. 建立 BLE 连接                                           │
│       │                                                     │
│       ▼                                                     │
│  4. 发送绑定命令 (CmdReqBind)                               │
│       │                                                     │
│       ▼                                                     │
│  5. 眼镜显示配对确认                                        │
│       │                                                     │
│       ▼                                                     │
│  6. 用户在眼镜上确认                                        │
│       │                                                     │
│       ▼                                                     │
│  7. 接收绑定结果                                            │
│       │                                                     │
│       ├──→ 成功: 进入主界面                                 │
│       └──→ 失败: 显示错误信息                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

设备 Token

配对时需要生成设备 Token:

java
// ByteUtil.java
public static String getDeviceToken() {
    long mkey = System.currentTimeMillis() / 1000;
    mkey &= 0x00FFFFFF;                    // 24位时间戳
    byte SE_KEY_PRIVATE = (byte) 0xE0;     // 安全元素
    mkey |= (SE_KEY_PRIVATE << 24);        // 组合
    return String.valueOf(mkey);
}

绑定命令

发送绑定请求

kotlin
val bindCmd = CmdReqBind().apply {
    timeout_period = 30000  // 30秒超时
}
DeviceManager.getInstance().sendCmd(bindCmd)

处理绑定响应

kotlin
private fun handleBindResponse(response: CmdRsp) {
    when (response.status) {
        STATUS_SUCCESS -> {
            // 绑定成功
            showMessage("绑定成功")
            navigateToMain()
        }
        ERR_BIND_USER_REFUSE -> {
            // 用户拒绝
            showMessage("用户拒绝了配对请求")
        }
        ERR_BIND_USER_BINDED -> {
            // 已被其他用户绑定
            showMessage("设备已被其他用户绑定")
        }
        ERR_BIND_TIMEOUT -> {
            // 超时
            showMessage("配对超时,请重试")
        }
        else -> {
            showMessage("配对失败: ${response.status}")
        }
    }
}

绑定状态码

状态码常量说明
0STATUS_SUCCESS绑定成功
-1ERR_BIND_USER_REFUSE用户拒绝
-2ERR_BIND_USER_BINDED已被绑定
-3ERR_BIND_TIMEOUT超时

完整示例

kotlin
class MainActivity : AppCompatActivity(),
    GlassDeviceScanListener,
    GlassDeviceCmdRspListener {

    private val deviceManager = DeviceManager.getInstance()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 注册监听器
        MetaGlassDeviceGlobal.addGlassDeviceScanListener(this)
        MetaGlassDeviceGlobal.addGlassDeviceCmdRspListener(this)
    }

    // 开始扫描
    private fun startScan() {
        if (checkPermissions()) {
            deviceManager.startDiscovery()
        }
    }

    // 连接设备
    private fun connectDevice(device: MetaGlassDevice) {
        showLoading("连接中...")

        deviceManager.buildDevice(
            device.name,
            device.macBle,
            device.macBt,
            ByteUtil.getDeviceToken(),
            0
        )

        deviceManager.connect(
            userId = 123,
            token = "token",
            imei = IMEIUtil.getIMEI1(this),
            enableBtConnect = true
        )
    }

    // 发送绑定
    private fun sendBind() {
        if (deviceManager.isConnected()) {
            deviceManager.sendCmd(CmdReqBind().apply {
                timeout_period = 30000
            })
        }
    }

    // 处理命令响应
    override fun onGlassDeviceCmdRsp(address: String, response: CmdRsp) {
        when (response.type) {
            CmdType.CMD_BIND -> {
                hideLoading()
                handleBindResponse(response)
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        MetaGlassDeviceGlobal.removeGlassDeviceScanListener(this)
        MetaGlassDeviceGlobal.removeGlassDeviceCmdRspListener(this)
    }
}

解绑设备

kotlin
// 发送解绑命令
DeviceManager.getInstance().sendCmd(CmdReqUnbind())

// 断开连接
DeviceManager.getInstance().disconnect()

Mooting 开发者文档