2022.4.18
一 、Bluetooth结构
1、JAVA层
bluetooth的JAVA类 frameworks/base/core/java/android/bluetooth/
2、JNI层
frameworks/base/core/jni/android_bluetooth_开头的文件
bluez通过JNI到上层的接口
frameworks/base/core/jni/android_server_bluetoothservice.cpp
调用硬件适配层的接口system/bluetooth/bluedroid/bluetooth.c
3、bluez库
external/bluez/
bluez用户空间的库,开源的bluetooth代码,包括很多协议,生成libbluetooth.so。
4、硬件适配层
system/bluetooth/bluedroid/bluetooth.c 对硬件操作的接口
system/bluetooth/data/* 一些配置文件,复制到/etc/bluetooth/
还有其他一些测试代码和工具。
二、Bluetooth开发涉及的4种类
1、BluetoothAdapter,蓝牙适配器,可判断蓝牙设备是否可用等功能。
常用12种方法列举如下(字母顺序):
cancelDiscovery(), 取消搜索过程,在进行蓝牙设备搜索时,如果调用该方法会停止搜索。(搜索过程会持续12秒)
disable() 关闭蓝牙,也就是我们常说的禁用蓝牙。
enable() 打开蓝牙,这个方法打开蓝牙无弹出提示。若让系统提示:用户是否打开蓝牙设备:加两行代码:
Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同startActivity(enabler);
(从FirstActivity跳转到SecondActivity,然后返回FirstActivity并且获取从SecondActivity传回来的参数。reCode一般等于3。在AndroidManifest.xml里面添加蓝牙权限)
getAddress() 获取本地蓝牙地址
getDefaultAdapter() 获取默认BluetoothAdapter
getName() 获取本地蓝牙名称
getRemoteDevice(String address) 根据蓝牙地址获取远程蓝牙设备
getState() 获取本地蓝牙适配器当前状态
isDiscovering() 判断当前是否正在查找设备,是则返回true
isEnabled() 判断蓝牙是否打开,是则返回true
listenUsingRfcommWithServiceRecord(String name,UUID uuid) 根据name,UUID创建并返回BluetoothServerSocket(创建BluetoothSocket服务器端的第一步)
startDiscovery() 开始搜索
2.BluetoothDevice 描述了一个蓝牙设备
常用6种方法列举如下(字母顺序):
createRfcommSocketToServiceRecord(UUIDuuid)
根据UUID创建并返回一个BluetoothSocket(即创建BluetoothSocket)
getAddress(), getName(),使用同BluetoothAdapter
setPin , createBond, cancelPairingUserInput等隐藏方法(涉及蓝牙的自动配对,需通过java的反射调用)
3.BluetoothServerSocket 是Socket
这个类有三个方法
两个重载的
accept(), accept(inttimeout) 两者的区别后者指定了过时时间。执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!
这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接
close() 关闭
4.BluetoothSocket 跟BluetoothServerSocket相对。蓝牙通讯分为server服务器端和client客户端,它们之间使用BluetoothSocket 类的不同方法来获取数据。
一共5个方法
close() 关闭
connect() 连接
getInptuStream() 获取输入流
getOutputStream() 获取输出流
getRemoteDevice() 获取远程设备,通过设备的mac蓝牙地址(物理地址)来获取BluetoothDevice对象