一,Ble 4.0简介
低功耗蓝牙,低成本、短距离、可互操作的鲁棒性无线技术,从蓝牙4.0开始支持,Android端是从Android4.3开始支持ble,但是是从android5.0开始支持手机作为外设端开发,在此(5.0)之前只能作为中央设备开发。
二,API
BluetoothAdapter 蓝牙适配器,通过它来获取蓝牙地址、蓝牙名字、绑定设备、扫描模式、蓝牙状态等参数(后面代码有详细说明)
BluetoothLeScanner 蓝牙扫描类
BluetoothDevice 蓝牙设备类
BluetoothGatt 蓝牙通信类,通过这个类来建立通信通道
BluetoothGattService 蓝牙通信通道服务类
BluetoothGattCallback:中央设备回调类。
BluetoothGattServer:外设提供数据类;
BluetoothGattServerCallback:外设回调类
BluetoothGattCharacteracteristic 蓝牙通信通道特征值类
BluetoothGattDescriptor 蓝牙通信通道特征值属性类
一个ble终端可以包含多个Service,一个Service可以包含多个Characteristic,一个Characteristic包含一个value和多个Descriptor,一个Descriptor包含一个value。其中Characteristic比较重要,用的比较多。Descriptor主要对Characteristic进行范围、单位的描述。
三,ble的分类
中央设备(central):进行扫描,启动连接,在单一或多链路层作为主机。
外围设备(periphery):广播发送者,可连接的设备,在单一链路层作为从机。
广播者(Braodcaster):广播发送者,是不可连接的设备。
观察者(Observer):扫描广播,不能够启动连接。
广播者和观察者不能建立连接。应用:温度传感器和温度显示器。
一个中央可以同时连接多个周边,但是一个周边只能连接一个中央。
四,作为中央设备示例
1.初始化Ble
private void initBle() {
//获取蓝牙管理类对象
BluetoothManager manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
//获取蓝牙适配器
adapter = manager.getAdapter();
//判断是否支持蓝牙(此处并非是Ble)
if (adapter == null) {
Log.d(tag, "该设备没有蓝牙");
return;
} else {
Log.d(tag, adapter.getAddress() //蓝牙地址
+ "\n" + adapter.getName() //蓝牙名字
+ "\n" + adapter.getBondedDevices()//已匹配的设备
+ + "\n" + adapter.getScanMode() //扫描模式
+ "\n" + adapter.getState());//状态
//判断蓝牙打开状态如果没打开直接打开
if (!adapter.isEnabled()) {
adapter.enable();
}
//当然此处也可采用,通过用户点击来打开蓝牙
// Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); //enableBtIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//context.startActivity(enableBtIntent);
}
//判定是否支持Ble
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "该设备上不支持BLE", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "该设备上支持BLE", Toast.LENGTH_SHORT).show();
}
mac.setText("本机的蓝牙mac\n" + adapter.getAddress());
}
2.扫描
// lescan开始扫描ble设备
private void startLeScan(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.e(tag,"start bleScan");
//获取扫描对象 mBluetoothLeScanner=adapter.getBluetoothLeScanner();
//扫描结果的集合
List<ScanFilter>bleScnFilter=new ArrayList<>();
bleScnFilter.add(new ScanFilter.Builder().setDeviceAddress(address).build());
//扫描设置
ScanSettings bleScanSetting= new ScanSettings.Builder().build();
//开始扫描
mBluetoothLeScanner.startScan(null, bleScanSetting, mBleScanCallback);
}else{
Log.e(tag,"build not support LeScan");
}
}
3.扫描回调
@Override
public void onBatchScanResults(List<ScanResult> results) {
super