This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

大家好!

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