总结篇:蓝牙开发

开发维护蓝牙项目已经18个月了,在此做一下总结

蓝牙的开发流程

先以原生的芯片为例,直接通过BluetoothAdapter enable()打开蓝牙 startDiscovery()开始搜索 通过广播接收(action:BluetoothDevice.ACTION_FOUND)找到设备getName()获取本地蓝牙名称getAddress()获取本地蓝牙地址开始createBond配对→ 成功之后连接蓝牙 之后就可以正常使用蓝牙功能(蓝牙电话,蓝牙音乐)

一般大公司开发都会有提供蓝牙芯片供应商,来维护SDK,为了盈利都会受限额度,以唯一ID标识控制数量,超过这个数量未激活的设备就会变成测试版本,或者不能正常使用,除非花钱购买。

对应其他芯片厂商是如何开发的呢?

开发的功能蓝牙设置,蓝牙电话,蓝牙音乐。那怎么样获取到蓝牙的数据,以及实现蓝牙的功能,其实不同的芯片数据传递和接受数据是不一样。有的芯片对应开发真的是以广播来传递和实现蓝牙功能的(虽然不可取,但之前也这么干了,频繁的广播操作其实对性能上肯定有很大的影响)。但是有的供应商蓝牙开发是通过AIDL实现跨进程通信,这种方式就比较轻松了。正常都会有自己的开发文档,各种定义参数来实现蓝牙的功能。以AIDL打开蓝牙开关为例:

例如:

一,蓝牙设置功能开发

1蓝牙开关

第一步:启动服务,绑定芯片SDK。

第二步绑定成功后,执行开启开关操作(获取开关状态,关闭状态下再打开开关)。

第三步,获取到芯片传回来的回调onAdapterStateChanged(int newState,int oldState,String  address)类似这种,返回状态来判断是否打开蓝牙

第四步根据回调对应显示开关状态。

第五步,需要反馈已配对的设备信息,比如retPaireDevies(int size,String[] address,String[] name);告诉你我之前已经配对过多少个设备,显示到页面上。

第六步,大部分都想要自动连接这种功能,开关一打开,就连接第一个设备,可以由app端来做,或者芯片端来做这个功能,逻辑上需要注意连接的设备顺序。

2,搜索蓝牙设备

第一步,通过AIDL请求搜索设备

第二步,通过回调获取设备信息,一般都是onDeviceFound(String address,String name)反馈回调获取设备信息

第三步,如果没有反馈设备需要根据需求一定时间段内取消搜索

3,蓝牙配对

第一步,通过AIDL请求绑定配对

第二步,手机端同意配对反馈回调,比如onDeviceBondStateChange(String address ,String name ,int oldState,int newState)

第三步,通过获取的状态判断是否绑定成功,如果绑定成功提示成功,如果失败提示失败

4.蓝牙HFP协议连接(正在蓝牙通话协议 handsFree Profile)

第一步,通过AIDL请求HFP连接

第二步,通过HFP回调比如onHFPStateChange(String address ,int oldState,int new State)

第三步,通过判断state是已连接状态,显示蓝牙设备已连接,如果A2dp|Avrcp协议没有连接提示已连接无媒体的item显示

5.蓝牙A2dp协议(高级音频分布配置文件  Advanced Audio Distribution Profile)

第一步,通过AIDL请求A2dp连接

第二步,通过A2dp回调比如onA2dpStateChange(String address ,int oldState,int new State)

第三步,通过判断state是已连接状态,如果Avrcp协议已连接显示蓝牙设备已连接,如果HFP协议没有连接显示已连接无手机的item显示

6.蓝牙Avrcp协议(音视频远程控制协议  The Audio/Video Remote Control Profile)

第一步,通过AIDL请求Avrcp连接

第二步,通过Avrcp回调比如onAvrcpStateChange(String address ,int oldState,int new State)

