Android BLE status错误码及常见问题

2,397 阅读2分钟

一、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字节。