最近项目上需要蓝牙通信,由于以前没有接触过,所以折腾了一段时间,现在记录下蓝牙通信踩过的坑
蓝牙是一种短距离无线通信技术,具有耗电量低、成本低、安全性、稳定性、易用性等优点
文献:https://blog.csdn.net/DJY1992/article/details/10144843
一:蓝牙的用法
(一)蓝牙相关的权限
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permissionandroid:name="android.permission.BLUETOOTH" />
需要动态申请
(二)蓝牙相关介绍:低功耗蓝牙和经典蓝牙
(三)蓝牙相关的类:
1:BluetoothAdapter 蓝牙适配器,是所有蓝牙交互的入口。它可以调用startDiscovery()方法开启扫描附件的蓝牙设备, cancleDiscovery()取消扫描,通过注册广播BroadcastReceive来接受扫描到的设备,主要有如下功能
(1)、开关蓝牙设备
(2)、扫描蓝牙设备
(3)、设置/获取蓝牙状态信息,例如:蓝牙状态值、蓝牙Name、蓝牙Mac地址等;
2:BluetoothDevice表示远程的蓝牙设备,并用此类通过BluetoothSocket类可以请求连接远程设备,或查询这台设备的信息如其名称、 地址、绑定状态
3:
BluetoothServiceSocket 监听蓝牙连接的类
BluetoothSocket 蓝牙连接类
(四)Android蓝牙代码:
(1):注册蓝牙接收广播
MyBroadcastReceiver receiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothDevice.ACTION_FOUND); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(receiver, intentFilter); IntentFilter statusFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mStatusReceive, statusFilter);
(3):搜索蓝牙设备
BluetoothAdapter _bluetooth = BluetoothAdapter.getDefaultAdapter();
bluetooth.startDiscovery();
4). 创建BluetoothSocket客户端对象,进行连接
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString(UUID号));
socket.connect();
( 5)利用socket获取输入流
BluetoothSocket socket = _serverSocket.accept();
InputStream inputStream = socket.getInputStream();
二: 成熟的蓝牙框架:
implementation 'com.inuker.bluetooth:library:1.4.0',这个框架封装了蓝牙的扫描,连接,获取输入流的数据并读取整个过程
三: 分包:
由于蓝牙底层规定每个包的长度最多20byte 要传送的数据很多 所以设备分了好多包