android 蓝牙ble app开发中 经常会遇到很多问题,这个时候就需要用到抓包软件进行分析,单单从现象上很难鉴定是设备固件端的问题,还是我们自己app写的不对的问题。这一点是做android的是比较纠结的,因为固件端经常是和ios通信没毛问题,android问题偶尔,这个偶尔很经常出现。(固件基于cc2540 2541)

这篇记录的内容是android app开发时遇到的,但是本身的内容却是ble协议的一些内容,ios 也是一样的下一篇会记录下抓包过程与分析。

1、知识储备:

要分析ble蓝牙包 需要懂一些ble蓝牙协议栈的内容,和一些核心概念。

最关键的几个概念

Connection Events:连接事件

这个概念比较抽象,之前看了很多解释不明白,ti 宣讲会上讲ppt讲的很清楚

简单的说就是通信建立在连接事件上,每次连接事件时才是真正的通信事件,其余时间时休眠的(低功耗)

对应在程序上就是如果连接间隔的时间设置的大于 通信间隔,就会出现数据通信不流畅,没有接收到周期性数据,数据一卡顿一卡顿时而没有时而很多


Supervision Timeout:超时时间(在这个时间内没有接收到响应就会断开)

Slave Latency:这个不好翻译,看图最实在了

理解成可以忽略的空白响应数吧


Connection Interval:连接间隔


简单的理解成连两个连接事件之间的间隔时间呗


另外还有:Advertisement InterVals 广播间隔,和名字一个意思


2、关于更新连接参数

ConnectionParameter Update Request

有阅读蓝牙协议栈和一些材料,简单的说就是主机决定连接参数的值( connection interval, slave latency, timeout),从机可以请求更新这些参数,主机决定是不是接受,接受的值是多少。所以是会出现手机接受参数后和从机请求的参数有偏差,或者甚至是拒绝(ios)。

这里不得不提到:android 和 ios 的ble开发与兼容不是一个等级。

相同点:android 和 ios 都是在手机和设备建立连接时就会默认设置这些参数,app开发是无法修改这些参数的,这些默认参数由手机厂商决定。

不同点:当产品基于功耗等的考虑是应该要修改这些参数的,都是由从机提出更新申请,ios 有保护机制当从机给的参数超过它的范围它会拒绝这些不合理参数,然后使用默认值。而android 目前(4.3 4.4)是都会接受从机的更新参数,即使不合理。这里就会照成一种 设备通信 ios可以 android出问题 而且android即使接受参数并且使用这些参数更新后还会出现和参数不和的现象,典型的就在这个timeOut上,是会比更新请求里的timeOut长而且不同手机长的时间不一样。ios 好像是长5秒


ios 的参数范围还是很有参考价值的,不然在这个范围外,ios拒绝了 ,android接受了问题就蛋疼了。

Ti 问题网站上是这么回复的ios ble参数范围:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/default.aspx这上面找具体哪个帖子没记录

The connection parameter request may be rejected if it does not comply with all of these rules:

Interval Max * (Slave Latency + 1) ≤ 2 seconds

Interval Min ≥ 20 ms

Interval Min + 20 ms ≤ Interval Max

Slave Latency ≤ 4

connSupervisionTimeout ≤ 6 seconds

Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout

注:ble协议里interVal 的范围是7.5ms - 32s


3、android连接参数的补充

ble 协议里主机是对连接参数的绝对设置权,从机只能提出更新请求是否被接受是主机决定。

手机app开发里是不存在修改这个值的api的,至少4.3 4.4 没见到,5.0不知道。BlueDroid的android ble栈源码是驱动级的,即使改了,也没用,要重新改手机的驱动文件,我是这么理解的,也不知道对不对


另外在做android ble OAD 在线更新固件时,阅读TI的sensorTag 的源码时发现它里面有个 CC_SERVICE_UUID 服务可以设置OAD连接参数。而这个连接参数修改了也就修改了我们的固件的连接参数。参看ti 的回答:

The connection control service is a separate service, and can be added by adding ccservice.c/h from Profiles/SensorProfile/. Have a look in the SensorTag project to see how it's added to the GATT server and otherwise used.

ti 的demo里有这个cc服务的添加方法,虽然和他们的回答方法不大一样,添加后确实能实现app更改更新参数的目的。


cc服务的流程也比较清晰,android主机告诉ble固件我要更新参数参数是什么什么,然后固件拿着这个参数来进行更新参请求,adnroid设备再把这个请求设成此次通信的连接参数。这个和前面所描述的android手机app开发没有主动设置连接参数的api没有矛盾,它是通过高数ble从机,从机提出更新,再完成更新确认


更多相关文章

  1. Android无线连接打印第三方开发的实现
  2. Android源码分析之WindowManager.LayoutParams属性更新过程
  3. 客觀評 Android、iOS、WP7
  4. Android下实现非启动界面Wifi连接
  5. Android无线连接打印第三方开发的实现
  6. Android(安卓)11 Beta 版正式发布!以及众多面向开发者的重磅更新
  7. android:布局参数,控件属性及各种xml的作用
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. Android 系统启动过程简略分析
  2. Android中view的简单应用---随手指移动的
  3. android 坐标布局 AbsoluteLayout
  4. Android系列之Post图片和数据
  5. Android NDK中使用LOG调试C++程序
  6. Android4.4 GPS框架分析
  7. Android Studio系列-Activity单元测试
  8. Android中带签到功能的日历(积分)
  9. IDA调试Android so文件
  10. 【Android】21.3 动画