从机能否读取主机的信号强度?
大家好!
我在从机连接主机后,通过设置RSSI读周期事件
RSSI_ReadPeriod = 1000;
GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE,sizeof(uint16),&RSSI_ReadPeriod);
在调用GAPRole_StartDevice()函数时,也注册了RSSI的回调函数——简单的读取数据及打印。
发现打印出来的RSSI数值一直不变,请问这个RSSI数值是从机自身的信号强度吗?
如果是的,请问从机能否读取主机的信号强度呢?该如何做呢?
Thanks!~
shaokai,
你用HCI_ReadRssiCmd()函数去读的吗?每隔一秒读一次?
Yan:
1. 我不是调用HCI_ReadRssiCmd()函数去读的;
2. 以下是我的具体做法:
//连接状态改变时的回调函数
static gapRolesCBs_t BLEPeriphral_PeriphralCBs[] =
{
peripheralStateNotificationCB,
RSSI_ReadCB //添加回调函数,这个函数接受一个参数 int8 newRSSI 我得到的就是这个
};
//Ascii
const uint8 AscTbl[] =
{
'0','1','2','3','4','5','6','7','8','9'
};
static void RSSI_ReadCB(int8 newRSSI)
{
uint8 prt[3];
prt[0] = AscTbl[newRSSI/100];
prt[1] = AscTbl[newRSSI%100/10];
prt[2] = AscTbl[newRSSI%10];
NPI_WriteTransport("RSSI:",5);//简单的字符串打印
NPI_WriteTransport(prt,3);
NPI_WriteTransport("\n",1);
}
if(events & BLE_START_EVENT)//第二阶段初始化
{
GAPRole_StartDevice( BLEPeriphral_PeriphralCBs );
GAPBondMgr_Register(&gapBondMgrCBs);
return (events^BLE_START_EVENT);
}
在连接状态的回调函数中,当状态为“已连接”,我就设置RSSI的读周期1s
RSSI_ReadPeriod = 1000;
GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE,sizeof(uint16),&RSSI_ReadPeriod);
这样每隔1秒,RSSI_ReadCB就会被调用1次。
3. 请问我在RSSI_ReadCB这个回调函数中接收到的参数 int8 newRSSI是什么值?
Thanks
连接上以后 是可以的 ,就相当于传信息一样 ,主机的场强也可以通过特性值传给从机。
shaokai,
返回的就是RSSI的值,由于是负数,因此最高位是1, 所以你读取的时候得转换一下。
随便举个例子,比如你返回的 newRSSI 的值是 0xAD, 那么就是 10101101, 这是个负数, 你要取得它的绝对值,就去掉最高位,变成 00101101,减去1, 变成00101100, 再除最高位外取反,就是01010011, 这个就是你读到的最终的RSSI 值,0x53, 十进制就是 83,实际上就是-83dBm.
计算机负数表示方法而已。
xie
你好!我并不是想要得到主机的发送功率,而是从机接收到主机信号时的强度——距离越远,这个信号就越弱。。。
shaokai,
这个就是信号强度, RSSI。。。
主机的发射功率都是固定的,比如说0dBm, 4dBm。。。
YAN
以下是我对RSSI回调函数的修改
static void RSSI_ReadCB(int8 newRSSI)
{
uint8 prt[3];
if(newRSSI >= 0)
{
prt[0] = AscTbl[newRSSI/100];
prt[1] = AscTbl[newRSSI%100/10];
prt[2] = AscTbl[newRSSI%10];
NPI_WriteTransport("RSSI:",5);
NPI_WriteTransport(prt,3);
NPI_WriteTransport("\n",1);
}
else//负数处理
{
newRSSI -= 1;
newRSSI ^= 0XFF;//取反
prt[0] = AscTbl[newRSSI/100];
prt[1] = AscTbl[newRSSI%100/10];
prt[2] = AscTbl[newRSSI%10];
NPI_WriteTransport("RSSI:-",6);
NPI_WriteTransport(prt,3);
NPI_WriteTransport("\n",1);
}
}
但效果是:不管距离长远,打印的RSSI值一直不变,似乎不像是主机信号的强度。
shaokai,
离主机远,具体是多远呢?
另外,主机是个啥设备?
还有,你这不是有变化吗?-51 和 -57就差了啊
Yan
-51是刚连接时的值,在几秒后就自动变成了-57,这时我还没有移动设备,而之后就一直是-57了;
具体的距离是:刚建立连接时0m,后来移动主机设备5~7m;
主机设备是:Andriod4.3的手机;
我在想会不会是读写RSSI前还有其他操作或者开关什么的,被我漏掉了。。。
Yan:
我发现了一个问题:
并不是我读取RSSI数值有问题,而是我读到的RSSI数值一直没有更新过。
我在建立连接后,如果主机没有对从机进行特征值读写操作(仅保持链接状态),则从机读到的RSSI数值一直不会更新;
而一旦主机对从机进行读写操作,则会伴随着RSSI数值的更新,并且会随着距离的变化而变化。参见下图:
仅保持连接,而不进行特征值读写时RSSI的数值:
距离变化,主机对从机进行读特征值操作时,伴随的RSSI数值变化:
在HCI_ReadRssiCmd()的注释中提到:
This BT API is used to read the RSSI of the last packet received on a connection given by the connection handle
即读到的是最后一个数据包的RSSI。
但是即使没有进行数据的读写,连接事件(Connection Event)就不会更新RSSI数值吗?好像Andriod APP可以在不进行读写特征值的情况下更新RSSI数值。
请问:作为从机,除了进行特征值的读写,有没有其他办法更新RSSI的数值呢?如果有,该如何实现?
Thanks
shaokai,
理论上应该是可以了,不知道你的其他地方代码是否有影响?
没理由吖~~
找不到问题,揪心死了~
我的也是一直不变呢,,难道真的是因为没读写数据就RSSI不变吗。
Shaokai 我的协议栈也是1.3.2的,但是我没有数据收发怎么RSSI会变化呢。
Shaokai,你的问题解决了吗?我用的1.4协议栈,没有数据收发,RSSI是可以变化的,但是十分慢,有时10S了才有变化,有时干脆就不变了。不知道哪里有问题。