关于安卓蓝牙的一些研究

最近了解了一下安卓的蓝牙开发,大体上,蓝牙分为普通蓝牙以及BLE.这里面我们先来聊聊普通蓝牙开发,刚开始的时候

只是简单的介绍下,现在来稍微补加下自己的感受。

一:所需要用到的类

        BluetoothAdapter :蓝牙管理类,针对蓝牙的操作都要通过这个东西来操作,获得这个东西的方法

        BluetoothAdapter =  BluetoothAdapter.getDafultAdapter();

       

 BluetoothSocket :蓝牙客户端类,该类用来与其它的蓝牙进行交互(前提对方正在accept);

 bluetoothSocket = device.createRfcommSocketToserviceRecord(uuid);

 BluetoothServiceSocket :蓝牙服务器类,该类用来接收其它蓝牙给他发的消息

         bluetoothservicesocket = adapter.listenUsingRfcommWithServiceRecord(String name,String uuid);


二:开发步骤

1:请确定你的app的清单文件中有以下两个权限

<uses-permissionandroid:name="android.permission.BLUETOOTH"/>

    <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>

2:首先你需要检测手机蓝牙是否打开,如果没有打开,你就需要进行打开,打开方法有两种

  1:bluetoothadapter.enable();//直接打开,不用提醒用户是否打开蓝牙

2:activity.startActivityForresult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE))//该打开方法会请求用户是   否打 开蓝牙;

3:让自己的蓝牙被别人可以搜索到

 1:activity.startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE))

4:搜索附近的设备

 1:adapter.startDiscorvery();//该结果会在一个广播中接收

   广播:intentAction:BluetoothAdapter.ACTION_DISCOVERY_FINISHED;

       intentAction:BlueDevice.ACIOTN_FOND

5:配对或者连接

connect;bluetoothSocket.connt();该方法会开始连接对方的设备,在没有配对前会先配对

 6:创建BluetoothServerSocket 来accpet;


接下来我们来聊聊BLE开发:

1:BLE是低能耗蓝牙技术,在google4.3的时候被接入安卓,也就是说在4.3手机以下是不可以用的,除非你用一些品牌的自己的sdk,不过稳定性奇差,其实google4.3开发还是有那么点不稳定的,有时候连接上了但是获取不到服务,而有时候连接都连接不上,在BLE中有两种角色:“中心”与“周边”。就目前来讲,4.3api只能做中心,而做不了周边。其差别在于:周边是不断的往中心发送数据,而中心是接收和处理数据的地方;


2:我们来具体聊一下类,

BluetoothAdapter ;获取方法有所不同,建议通过BluetoothManger来获取系统服务来获取

BluetoothGatt :连接我们和外设的数据桥梁,所有的数据交互都是通过这个类来实现的

BluetoothGattCharacteristic :服务里面的属性,称为特征

BluetoothGattService :数据交互的实体:称为服务

3:开发步骤:

我们通过bluetoothadapte.startScan();来搜索ble设备,搜索结果在LeScanCallBack中处理。

搜索到设备后我们通过device.connectGatt(this,false,mGattCallback);方法在BluetoothGattCallback中处理

连接上了以后,我们需要调用mBluetoothGatt.discoverServices().之后我们就获取 服务了。

之后我们可以获取到每个服务中的特征,然后监听它,就可以进行操作了,


上面简单的介绍了2种蓝牙,普通蓝牙现在例子太多了,我就不介绍了,我们主要来聊聊BLE开发。

BLE 是google在android4.3引入的。目前来讲还是不太稳定(有时候会出现连接上了,但是获取不到服务,或者连接上了会立马的断开)

。ios上面的ble已经比较成熟了,自己做的时候都快把android手机给砸了,怎么那么多问题,哈哈,开玩笑、BLE开发我们首先得明白

两个概念,中心和周边。类似于我们熟悉的c/s加上android的广播机制。这里中心只得是我们的手机app,而周边测试BLE外设。为什么有

广播?我是这么理解的,周边不断的以雷达波的形式向发广播服务而中心就是用来接受周边广播的服务的。大家在头脑中构思出来这个图出来

方便理解。

目前google提供的4.3api只能让我们的android手机作为中心来接受数据,而不能写数据(至少网上上这么说的,我也没有具体的去测试),那我们就

来聊聊直接的通信吧,它们之间的通信是基于GATT协议的,从名字可以看出它是高于ATT协议的。具体来说,GATT定义了一种新的数据类型,也就是

通用配置文件协议。它的主体是服务,每一个服务中有多个特征。我的理解是服务就是周边广播的数据包,而特征类似于该数据包的功能的描述。这么理解起来

我们就简单了。google的例子其实很不错,代码也的挺好的,大家应该去看看。学习学习。不过也有一些问题:

1:如果连接上我们自己的ble设备,通过什么?

我们在搜索的时候可以在startLesan里面添加一个uuid数组,该数组是你那个ble设备广播出来的服务uuid。通过这uuid,我们就可以明白哪个设备使我们需要的。

打个比方:一个教室在上课,每个学生类似于一个ble设备。老师就是中心。每个学生不断的向外面喊道,我是某某某,而老师就听到了,当他需要张三的时候,并且也听到

了一个学生喊,我是张三。那么老师就说,张三,你起来。这样就找到了我们所需要的设备。

2:如何解决notify监听不到的问题也就是在你的log里面会出现there is a pending command ?

首先我们需要明白在周边和外设的交互中,每个特征都有3种指令,read,write,notify。当我们给一个特征设置read,write,notify的时候就相当于处理一个命令。

一定要记住的是这个处理命令是异步的,ble的底层是一个队列,每个指令在执行的时候,会依次的添加到该队列中,不过要记住的是,每个执行进入队列会有一定的时候,

如果在上一个指令进入队列的时间段中,你再执行一个指令就会报错(there is a pending command),打个比方:飞机场跑道每一次只能运行一架飞机通过,当然,这个通过是需要一定的时间的,当飞机通过,它就加入到了飞行队列。一架飞机进入跑到就类似于我们一个命令进入队列,那么我们可以想到,当一架飞机还在跑道上面进入飞行队列的时候是不允许另一加飞机进入跑道的。再回来我们的ble上面,它的底层就好像这种模型。每一个命令只有执行完了(已加入队列了)才运行第二个命令进入队列。这也就是我们经常会发现设置命令后无效,就是我们在设置的时候让多个命令同时进入队列。

那么该如何解决了?我们在执行命令后都要setwriteDescription方法。这个方法是必须的,只有通过这个方法我们才能实现多命令处理。这个方法的意思就好比飞机刚好进入进入飞行队列的那一刻的标识。所以我们应该这么做,当执行一个命令后,我们在onwrite的回调方法中进行执行第二个命令;同样的,这里建议使用队列。这里的onwrite的回调方法就相当于表明我们这个命令已经进入队列了,现在可以下一个命令进入了。这么做你就会成功的。

3:连接后会断开,这个是底层不稳定导致的,目前没有解决办法,如果哪位朋友有的话,请私信我。另外在断开后重连,有时候会获取不到服务。建议的方法是关闭蓝牙重开蓝牙,但是不一定100%成功,毕竟这些不稳定是底层的。


说了这么多,也只是我的一点感受。还有很多的问题没有发现和解决,如果哪位朋友有些问题的话,很希望可以跟你们一起讨论。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值