蓝牙:蓝牙是一个标准的无线通讯协议,他是通过无线电介质传输数据的
无线电:是指在自由空间(包括空气和真空)传播的电磁波
电磁波:是由同向且相互垂直的电场与磁场在空间中衍生发射的震荡粒子波,根据频率的由低到高依次可分为:无线电波,微波,红外线,可见光,紫外线,X射线,y射线
电磁波传递信息:首先把传输的声音数据信号转换为电信号,再把该电信号寄载在比该信号频率高的多的高频震荡信号,最后用发射天线以无线电波的形式向周围空间传播。在接收端,接收到这种高频震荡信号,从中取出携带的声音信号。
利用频率变换技术让低频信号控制高频震荡信号的某一参数,是这些参数随着低频信号而变化:称为调制
高频信号:称为载波
高频信号的频率:称为载频或者射频
含有信息的低频信号:称为调制信号
把经过调制的信号:称为已调信号
取出携带的低频信号:称为解调
支持:android4.3(18)及以上
【术语】
1、profile
profile可以理解为一种规范,一个标准的通信协议,它存在于从机中。蓝牙组织规定了一些标准的profile,例如 HID OVER GATT ,防丢器,心率计等。每个profile中会包含多个service,每个service代表从机的一种能力。
2、service
service可以理解为一个服务,在ble从机中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据
3、characteristic
characteristic特征值,ble主从机的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
4、descriptor
对应characteristic的描述,一个characteristic可以添加多个descriptor
5、UUID
UUID,统一识别码,我们刚才提到的service和characteristic和descriptor,都需要一个唯一的uuid来标识
a、打开蓝牙
1、BluetoothAdapter.enable()
2、startActivityForResult(){action-->BluetoothAdapter.ACTION_REQUEST_ENABLE}
相同:两种方法都可打开蓝牙。
不同点: enable方法更加编程化,无对话确认框(但在开启蓝牙访问权限时被系统拦截),跳转出一个透明的Activity并弹出是否开启蓝牙的确认对话框
b、关闭蓝牙
BluetoothAdapter.disable()
c、扫码周边设备
可通过两种方式搜索设备:
1、主动搜索回调: BluetoothAdapter.startLeScan扫码所有所有周边设备(含已经连接配对过的),通过LeScanCallback回调获取结果
2、设备发现广播:BluetoothAdapter.startDiscovery,注册BroadcastReceiver监听查找到设备的Action(BluetoothDevice.ACTION_FOUND)
差异:
① 如果同时使用则方式2优先级高于方式1(发现设备无回调) ②方式2收到广播且重复数据(重复收到发现某个设备)
③方式2会在指定时间内自动停止(会扫描到重复设备很消耗电量) ④方式1需要主动调用BluetoothAdapter.stopLeScan
汇总:ble设备扫描最好用1,经典蓝牙设备搜索最好用2,因为在某些手机上使用2不能搜索到ble设备。
d.通信:
2:扫描到的蓝牙设备对象,调用该对象的connectGatt方法可以连接到该设备,并返回BluetoothGatt对象
1.BluetoothGatt对象为通信对象,通过该对象可以写特征,读特征,写描述等等
3.为通信监听对象当我们使用BluetoothGatt对象读特征之后,设备会发送数据到BluetoothGattCallback监听对象上,我们从监听方法中可以获取设备返回的数据。