cc254x simpleBLECentral RSSI 获取更新问题
一个板子跑SimpleBLEPeripheral 做 从设备
另外一个板子使用CC2540 Development Kit套件,软件用simpleBLECentral 工程。如果使用BLE-CC254x-1.4的协议栈,central设备跟peripheral设备连上之后,按向下键,获取并在LCD上显示当前的RSSI。 这个RSSI并不能实时更新,无论central和peripheral的距离怎么改变。 除非是断开后重新连接,RSSI显示数值才会改变。
但是同样的操作,在BLE-CC254x-1.2.1的协议栈中,RSSI是能根据距离变化而改变的。
有谁知道其中原因吗,能在BLE-CC254x-1.4上优化好这个问题吗,请教如何解决?谢谢
boson,
这是已知的一个bug, 在下一版新的SDK中会修正。
谢谢!
这个是在BLE1.4的协议栈中的问题,没有源码可以修正。只好等下一个版本。但如果没有特别要求的话,可以用BLE 1.3.2版替代,1.3.2的处理是比较正确的。
- Rssi的周期获取是在Profile Role 中的center.c中实现的,提供部分回调接口供simpleBLECentral注册使用。
static const gapCentralRoleCB_t simpleBLERoleCB =
{
simpleBLECentralRssiCB, // RSSI callback
simpleBLECentralEventCB // Event callback
};
- 在APP层的simpleBLECentralRssiCB回调中只简单打印LCD。
LCD_WRITE_STRING_VALUE( "RSSI -dB:", (uint8) (-rssi), 10, HAL_LCD_LINE_1 );
- 整个routing是开始时启动一个计时器,周期为1秒。然后在center.c中的gapCentralRole_ProcessOSALMsg( )函数中处理rssi消息,调用HCI层的API接口HCI_ReadRssiCmd( pRssi->connHandle )。这也是异步的,当获取到rssi值后,系统会调用初始化时注册的simpleBLECentralRssiCB。
- 但是最终问题就在这个过程中,int8 rssi这个参数传递的永远是第一次连接或者最后一次读写GATT value时的rssi值,并不会动态地提供瞬时rssi值。其实在Advertising和Connect Event过程中,底层数据包都携带rssi参数,但是1.4 SDK没有在Connect Event中把系统传过来的rssi值透传给注册的simpleBLECentralRssiCB函数的参数int8 rssi,从而导致LCD显示的值毫无变化,除非做一次读写操作。
如果回退到SDK1.3.2版本,仍然会有显示的minor bug. 在距离较远的时候,rssi信号不强,跳变比较厉害的时候,-rssi会显示129。因为一个uint8是255,如果传入的rssi为0,-0的时候会出问题。所以在使用是,可以把这个特殊数据过滤掉,则基本不影响使用。
你好,这句话:“整个routing是开始时启动一个计时器,周期为1秒。”
是不是就是: GAPCentralRole_StartRssi( p->simpleBLEConnHandle, DEFAULT_RSSI_PERIOD );
这个里面的:“DEFAULT_RSSI_PERIOD ”,宏定义为1000。
那是否是我最小可以定义为1即1ms。在1.3.2协议栈下获取RSSI。
@Y
1)麻烦问下可以测量主机本身的rssi的值么?我是做主机的,如果可以通过哪个函数实现呢?
2)SimpleBLECentralRssiCB( uint16 connHandle, int8 rssi )
这个是么?
3)这个是在什么时候调用的呢?
4)是测量哪个rssi的值的呢?
http://blog.csdn.net/Stephen_Lu_Fahai/article/details/49893509