Skip to content

BLE 通信

Android SDK 的蓝牙低功耗 (BLE) 通信协议说明。

BLE 架构

┌─────────────────────────────────────────────────────────────┐
│                        应用层                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                   DeviceManager                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                            │                                │
│                            ▼                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                MetaBluetoothSDK                      │   │
│  │  • GATT 客户端                                      │   │
│  │  • 服务发现                                         │   │
│  │  • 特征值读写                                       │   │
│  └─────────────────────────────────────────────────────┘   │
│                            │                                │
│                            ▼                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                   Android BLE API                    │   │
│  │  • BluetoothAdapter                                 │   │
│  │  • BluetoothGatt                                    │   │
│  │  • BluetoothGattCallback                            │   │
│  └─────────────────────────────────────────────────────┘   │
│                            │                                │
│                            ▼                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                  Mooting 智能眼镜                    │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

设备扫描

启动扫描

kotlin
// 请求权限后启动扫描
DeviceManager.getInstance().startDiscovery()

扫描回调

kotlin
class MainActivity : GlassDeviceScanListener {

    override fun onGlassDeviceScanStarted() {
        // 扫描开始,清空设备列表
        deviceList.clear()
        adapter.notifyDataSetChanged()
    }

    override fun onGlassDeviceScaned(device: MetaGlassDevice) {
        // 发现设备
        deviceList.add(device)
        adapter.notifyItemInserted(deviceList.size - 1)
    }

    override fun onGlassDeviceScanFinished() {
        // 扫描结束
        showMessage("扫描完成,发现 ${deviceList.size} 个设备")
    }
}

停止扫描

kotlin
DeviceManager.getInstance().stopDiscovery()

设备连接

连接流程

1. buildDevice()  ──→  构建设备信息
2. connect()      ──→  发起 GATT 连接
3. 服务发现       ──→  发现 BLE 服务和特征
4. sendCmd(Bind)  ──→  发送绑定命令
5. 等待响应       ──→  处理绑定结果

代码示例

kotlin
private fun connectDevice(device: MetaGlassDevice) {
    val dm = DeviceManager.getInstance()

    // 1. 构建设备
    dm.buildDevice(
        device.name,
        device.macBle,
        device.macBt,
        ByteUtil.getDeviceToken(),
        0
    )

    // 2. 发起连接
    dm.connect(
        userId = getUserId(),
        token = getToken(),
        imei = IMEIUtil.getIMEI1(this),
        enableBtConnect = true
    )

    // 3. 发送绑定命令
    if (dm.isConnected()) {
        dm.sendCmd(CmdReqBind().apply {
            timeout_period = 30000
        })
    }
}

连接状态

状态枚举

kotlin
enum class MetaGlassState {
    DISCONNECTED,    // 已断开
    CONNECTING,      // 连接中
    CONNECTED,       // 已连接
    CONNECT_FAILED,  // 连接失败
    RECONNECTING     // 重连中
}

状态监听

kotlin
MetaGlassDeviceGlobal.addGlassDeviceConnectListener { state ->
    when (state) {
        MetaGlassState.CONNECTED -> showMessage("连接成功")
        MetaGlassState.DISCONNECTED -> showMessage("已断开")
        MetaGlassState.CONNECT_FAILED -> showMessage("连接失败")
        else -> {}
    }
}

数据传输

发送命令

kotlin
// 发送命令
DeviceManager.getInstance().sendCmd(CmdReqGetBattery())

接收响应

kotlin
MetaGlassDeviceGlobal.addGlassDeviceCmdRspListener { address, response ->
    when (response.type) {
        CmdType.CMD_GET_BATTERY_INFO -> {
            val battery = response as CmdRspBattery
            showBatteryLevel(battery.level)
        }
        CmdType.CMD_BIND -> {
            handleBindResponse(response)
        }
    }
}

MTU 协商

优化数据传输效率:

kotlin
MetaGlassDeviceGlobal.addGlassDeviceMtuListener { mtu ->
    Log.d("BLE", "MTU negotiated: $mtu")
}

SPP 通信

串口协议 (Serial Port Profile) 支持:

kotlin
// 连接 SPP
MetaSPPManager.getInstance().connectSPP()

// 关闭 SPP
MetaSPPManager.getInstance().closeSPP()

// 监听 SPP 状态
MetaSPPManager.getInstance().addSPPConnectListener { connected ->
    if (connected) {
        Log.d("SPP", "SPP connected")
    }
}

断开连接

kotlin
DeviceManager.getInstance().disconnect()

Mooting 开发者文档