第三步,通过判断state是已连接状态,如果A2dp协议已连接显示蓝牙设备已连接,如果HFP协议没有连接显示已连接无手机的item显示

7,取消连接

直接通过AIDL执行取消的操作(HFP A2DP AVRCP )

8,忽略配对

直接通过AIDL执行忽略的操作unPair

二,蓝牙电话开发

1.通讯录开发(Pbap 同步联系人)

第一步,开机启动服务,绑定HFP服务,绑定pbap服务,连接Pbap协议,

第二步,通过连接回调,比如onPbapStateChange(String address,int oldState,int newState,int reason,int counts)通过state判断连接状态,或者通过reason来判断是否被拒绝

第三步,Pbap已连接,那么就需要下载联系人,通过AIDL调用下载联系人方法

第四步,通过回调,例如retPbapDownLoadedContact(PbapContact pbapContact)获取联系人信息

第五步,下载完联系人,还需要下载通话记录,通过AIDL下载通话记录

第六步,下载完通话记录,例如retPbapDownloadedCallLog(String address, String firstName, String middleName, String lastName, String number, int type, String timestamp)获取通话记录信息   type电话类型   timestamp时间戳 

第七步,显示列表

2.蓝牙电话流程

第一步,拨打电话,通过AIDL执行hfp协议的拨打电话操作

第二步,通过回调,比如onHfpCallChanged(HfpClientCall hfpClientCall)   hfpClientCall电话实体类信息

第三步,通过电话类信息获取电话状态 

比如:

 CALL_STATE_ACTIVE = 0;   通话中
 CALL_STATE_HELD = 1;  等待中
 CALL_STATE_DIALING = 2; 正在拨打
 CALL_STATE_INCOMING = 3;来电
 CALL_STATE_HELD_BY_RESPONSE_AND_HOLD = 4;三方通话接听并等待
 CALL_STATE_TERMINATED = 5挂断;

第四步,通过回调信息,显示状态,并执行一些电话功能,都会通过这个回调来控制页面显示

第五步,通过回调,比如 onHfpAudioStateChanged(String address,int prevState,int newState)来获取声音通道是在哪

比如如果当前为车载开发,声音通过newState来判断是在车机端还是在手机端出声。也可以通过AIDL调用方法转移到手机端或者车机端

3键盘拨号:

第一步,通过AIDL,执行数字按键功能,比如拨打10086通话中,输入键盘响应

三,蓝牙音乐开发

第一步,连接A2dp,Avrcp协议

第二步,通过A2dp协议获取到蓝牙音频

第三步,通过Avrcp协议获取到蓝牙ID3信息,比如歌手,专辑名,歌曲名 比如retAvrcp13ElementAttributesPlaying( int[] ints, final String[] strings )

第四步,通过Avrcp协议执行上下一曲,暂停播放功能操作

 

开发蓝牙这么长时间,客户最多的抱怨问题:

1,蓝牙连接问题    

2,蓝牙未激活问题

为什么蓝牙老连接不上,这是老生常谈的问题了,百分之99都会以手机问题不了了之,确实是手机问题,手机端主动拒绝连接,这也是没办法的事,手机咋们也没有办法去控制,但是我觉的,虽然手机端异常,但可以做一个友好提示,重新开启手机端蓝牙开关,这样对于客户来说比较可接受。

蓝牙未激活问题:使用第三方芯片肯定需要激活,要不然只能使用测试版本,为了记录到底使用了多少台机器,芯片方肯定会有服务器去记录,所以激活蓝牙肯定需要联网。连接网络之后还需要根据唯一表示来记录这个机器。看起来很完美,其实往往问题就是出现在这两点,第一点网络,偶发就是连不上网。第二点,唯一标识偶发获取不到,或者获取到的有差异。所以增加了电检业务,检测是否激活成功。虽然这样暂时性解决蓝牙未激活问题,但是也增加了工作量。

 

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万子开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值