This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to pair nearby via RSSI

hello,

if i  want to connect to a peripheral device with strongest RSSI. I need to get the RSSI before connecting. 

and i know i can get the RSSI from event of BLE_GAP_EVT_ADV_REPORT.

But there is a lot of peripheral devices around central device. how can i distinguish which peripheral device these RSSI come from?

  • typedef struct
    {
      ble_gap_adv_report_type_t type;                  /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */
      ble_gap_addr_t            peer_addr;             /**< Bluetooth address of the peer device. If the peer_addr is resolved:
                                                            @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the
                                                            peer's identity address. */
      ble_gap_addr_t            direct_addr;           /**< Contains the target address of the advertising event if
                                                            @ref ble_gap_adv_report_type_t::directed is set to 1. If the
                                                            SoftDevice was able to resolve the address,
                                                            @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr
                                                            contains the local identity address. If the target address of the
                                                            advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
                                                            and the SoftDevice was unable to resolve it, the application may try
                                                            to resolve this address to find out if the advertising event was
                                                            directed to us. */
      uint8_t                   primary_phy;           /**< Indicates the PHY on which the primary advertising packet was received.
                                                            See @ref BLE_GAP_PHYS. */
      uint8_t                   secondary_phy;         /**< Indicates the PHY on which the secondary advertising packet was received.
                                                            See @ref BLE_GAP_PHYS. This field is set to @ref BLE_GAP_PHY_NOT_SET if no packets
                                                            were received on a secondary advertising channel. */
      int8_t                    tx_power;              /**< TX Power reported by the advertiser in the last packet header received.
                                                            This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the
                                                            last received packet did not contain the Tx Power field.
                                                            @note TX Power is only included in extended advertising packets. */
      int8_t                    rssi;                  /**< Received Signal Strength Indication in dBm of the last packet received.
                                                            @note ERRATA-153 and ERRATA-225 require the rssi sample to be compensated based on a temperature measurement. */
      uint8_t                   ch_index;              /**< Channel Index on which the last advertising packet is received (0-39). */
      uint8_t                   set_id;                /**< Set ID of the received advertising data. Set ID is not present
                                                            if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */
      uint16_t                  data_id:12;            /**< The advertising data ID of the received advertising data. Data ID
                                                            is not present if @ref ble_gap_evt_adv_report_t::set_id is set to
                                                            @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */
      ble_data_t                data;                  /**< Received advertising or scan response data. If
                                                            @ref ble_gap_adv_report_type_t::status is not set to
                                                            @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided
                                                            in @ref sd_ble_gap_scan_start is now released. */
      ble_gap_aux_pointer_t     aux_pointer;           /**< The offset and PHY of the next advertising packet in this extended advertising
                                                            event. @note This field is only set if @ref ble_gap_adv_report_type_t::status
                                                            is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */
    } ble_gap_evt_adv_report_t;

    in ble. gap.h you cat get all information you need

    each struct can distinguish  with ble_data_t                data;

    or address itself

    typedef struct
    {
        bool    is_not_empty;                   /**< Indicates that the structure is not empty. */
        deviceType cnt_type;
        uint8_t addr[BLE_GAP_ADDR_LEN];         /**< Device address. */
      
        char    dev_name[DEVICE_NAME_MAX_SIZE]; /**< Device name. */
    
      
    } scanned_device_t;
    
    

    or you can just check the adreess with  scanned_device_t in ble_m.h

    or if you are lucky the device do have device name compare with Name

    i wrote some app before i think both of this can accomplish your goal

  • hello,

    the peripheral devices have the same UUID and device name.

    and if there are 20 peripheral devices broadcasting at the same time.

    how can i distinguish which peripheral device these RSSI come from,because I want to arrange and combine the historical RSSI of all devices, remove the maximum and minimum values, and average

    Then pair nearby via RSSI.

    or what should I do if I want to pair up nearby via RSSI.

  • Try using .peer_addr in ble_gap_evt_adv_report_t which is expected to be unique

  • use phy address to distinguish I think I have  answered your question

Related