一、status错误码
Android设备建立BLE连接时,经常会遇到Java源码中找不到的诡异status错误码,其实是因为这些错误码是定义在底层C文件中,以下为笔者从互联网整理的常见错误码及其描述:
status
status_hex
description
note
0
0x00
BLE_HCI_STATUS_CODE_SUCCESS
成功
1
0x01
BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND
2
0x02
BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER
5
0x05
BLE_HCI_AUTHENTICATION_FAILURE
6
0x06
BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING
7
0x07
BLE_HCI_MEMORY_CAPACITY_EXCEEDED
8
0x08
BLE_HCI_CONNECTION_TIMEOUT 可能已经连接到其他设备
12
0x0C
BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED
18
0x12
BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS
19
0x13
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 远程设备断开连接
20
0x14
BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES
21
0x15
BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF
22
0x16
BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION
26
0x1A
BLE_HCI_UNSUPPORTED_REMOTE_FEATURE
30
0x1E
BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS
31
0x1F
BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR
34
0x22
BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT
36
0x24
BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED
40
0x28
BLE_HCI_INSTANT_PASSED
41
0x29
BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED
42
0x2A
BLE_HCI_DIFFERENT_TRANSACTION_COLLISION
58
0x3A
BLE_HCI_CONTROLLER_BUSY
59
0x3B
BLE_HCI_CONN_INTERVAL_UNACCEPTABLE
60
0x3C
BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT
61
0x3D
BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE
62
0x3E
BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED
128
0x80
GATT_NO_RESSOURCES
129
0x81
GATT_INTERNAL_ERROR
130
0x82
GATT_WRONG_STATE
131
0x83
GATT_DB_FULL
132
0x84
GATT_BUSY
133
0x85
GATT_ERROR 多种情况,最常见的是没有及时释放BTGatt资源
135
0x87
GATT_ILLEGAL_PARAMETER
137
0x89
GATT_AUTH_FAIL
二、刚踩完的坑
1. 使用创建Service的UUID执行startLeScan()却发现啥也没有(广播已经成功启动)
原因:在启动广播时需要为AdvertiseData参数设置Service的UUID
AdvertiseData data = AdvertiseData.Builder()
...
.addServiceUuid(ParcelUuid(UUID_MY_SERVICE))
.build()
2. 连接成功之后调用gatt.getServices()得到的是null(status为GATT_SUCCESS)
原因:在使用getServices()之前必须执行discoverServices(),并在onServicesDiscovered()回调方法中使用发现的Service
3. status错误码133
原因:没有及时关闭gatt,应当在onConnectionStateChange()回调中对所有newState不为的gatt调用close()方法; 如果一次只需要建立一个连接,要在建立新连接时及时释放旧的连接,同样调用gatt.close()
4. 对Descriptor进行写操作后客户端onDescriptorWrite()回调得到执行,但是服务端的onDescriptorWriteRequest()回调未被调用
原因:onDescriptorWrite()回调执行了不一定代表数据写入成功,需要对gatt.status进行判断,只有等于GATT_SUCCESS才说明成功向服务端发送了写请求。写Descriptor失败的原因主要是要写入的数据长度超过了mtu,默认为23字节。