Android BLE蓝牙4.0开发 实现扫描、连接、通讯、获取通知、特性等 (一、打开蓝牙 进行扫描)

目录

首先说下蓝牙4.0 

目前android蓝牙有2种:

ble蓝牙开发流程:

1、首先当然是进行权限申请啦:

2、获取蓝牙适配器 BluetoothAdapter

3、打开蓝牙

4、关闭蓝牙

5、在onActivityResult中获取打开蓝牙结果 (蓝牙的状态也会通过广播方式返回)

6、成功打开蓝牙后就可以进行蓝牙的扫描操作了

7、接下来就是关闭扫描蓝牙 其5.0之后也是有变化

8、连接蓝牙准备


 

7、接下来就是关闭扫描蓝牙 其5.0之后也是有变化


首先说下蓝牙4.0 

蓝牙 4.0 是 2012 年最新蓝牙版本,是 3.0 的升级版本;较 3.0 版本更省电、成本低、3 毫秒低延
迟、超长有效连接距离、AES-128 加密等。 
蓝牙 4.0 最重要的特性是省电,极低的运行和待机功耗可以使一粒纽扣电池连续工作数年之久。
此外,低成本和跨厂商互操作性,3 毫秒低延迟、AES-128 加密等诸多特色,可以用于计步器、心律
监视器、智能仪表、传感器物联网等众多领域,大大扩展蓝牙技术的应用范围。 
模块做为智能手机外设的桥梁,使得主机端应用开发异常简单。在桥接模式下(串口), 用户的
现有产品或者方案配合此透传模块,能十分方便地和移动设备(需支持蓝牙 4.0)相互通讯,实现超强
的智能化控制和管理(抄写于BLE4.0贴片模块手册)

目前android蓝牙有2种:

1)蓝牙2.0

传统蓝牙适用于电池使用强度较大的操作,例如 Android 设备之间的流式传输和通信等

当然速度也比较快 (128byte/5ms 这是理想速度

Android Developer中也有比较详细的教程:

蓝牙|Android Developers

2) 蓝牙4.0 Ble

因为是低功耗的蓝牙 所以其传输速度也是慢很多 它的速度可设置 一般默认为连接间隔为 20 ms 每个无线包最大载荷为 20 个字节。也就是说 理想速度为20byte/20ms 实际上其传输速度是会变化的 (20byte/30ms~到20byte/50ms之间)

当然Android Developer中也有教程但是没有中文的:

BLE|Android Developers

 

ble蓝牙开发流程:

 

1、首先当然是进行权限申请啦:

在AndroidManifest 中添加 

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> //蓝牙设置 、扫描

Android 6.0后面版本需要添加位置权限才可扫描到设备

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Android10(Q)扫描需要打开位置信息 不然扫描不到蓝牙

官方的提示

位置权限为私密权限6.0后需要动态申请(我使用RxPermissions 申请权限)

public void requestMustPermissionsEach(String permission, OnPermissionListener listener) {
        mRxPermissions
                .requestEach(permission)
                .subscribe(permission1 -> {
                    if (listener != null) {
                        if (permission1.granted) {
                            // 'permission' 授权通过!
                            
                        } else if (permission1.shouldShowRequestPermissionRationale) {
                            //拒绝 没有点击不再提醒

                        } else {
                            //拒接 点击不在提醒

                        }
                    }
                });

    }

在AndroidManifest 中声明应用只支持蓝牙4.0

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

或者在代码中进行判断

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}

2、获取蓝牙适配器 BluetoothAdapter

BluetoothAdapter mBleAdapter = BluetoothAdapter.getDefaultAdapter();

3、打开蓝牙

public void openBle() {
        if (!mBleAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            //REQUEST_ENABLE_BT 是设置 requestCode 以便在onActivityResult判断为蓝牙打开结果
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
    }

4、关闭蓝牙

 public void closeBle() {
        if (mBleAdapter != null) {
            mBleAdapter.disable();
        }
    }

5、在onActivityResult中获取打开蓝牙结果 (蓝牙的状态也会通过广播方式返回)

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //打开蓝牙成功
        if (requestCode == BleSearchPresenter.REQUEST_ENABLE_BT && resultCode == Activity.RESULT_OK) {
              //执行蓝牙打开后的操作
        }
    }

6、成功打开蓝牙后就可以进行蓝牙的扫描操作了

在 5.0 后有新的扫描方法 在之前的被弃用了 (官方不推荐使用)

5.0之前的扫描方式

  public void startSearchBle() {
     if (!mBleAdapter.isEnabled()) {
            openBle();
            return;
        }

       //暂停扫描需要用到mLeScanCallback 所以定义为全局变量 扫描结果在此回调
      mLeScanCallback = (device, rssi, scanRecord) -> {
                //device 为扫描到的蓝牙设备属性
                //rssi 为扫描到蓝牙信号
                //scanRecord 扫描结果的列表
                String BleMac =  device.getAddress();//蓝牙物理地址 连接蓝牙是会用到
                String BleName = device.getName();//蓝牙名称

            };
     mBleAdapter.startLeScan(mLeScanCallback);
    }

5.0之后的扫描方式

public void startSearchBle() {
        if (!mBleAdapter.isEnabled()) {
            openBle();
            return;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mBleScanner = mBleAdapter.getBluetoothLeScanner();
            mScanCallback = new ScanCallback() {
                @Override
                public void onScanResult(int callbackType, ScanResult result) {
                    super.onScanResult(callbackType, result);

                   //扫描结果的返回

                    //获取蓝牙设备
                   BluetoothDevice btDevice = result.getDevice()
                       //获取蓝牙信号
                   int rssi = result.getRssi()
                }

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

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

7、接下来就是关闭扫描蓝牙 其5.0之后也是有变化

5.0之前

public void stopSearchBle() { 
    if (mLeScanCallback != null) {
                mBleAdapter.stopLeScan(mLeScanCallback);
                mLeScanCallback = null;
            }
}

5.0之后

 public void stopSearchBle() {
     if (mBleScanner != null && mScanCallback != null) {
                mBleScanner.stopScan(mScanCallback);
                mScanCallback = null;
            }
}

8、连接蓝牙准备

   1)需要蓝牙的物理地址进行连接蓝牙

     蓝牙的物理地址可通过蓝牙扫描时 获得的device 中获取mac地址

   下一步、连接

9、推荐蓝牙框架:

  FastBle

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值