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

RF52 Indoor Positioning via iBeacons

Hello – My project needs to report its indoor position to the cloud (no GPS).  I intend on using known positions of iBeacons SSID/RSSI coupled with trilateration math – fully cognizant of accuracy limitations with this approach (RSSI).

I have no experience with BLE, and I do understand this is complex for someone who is new with Segger/CMSIS, Nordic (and BLE in general).  That said, I need to get it done.  I’ve selected the nRF52832 with S132.  I have both the 52832 and 52840 DK’s.

Browsing the SDK, I’ve found “experimental/ble_app_interactive” application.  When executing, the UART CLI:  “scan on”, then “devices” – I indeed see the iBeacons (no UUID, nor do I see RSSI when using the 'devices' command). 

I’ve Googled the topic of Indoor Positioning many times and the results I’m getting are limited.  Perhaps I’m searching incorrectly, or no one is taking this approach for indoor positioning.  Would anyone here have any suggestions on where to take this further? 

I envisioned the nRF52 as an observer/client & some sort of a filter policy to screen out any other Bluetooth devices except the iBeacons of interest, generate a list of, say, 5 of the top RSSI iBeacons, then ship those iBeacon SSID’s with RSSI values to the cloud for trilateration analysis.  I selected iBeacon because there are many low cost iBeacons available for purchase.

Any suggestions/thoughts/examples/URLs/etc applicable to Indoor Positioning Nordic/Cortex-M would be appreciated - I just can't seem to find much.

Many thanks.

    

  • There is no filtering in the softdevice when scanning for peripherals, so for each received advertisement packet the application will be notified by a BLE_GAP_EVT_ADV_REPORT. The SDK do have an optional scan module that can be helpful to do some filtering for you by using the nrf_ble_scan_*() api. For instance see the \examples\ble_central\ble_app_blinky_c example on init and usage.

    For each received advertisement packet you can read the rssi value by for instance:

            case BLE_GAP_EVT_ADV_REPORT:
    			rssi_value = p_ble_evt->evt.gap_evt.params.adv_report.rssi;

Related