微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 从机能否读取主机的信号强度?

从机能否读取主机的信号强度?

时间:10-02 整理:3721RD 点击:

大家好!

    我在从机连接主机后,通过设置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了才有变化,有时干脆就不变了。不知道哪里有问题。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top