单片机蓝牙模块与手机蓝牙通信(1)

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)   根据nameUUID创建并返回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对象 


版权声明:本文为zysrmysc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。