# 0、写在前面的话
- 这个项目是自己学习和调试android的bluetooth的BLE的demo程序,是在leesonzhong同学的android-ble基础上调试(https://gitee.com/leesonzhong/android-ble),不是自己的原创文字。仅用于学习之用。
# 一、蓝牙BLE
- 蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙(BLE)。
- 蓝牙4.0标准包括传统蓝牙模块部分和低功耗蓝牙模块部分,是一个双模标准。低功耗蓝牙也是建立在传统蓝牙基础之上发展起来的,并区别于传统模块,最大的特点就是成本和功耗降低,应用于实时性要求比较高。
- 在BLE协议中,有两个角色,周边(Periphery)和中央(Central);周边是数据提供者,中央是数据使用/处理者,一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央。
首先使用蓝牙就不得不说BluetoothGatt和BluetoothGattCallback这两个类,该类继承自BluetoothProfile,BluetoothGatt作为中央来使用和处理数据,通过BluetoothGatt可以连接设备(connect),发现服务(discoverServices),并把相应地属性返回到BluetoothGattCallback,BluetoothGattCallback返回中央的状态和周边提供的数据。
# 二、开发BLE安卓应用
- 参考网址https://www.jianshu.com/p/2dba7f067372,android蓝牙BLE(一) —— 扫描
- 新建工程。在工程的AndroidManifest添加蓝牙权限
```
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
```
在Activity也要动态申请权限,添加下面代码,在启动蓝牙功能前调用initPermission方法申请权限。
```
//申请多个权限
//1、首先声明一个数组permissions,将需要的权限都放在里面
String[] permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};
//2、创建一个mPermissionList,逐个判断哪些权限未授予,未授予的权限存储到mPerrrmissionList中
List<String> mPermissionList = new ArrayList<>();
private final int mRequestCode = 200;//权限请求码
//权限判断和申请
private void initPermission() {
mPermissionList.clear();//清空没有通过的权限
//逐个判断你要的权限是否已经通过
for (int i = 0; i < permissions.length; i++) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission( permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);//添加还未授予的权限
}
}
}
//申请权限
if (mPermissionList.size() > 0) {//有权限没有通过,需要申请
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissions, mRequestCode);
}
}
}
@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {
switch (permsRequestCode) {
case 200:{
initPermission();
}break;
}
}
```
- 获取BluetoothManager和BluetoothAdapt,BluetoothAdapt具备启动蓝牙和扫描蓝牙列表的功能。
```
//首先获取BluetoothManager
BluetoothManager bluetoothManager=(BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
//获取BluetoothAdapter
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();
```
- 判断蓝牙是否开启,蓝牙开启后开始扫描。
```
if (!mBluetoothAdapter.isEnabled()) {
boolean enable = mBluetoothAdapter.enable(); //返回值表示 是否成功打开了蓝牙功能
if (enable){
return;
}
}
if(android.os.Build.VERSION.SDK_INT >= 21) {
//标记当前的为扫描状态
mScanning = true;
//获取5.0新添的扫描类
if (mBLEScanner == null){
//mBLEScanner是5.0新添加的扫描类,通过BluetoothAdapter实例获取。
mBLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
}
//开始扫描
//mScanCallback是ScanCallback实例。
mBLEScanner.startScan(mScanCallback);
} else {
//标记当前的为扫描状态
mScanning = true;
//5.0以下 开始扫描
//mLeScanCallback是BluetoothAdapter.LeScanCallback实例
mBluetoothAdapter.startLeScan(mLeScanCallback);
}
//超过SCAN_TIME时间后停止搜索
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//停止扫描设备
if(android.os.Build.VERSION.SDK_INT >= 21) {
//标记当前的为未扫描状态
mScanning = false;
mBLEScanner.stopScan(mScanCallback);
} else {
//标记当前的为未扫描状态
mScanning = false;
//5.0以下 停止扫描
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
}, SCAN_TIME);
```
- 扫描的方法需要提供对应的callback,callback类里面的函数里面可以得到扫描得到的蓝牙列表。可以用个列表数组添加扫描得到的设备,记得在开始扫描蓝牙前把列表数组清空。
```
/**
* 搜索蓝牙的结果
*/
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
//在这里可以把搜索到的设备保存起来
//device.getName();获取蓝牙设备名字
//device.getAddress();获取蓝牙设备mac地址
//这里的rssi即信号强度,即手机与设备之间的信号强度。
if(device.getName()==null){
return;
}
for(int i=0; i<bluetoothDeviceArrayList.size(); i++){
if(device.getAddress().equals(bluetoothDeviceArrayList.get(i).getAddress())){
return;
}
}
bluetoothDeviceArrayList.add(device);
}
};
private ScanCallback mScanCallback = new ScanCallback() {
//当一个蓝牙ble广播被发现时回调
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
//扫描类型有开始扫描时传入的ScanSettings相关
//对扫描到的设备进行操作。如:获取设备信息。
BluetoothDevice device = result.getDevice();
if(device.getName()==null){
return;
}
for(int i=0; i<bluetoothDeviceArrayList.size(); i++){
if(device.getAddress().equals(bluetoothDeviceArrayList.get(i).getAddress())){
return;
}
}
bluetoothDeviceArrayList.add(device);
}
//批量返回扫描结果
//@param results 以前扫描到的扫描结果列表。
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
}
//当扫描不能开启时回调
没有合适的资源?快使用搜索试试~ 我知道了~
CC2541Client.zip
共1390个文件
flat:505个
dex:203个
class:201个
需积分: 14 6 下载量 143 浏览量
2021-10-28
11:07:01
上传
评论
收藏 8.92MB ZIP 举报
温馨提示
BLE主机程序,实现与BLE模块的双向通信
资源推荐
资源详情
资源评论
收起资源包目录
CC2541Client.zip (1390个子文件)
$CACHE_FILE$ 4KB
$CACHE_FILE$ 4KB
+f06lRKgfLjqQL20Qs0bBb3+WlM= 38KB
+vC8LL_btXAyEaBe6gi+zDuPfig= 118KB
+vC8LL_btXAyEaBe6gi+zDuPfig= 118KB
0j413oaF2RwPrR5oGhYEQBq03NI= 34KB
0j413oaF2RwPrR5oGhYEQBq03NI= 34KB
0RpoWCxEJlWPzgc0jl3jPMu0Zhg= 11KB
0RpoWCxEJlWPzgc0jl3jPMu0Zhg= 11KB
2Cn+CMe2+kSm1p5pslEnO9LTCRk= 162KB
2Cn+CMe2+kSm1p5pslEnO9LTCRk= 162KB
3V0HU4dgKqgf17Gl0EdXoOnwChs= 31KB
3V0HU4dgKqgf17Gl0EdXoOnwChs= 31KB
4UEYrpWFXJbkKuUEWmz5OCfuYeg= 8KB
4UEYrpWFXJbkKuUEWmz5OCfuYeg= 8KB
4vwPvy4Bbt06AReyKEhx8o1SlAo= 54KB
4vwPvy4Bbt06AReyKEhx8o1SlAo= 54KB
50ZSIQMrukvgXP7Pk01yIeL_3dM= 15KB
50ZSIQMrukvgXP7Pk01yIeL_3dM= 15KB
7FhCVgIUHaxSf_YK9rvyRj7BPPk= 609KB
7FhCVgIUHaxSf_YK9rvyRj7BPPk= 609KB
8ZGWJmEafbpNkqZfzL9zuRdL3cw= 33KB
8ZGWJmEafbpNkqZfzL9zuRdL3cw= 33KB
9K8hcSKu7eyTcpQScChrANE_7w4= 704KB
9K8hcSKu7eyTcpQScChrANE_7w4= 704KB
_1tNwQuSijHB2bCIspEPHvssriI= 20KB
_1tNwQuSijHB2bCIspEPHvssriI= 20KB
aiCXZ6eD6QTmxM0M6g35I0FcuYs= 25KB
aiCXZ6eD6QTmxM0M6g35I0FcuYs= 25KB
resources-debug.ap_ 574KB
app-debug.apk 1.66MB
gradlew.bat 2KB
executionHistory.bin 1.95MB
classAnalysis.bin 881KB
fileHashes.bin 243KB
outputFiles.bin 88KB
taskHistory.bin 23KB
resourceHashesCache.bin 18KB
last-build.bin 1B
R$styleable.class 38KB
R$styleable.class 28KB
R$style.class 21KB
R$style.class 21KB
BLEDemoActivity.class 14KB
R$attr.class 14KB
R$attr.class 11KB
R$styleable.class 11KB
R$color.class 9KB
R$dimen.class 7KB
R$dimen.class 7KB
R$drawable.class 6KB
R$id.class 6KB
BLEDemoActivity$10.class 5KB
R$drawable.class 5KB
R$color.class 5KB
R$id.class 4KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$attr.class 3KB
R$string.class 3KB
HexTextWatcher.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$styleable.class 3KB
R$string.class 3KB
R$layout.class 2KB
R$layout.class 2KB
BLEDemoActivity$4.class 2KB
BLEDemoActivity$6.class 2KB
BLEDemoActivity$3.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$dimen.class 2KB
R$id.class 2KB
R$id.class 2KB
R$id.class 2KB
R$id.class 2KB
BLEDemoActivity$8.class 1KB
BLEDemoActivity$10$2.class 1KB
R$id.class 1KB
R$id.class 1KB
R$id.class 1KB
共 1390 条
- 1
- 2
- 3
- 4
- 5
- 6
- 14
资源评论
IOT的一枚小菜鸟
- 粉丝: 15
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功