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

Unable to scan all ble devices which is advertising the data

Hello, I want to scan all ble devices present near by nrf52-dk and process the data in my application. I am unable to find the scanning ble device code in nrf52 sdk. I am absolutely new in nrf development. Please give some idea.

  • A good starting point would be a BLE central example, for instance the ble_app_blinky_c in the nRF5 SDK.

    What you are looking for is handling of the BLE_GAP_EVT_ADV_REPORT event, this is typically handled by the nrf_ble_scan.c module. However you may also add it to your ble_evt_handler() in main.c and extract whatever information you want. 

    /**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT.
     *
     * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA,
     *       not all fields in the advertising report may be available.
     *
     * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA,
     *       scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start.
     */
    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;

    Kenneth

  • Thanks for reply. Just, I have tried. I have initialized "ble_gap_evt_adv_report_t ble_gap_evt_adv_report_temp_var" in main.c and printing the rssi value in "ble_evt_handler" function by "NRF_LOG_INFO("%d",ble_gap_evt_adv_report_temp_var.rssi)". Output is 0 . Can you please help me in detail what exactly, i have to do?

  • In main.c, i have found the function scan_start(). This function is being called and right after the scan_start(), i expect the scan data(UUID, data, rssi, tx_value).

Related