蓝牙简介
蓝牙是一种短距离通信技术,应用广泛、普及,可使各种设备在没有电缆连接的情况下能够在近距离范围内实现相互通信或操作。细分为传统蓝牙、高速蓝牙和低功耗蓝牙模块,
- 传统蓝牙
泛指支持蓝牙协议在4.0以下的模块,细分为传统蓝牙和高速蓝牙。
- 低功耗蓝牙
BLE即蓝牙低功耗,是指蓝牙协议在4.0及以上的蓝牙模块,是一种新型的超低功耗无线传输技术,
- 传统蓝牙和低功耗蓝牙的区别
蓝牙BLE相对于传统蓝牙的优点:最大化的待机时间、快速连接和低峰值的发送/接收功耗。
Android使用蓝牙
- 首先需要在AndroidMainifest.xml中声明蓝牙权限,代码如下:
<uses-permission android:name="android.permission.BLUETOOTH"/><!--获取蓝牙权限-->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><!--允许程序发现和配对蓝牙权限-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!--通过GPS芯片接收卫星的定位信息,定位精度达10米以内-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!--通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米-->
- 检查蓝牙权限
//利用checkSelfPermission()方法,若无权限用requestPermissions申请权限
private void requestPermission() {
if (Build.VERSION.SDK_INT >= 23) {
int checkAccessFinePermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if (checkAccessFinePermission == PackageManager.PERMISSION_GRANTED) {
Log.d("this", "已有定位权限");
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
Log.e("this", "无权限,申请权限");
}
}
}
回调函数如下:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 0: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d("this", "获取权限成功 ");
} else {
Toast.makeText(MainActivity.this, "获取权限失败!", Toast.LENGTH_SHORT).show();
Log.e("this", "获取权限失败!");
}
}
break;
default:
}
}
- 创建蓝牙适配器
private BluetoothAdapter bluetoothAdapter;
bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter==null){
//设备不支持蓝牙
}
- 判断蓝牙是否打开,以及如何开启蓝牙
if(!bluetoothAdapter.isEnabled()){
//蓝牙未打开
Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startAvtivityForResult(intent,0);//这里的0就是requestCode请求码(不一定要是0),利用该方法打开蓝牙,会有一个onActivityResult()回调函数,可自己重写(快捷键ctrl+O)
}
回调函数如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0: {
if (resultCode == RESULT_OK) {
//执行打开蓝牙之后的操作
Log.d("this", "onActivityResult: 蓝牙打开成功");
} else {
Toast.makeText(MainActivity.this, "蓝牙打开失败", Toast.LENGTH_LONG).show();
}
break;
}
}
}
然后就可以去执行打开蓝牙之后的操作了,比如说扫描周围设备。
5、扫描周围设备
//利用startLeScan()方法扫描周围设备,后面可以用stopLeScan()方法停止扫描
bluetoothAdapter.startLeScan(leScanCallback);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
bluetoothAdapter.stopLeScan(leScanCallback);//停止扫描
if (bluetoothGatt == null) {
search_text.setText("搜索失败");
}
}
}, 15000);
对扫描到的设备信息可查
final BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
String address = device.getAddress();
bluetoothAdapter.stopLeScan(leScanCallback);
Log.d("this", "设备地址:" + device.getAddress());
Log.d("this", "设备名称:" + device.getName());
}
};
之后就可以去连接这些设备了