蓝牙简介
蓝牙(Bluetooth)是一种短距离的无线通信技术标准。这个名子来源于10世纪丹麦国王
Harald Blatand,英文名子是Harold Bluetooth。在无线行业协会组织人员的讨论后,有人
认为用Blatand国王的名字命名这种无线技术是再好不过了,这是因为Blatand国王将挪威、瑞
典和丹麦统一起来,这就如同这项技术将统一无线通信领域一样。至此,蓝牙的名字也就这样
定了下来。
蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协议层和采纳的其它协议层。
这4种协议中最重要的是核心协议。蓝牙的核心协议包括基带、链路管理、逻辑链路控制和适
应协议四部分。其中链路管理(LMP)负责蓝牙组件间连接的建立。逻辑链路控制与适应协议
(L2CAP)位于基带协议层上,属于数据链路层,是一个为高层传输和应用层协议屏蔽基带协
议的适配协议。
Android提供蓝牙API来执行这些不同的操作。
1. 开关蓝牙
2. 扫描其他蓝牙设备
3. 获取配对设备列表
4. 连接到通过服务发现其他设备
蓝牙管理
private BluetoothAdapter bluetoothAdapter;
//获取管理器
bluetoothAdapter= BluetoothAdapter.getDefaultAdapter();
//打开蓝牙
bluetoothAdapter.enable();
//关闭蓝牙
bluetoothAdapter.disable();
//需要的权限
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
//扫描设备
bluetoothAdapter.startDiscovery();
扫描的设备信息会通过广播的形式发上来,所以需要拦截 BluetoothDevice.ACTION_FOUND
class BluetoothReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 从 Intent 中获取搜索到的设备对象
BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Log.e("m_tag","receiv:"+dev.getName());
adapter.addDev(dev);
}
}
protected void onResume() {
super.onResume();
receiver = new BluetoothReceiver();
IntentFilter filter = new IntentFilter();
// 当搜索发现设备时发送的 action
filter.addAction(BluetoothDevice.ACTION_FOUND);
registerReceiver(receiver, filter);
Log.e("m_tag","regist");
}
取消搜索
bluetoothAdapter.cancelDiscovery();
蓝牙搜索问题
基本权限
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
Android6.0之后需要添加android.permission.ACCESSCOARSELOCATION模糊位置权限, 并且该权限需要动态申请
//搜索方法
if (bluetoothAdapter.isEnabled()) {
if (Build.VERSION.SDK_INT >= 23) {
//检测权限
int code = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
if (code != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}else{
bluetoothAdapter.startDiscovery();
}
} else {
bluetoothAdapter.startDiscovery();
}
}
通讯过程
服务端:
//基于通讯序列号创建ServerSocket
BluetoothServerSocket serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("btspp", uuid);
BluetoothSocket socket = serverSocket.accept();
//输入输出
socket.getInputStream();
socket.getOutputStream();
客户端:
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
//连接
socket.connect();
输入输出
socket.getInputStream();
socket.getOutputStream();