设备配对
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}")
}
}
}绑定状态码
| 状态码 | 常量 | 说明 |
|---|---|---|
| 0 | STATUS_SUCCESS | 绑定成功 |
| -1 | ERR_BIND_USER_REFUSE | 用户拒绝 |
| -2 | ERR_BIND_USER_BINDED | 已被绑定 |
| -3 | ERR_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()