Android BLE开发遇到的几个问题

0.前言:
蓝牙有经典蓝牙和低功耗蓝牙(BLE),具体的可以去查资料,还有蓝牙设备里面的服务、特征值、UUID等等这些都不一一介绍了,找一篇文章看下就知道了,我这边只写一些我在BLE开发项目中遇到的一些问题,和大家分享下。
1.权限




2.搜索设备
//mBluetoothAdapter.startLeScan(scanCallback); 这个是旧版本的快被淘汰了,就使用新的API
bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
//开始搜索
bluetoothLeScanner.startScan(mLeScanCallback);
//结束搜索
bluetoothLeScanner.stopScan(mLeScanCallback);
3.处理搜索结果
private ScanCallback mLeScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
//处理搜索结果 我这边就是处理一下名字,可以地址或者其他的,

        if ("aaa".equals(result.getDevice().getName())) {
            bluetoothLeScanner.stopScan(mLeScanCallback);                  
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        
                mBluetoothGatt = result.getDevice().connectGatt(MainActivity.this,
                        true, gattCallback, TRANSPORT_LE);
            } else {
                mBluetoothGatt = result.getDevice().connectGatt(MainActivity.this,
                        true, gattCallback);
            }
        }
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        super.onBatchScanResults(results);
    }

    @Override
    public void onScanFailed(int errorCode) {
        super.onScanFailed(errorCode);
    }

};
4.建立连接的回调
 private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
    /**
     * 断开或连接 状态发生变化时调用
     */
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        super.onConnectionStateChange(gatt, status, newState);
        Log.v("MainactivityTest", "onConnectionStateChange()---status="+status+"-----newState="+newState);
            switch(status){
                case  BluetoothGatt.GATT_SUCCESS:
                    if (newState == BluetoothGatt.STATE_CONNECTED) {
                    //这个是去发现服务,成功才会回调onServicesDiscovered这个方法
                        gatt.discoverServices();
                    } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
                        gatt.close();
                    }
                    break;

                case BluetoothGatt.GATT_SERVER:
                    
                    break;
                case BluetoothGatt.GATT_FAILURE:
                    break;


            }
    }

    /**
     * 发现设备(真正建立连接)
     */
    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);
        /**BLE默认一次只能写20字节,不够使用需要改,我遇到过问题,之前是在onConnectionStateChange方法中调用,会和  gatt.discoverServices()冲突,一会这个成功那个不成功,所以放在这里调用 ,需要这步回调成功才能写数据,不然写入会不成功。*/
        mBluetoothGatt.requestMtu(251);
        //获取初始化服务和特征值
        List<BluetoothGattService> bluetoothGattServices = mBluetoothGatt.getServices();
        Log.v("MainactivityTest", "bluetoothGattServices=="+bluetoothGattServices.size());
        if(0==bluetoothGattServices.size()){
        

        }else {

            for (BluetoothGattService bluetoothGattService : bluetoothGattServices) {
                List<BluetoothGattCharacteristic> characteristics = bluetoothGattService.getCharacteristics();
                for (BluetoothGattCharacteristic characteristic : characteristics) {
                    int aa = 0;
                    if (Service_UUID.equals(bluetoothGattService.getUuid())) {
                        if (Characteristic_UUID.equals(characteristic.getUuid())) {
                            service = bluetoothGattService;
                            charaWrite = characteristic;
                            

                        }
                    }
                }
            }
        }
    }

    
    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        super.onCharacteristicWrite(gatt, characteristic, status);
     /**
     * 写操作的回调
     */

    }

    @Override
    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
        super.onMtuChanged(gatt, mtu, status);
		//这边可以验证是否修改成功了
    }
};
5.总结
a、权限加入在配置文件中还要在代码里写入,不然还是会不成功;
b、新的API有List<ScanFilter>,比旧的过滤条件多,可以根据自己的需求使用;
c、mLeScanCallback开始和结束搜索要用同一个;
d、重点是BluetoothGattCallback中的几个方法,学会了也差不多了。 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值