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

NRF52832 BLE Scan

Hi

Can I get some idea on which functions to make changes to in order to scan and report(for example on uart) the number of ble devices present in NRF52832 kit range. 

I know ble central uart example does the scan, but I don't seem to forward with which functions to start off with.

I am using NRF52832 micro devkit with softdevice s132.

Parents
  • ////////////////////////////////// RFID READER V1.0.0 2024 //////////////////////////
    /* 2024 */
    /* R&D EMBEDDED TEAM */
    /* RFID PROJECT */
    /* ACTIVE RFID & ACTIVE TAG */
    /* CENTRAL */
    /* EMPLOYEE ID 013 */
    #include <stdint.h>
    #include <stdio.h>
    #include <string.h>
    #include "nrf_sdh.h"
    #include "nrf_sdh_ble.h"
    #include "nrf_sdh_soc.h"
    #include "nrf_pwr_mgmt.h"
    #include "app_timer.h"
    #include "boards.h"
    #include "bsp.h"
    #include "bsp_btn_ble.h"
    #include "ble.h"
    #include "ble_hci.h"
    #include "ble_advertising.h"
    #include "ble_conn_params.h"
    #include "ble_db_discovery.h"
    #include "ble_lbs_c.h"
    #include "nrf_ble_gatt.h"
    #include "nrf_ble_scan.h"

    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    #include "nrf_log_default_backends.h"


    #define CENTRAL_SCANNING_LED BSP_BOARD_LED_0 /**< Scanning LED will be on when the device is scanning. */
    #define CENTRAL_CONNECTED_LED BSP_BOARD_LED_1 /**< Connected LED will be on when the device is connected. */
    #define LEDBUTTON_LED BSP_BOARD_LED_2 /**< LED to indicate a change of state of the the Button characteristic on the peer. */

    #define SCAN_INTERVAL 0x00A0 /**< Determines scan interval in units of 0.625 millisecond. */
    #define SCAN_WINDOW 0x0050 /**< Determines scan window in units of 0.625 millisecond. */
    #define SCAN_DURATION 0x0000 /**< Timout when scanning. 0x0000 disables timeout. */

    #define MIN_CONNECTION_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS) /**< Determines minimum connection interval in milliseconds. */
    #define MAX_CONNECTION_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /**< Determines maximum connection interval in milliseconds. */
    #define SLAVE_LATENCY 0 /**< Determines slave latency in terms of connection events. */
    #define SUPERVISION_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Determines supervision time-out in units of 10 milliseconds. */

    #define LEDBUTTON_BUTTON_PIN BSP_BUTTON_0 /**< Button that will write to the LED characteristic of the peer */
    #define BUTTON_DETECTION_DELAY APP_TIMER_TICKS(50) /**< Delay from a GPIOTE event until a button is reported as pushed (in number of timer ticks). */

    #define APP_BLE_CONN_CFG_TAG 1 /**< A tag identifying the SoftDevice BLE configuration. */
    #define APP_BLE_OBSERVER_PRIO 3 /**< Application's BLE observer priority. You shouldn't need to modify this value. */

    NRF_BLE_SCAN_DEF(m_scan); /**< Scanning module instance. */
    BLE_LBS_C_DEF(m_ble_lbs_c); /**< Main structure used by the LBS client module. */
    NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */
    BLE_DB_DISCOVERY_DEF(m_db_disc); /**< DB discovery module instance. */

    static char const m_target_periph_name[] = "(NORDIC)"; /**< Name of the device we try to connect to. This name is searched in the scan report data*/


    #define SCAN_LIST_REFRESH_INTERVAL 10000 // 100 sec

    static uint32_t device_number;

    #define FOUND_DEVICE_REFRESH_TIME APP_TIMER_TICKS(SCAN_LIST_REFRESH_INTERVAL) /**< Time after which the device list is clean and refreshed. */


    #define DEVICE_NAME_MAX_SIZE 20
    #define DEVICE_TO_FIND_MAX 50


    typedef struct
    {
    bool is_not_empty; /**< Indicates that the structure is not empty. */
    uint16_t size; /**< Size of manuf data. */
    uint8_t addr[BLE_GAP_ADDR_LEN]; /**< Device address. */
    char dev_name[DEVICE_NAME_MAX_SIZE]; /**< Device name. */
    uint8_t data_buffer[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; /**< Buffer for storing an manuf data. */
    uint8_t rssi ;
    } scanned_device_t;

    void device_list_print(scanned_device_t * p_device);


    scanned_device_t m_device[DEVICE_TO_FIND_MAX]; /**< Stores device info from scan data. */

    void scan_device_info_clear(void)
    {
    memset(m_device, 0, sizeof(m_device));
    device_number = 0;
    }

    /**@brief Function for printing the devices.
    *
    *@details Function print list of devices.
    *
    *
    * @param[in] device Pointer to the struct storing the scanned devices.
    */
    void device_list_print(scanned_device_t * p_device)
    {
    // We could now clear the list:
    scan_device_info_clear();

    }

    scanned_device_t * scan_device_info_get(void)
    {
    return m_device;

    }

    typedef struct
    {
    uint8_t * p_data; /**< Pointer to data. */
    uint16_t data_len; /**< Length of data. */
    } data_t;


    static void device_to_list_add(ble_gap_evt_adv_report_t const * p_adv_report)
    {
    uint8_t idx = 0;
    uint16_t dev_name_offset = 0;
    uint16_t field_len;
    int i = 0;
    data_t adv_data;

    // Initialize advertisement report for parsing
    adv_data.p_data = (uint8_t *)p_adv_report->data.p_data;
    adv_data.data_len = p_adv_report->data.len;

    for ( idx = 0; idx < DEVICE_TO_FIND_MAX; idx++)
    {
    // If address is duplicated, then return.
    if (memcmp(p_adv_report->peer_addr.addr,
    m_device[idx].addr,
    sizeof(p_adv_report->peer_addr.addr)) == 0)
    {
    return;
    }
    }

    // Device is not in the list.
    for (idx = 0; idx < DEVICE_TO_FIND_MAX; idx++)
    {
    if (!m_device[idx].is_not_empty) // We find an empty entry
    {
    device_number = device_number +1;

    m_device[idx].is_not_empty = true; //validating the list record

    memset(m_device[idx].addr,
    0,
    sizeof(p_adv_report->peer_addr.addr));

    memcpy(m_device[idx].addr,
    p_adv_report->peer_addr.addr,
    sizeof(p_adv_report->peer_addr.addr));



    //###=========================================ADVERTIZED DATA SCAN SUCCESSFUL =######=========================================================###//

    /*88888888888888888888888888888888888888888888888 NAME OF DEVICE IN LITERAL 888888888888888888888888888888888888888888888888888*/

    //////////////////////////////////////////////////// TOTAL NO OF DEVICE //////////////////////////////////////////////////////////////
    NRF_LOG_INFO("[TOTAL NUM].DEVS:%d Count\r\n",device_number);
    printf("[TOTAL NUM].DEVS:%d Count\r\n",device_number);

    m_device[idx].rssi = p_adv_report->rssi;
    printf("[SIGNAL ].RSSI:%d dBm\r\n",m_device[idx].rssi);

    ///////////////////////////////////////////// SIGNAL STRENGTH INDEX ////////////////////////////////////////////////////////////////////////


    /////////////////////////// APPLICATION RFID(CENTRAL) DETECTION DATA>> TAG(PHERIFERIAL) //////////////////////////////////////////////////////////////

    //uint8_t * full_name_data = ble_advdata_parse(m_device[idx].data_buffer, m_device[idx].size,BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);

    uint16_t len_full_name = ble_advdata_search(m_device[idx].data_buffer,m_device[idx].size, &dev_name_offset,BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);
    memset(m_device[idx].dev_name,
    0,
    len_full_name);


    memcpy(m_device[idx].dev_name,
    &m_device[idx].data_buffer[dev_name_offset],
    len_full_name);

    printf("[SIGNATURE].NAME:");
    for(i=0; i<len_full_name;i++)
    {

    printf("%c",m_device[idx].data_buffer[dev_name_offset+i]);
    }
    printf("\r\n");

    /*88888888888888888888888888888888888888888888888 NAME OF DEVICE IN HEX 88888888888888888888888888888888888888888888888*/
    printf("[HEX ID ].ADDR:");
    for(i=0; i< (uint16_t)(sizeof(p_adv_report->peer_addr.addr));i++)
    {
    if(i==0)
    {
    printf("%02X",m_device[idx].addr[i]);
    }
    else
    {
    printf(":%02X",m_device[idx].addr[i]); //add colon in order to give format to address
    }
    }
    printf("\r\n");

    // ##### if you do not want to print adv data then comment #####////


    m_device[idx].size = p_adv_report->data.len;

    memset(m_device[idx].data_buffer,
    0,
    p_adv_report->data.len);
    memcpy(m_device[idx].data_buffer,
    p_adv_report->data.p_data,
    p_adv_report->data.len);



    printf("[ADV DATA ].DATA:");
    for(i=0; i< p_adv_report->data.len;i++)
    {
    printf("%x",m_device[idx].data_buffer[i]);
    }
    printf("\r\n");


    /* DATA */

    uint8_t * aux = p_adv_report->data.p_data;
    uint16_t aux_len = p_adv_report->data.len;

    uint8_t aux_array[100] = {};
    memcpy(aux_array,aux,aux_len);
    printf("[ADV DATA ].DATA:%x\r\n",aux_array);


    return;


    }
    }
    }

    void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
    {
    app_error_handler(0xDEADBEEF, line_num, p_file_name);
    }


    /**@brief Function for the LEDs initialization.
    *
    * @details Initializes all LEDs used by the application.
    */
    static void leds_init(void)
    {
    bsp_board_init(BSP_INIT_LEDS);
    }


    /**@brief Function to start scanning.
    */
    static void scan_start(void)
    {
    ret_code_t err_code;

    err_code = nrf_ble_scan_start(&m_scan);
    APP_ERROR_CHECK(err_code);

    bsp_board_led_off(CENTRAL_CONNECTED_LED);
    bsp_board_led_on(CENTRAL_SCANNING_LED);
    }


    /**@brief Function for handling BLE events.
    *
    * @param[in] p_ble_evt Bluetooth stack event.
    * @param[in] p_context Unused.
    */
    static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
    {
    ret_code_t err_code;

    // For readability.
    ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;

    switch (p_ble_evt->header.evt_id)
    {
    // Upon connection, check which peripheral has connected (HR or RSC), initiate DB
    // discovery, update LEDs status and resume scanning if necessary. */
    case BLE_GAP_EVT_CONNECTED:
    {
    NRF_LOG_INFO("Connected.");
    // err_code = ble_lbs_c_handles_assign(&m_ble_lbs_c, p_gap_evt->conn_handle, NULL);
    // APP_ERROR_CHECK(err_code);
    //
    // err_code = ble_db_discovery_start(&m_db_disc, p_gap_evt->conn_handle);
    // APP_ERROR_CHECK(err_code);

    // Update LEDs status, and check if we should be looking for more
    // peripherals to connect to.
    bsp_board_led_on(CENTRAL_CONNECTED_LED);
    bsp_board_led_off(CENTRAL_SCANNING_LED);
    } break;

    // Upon disconnection, reset the connection handle of the peer which disconnected, update
    // the LEDs status and start scanning again.
    case BLE_GAP_EVT_DISCONNECTED:
    {
    NRF_LOG_INFO("Disconnected.");
    scan_start();
    } break;

    case BLE_GAP_EVT_TIMEOUT:
    {
    // We have not specified a timeout for scanning, so only connection attemps can timeout.
    if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)
    {
    NRF_LOG_DEBUG("Connection request timed out.");
    }
    } break;

    case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
    {
    // Accept parameters requested by peer.
    err_code = sd_ble_gap_conn_param_update(p_gap_evt->conn_handle,
    &p_gap_evt->params.conn_param_update_request.conn_params);
    APP_ERROR_CHECK(err_code);
    } break;

    case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
    {
    NRF_LOG_DEBUG("PHY update request.");
    ble_gap_phys_t const phys =
    {
    .rx_phys = BLE_GAP_PHY_AUTO,
    .tx_phys = BLE_GAP_PHY_AUTO,
    };
    err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
    APP_ERROR_CHECK(err_code);
    } break;

    case BLE_GATTC_EVT_TIMEOUT:
    {
    // Disconnect on GATT Client timeout event.
    NRF_LOG_DEBUG("GATT Client Timeout.");
    err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
    BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
    APP_ERROR_CHECK(err_code);
    } break;

    case BLE_GATTS_EVT_TIMEOUT:
    {
    // Disconnect on GATT Server timeout event.
    NRF_LOG_DEBUG("GATT Server Timeout.");
    err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
    BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
    APP_ERROR_CHECK(err_code);
    } break;

    default:
    // No implementation needed.
    break;
    }
    }

    /**@brief Function for initializing the BLE stack.
    *
    * @details Initializes the SoftDevice and the BLE event interrupts.
    */
    static void ble_stack_init(void)
    {
    ret_code_t err_code;

    err_code = nrf_sdh_enable_request();
    APP_ERROR_CHECK(err_code);

    // Configure the BLE stack using the default settings.
    // Fetch the start address of the application RAM.
    uint32_t ram_start = 0;
    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
    APP_ERROR_CHECK(err_code);

    // Enable BLE stack.
    err_code = nrf_sdh_ble_enable(&ram_start);
    APP_ERROR_CHECK(err_code);

    // Register a handler for BLE events.
    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
    }


    /**@brief Function for handling events from the button handler module.
    *
    * @param[in] pin_no The pin that the event applies to.
    * @param[in] button_action The button action (press/release).
    */
    static void button_event_handler(uint8_t pin_no, uint8_t button_action)
    {
    ret_code_t err_code;

    switch (pin_no)
    {
    case LEDBUTTON_BUTTON_PIN:
    break;

    default:
    //APP_ERROR_HANDLER(pin_no);
    break;
    }
    }


    /**@brief Function for handling Scaning events.
    *
    * @param[in] p_scan_evt Scanning event.
    */
    static void scan_evt_handler(scan_evt_t const * p_scan_evt)
    {
    ret_code_t err_code;

    switch(p_scan_evt->scan_evt_id)
    {
    case NRF_BLE_SCAN_EVT_CONNECTING_ERROR:
    err_code = p_scan_evt->params.connecting_err.err_code;
    APP_ERROR_CHECK(err_code);
    break;

    case NRF_BLE_SCAN_EVT_NOT_FOUND:
    device_to_list_add(p_scan_evt->params.p_not_found);
    break;
    default:
    break;
    }
    }

    /**@brief Function for initializing the button handler module.
    */
    static void buttons_init(void)
    {
    ret_code_t err_code;

    //The array must be static because a pointer to it will be saved in the button handler module.
    static app_button_cfg_t buttons[] =
    {
    {LEDBUTTON_BUTTON_PIN, false, BUTTON_PULL, button_event_handler}
    };

    err_code = app_button_init(buttons, ARRAY_SIZE(buttons),
    BUTTON_DETECTION_DELAY);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for initializing the log.
    */
    static void log_init(void)
    {
    ret_code_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
    }

    /**@brief Function for handling the list_timer event,
    */
    static void adv_list_timer_handle(void * p_context)
    {

    // Print devices
    scanned_device_t * p_device_list = scan_device_info_get();
    device_list_print(p_device_list);

    //scan_device_info_clear();
    }


    /**@brief Function for initializing the timer.
    */
    static void timer_init(void)
    {
    ret_code_t err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);

    // Timer for refreshing scanned devices data.
    APP_TIMER_DEF(adv_list_timer);
    err_code = app_timer_create(&adv_list_timer, APP_TIMER_MODE_REPEATED, adv_list_timer_handle);
    APP_ERROR_CHECK(err_code);

    err_code = app_timer_start(adv_list_timer, FOUND_DEVICE_REFRESH_TIME, NULL);
    APP_ERROR_CHECK(err_code);


    }


    /**@brief Function for initializing the Power manager. */
    static void power_management_init(void)
    {
    ret_code_t err_code;
    err_code = nrf_pwr_mgmt_init();
    APP_ERROR_CHECK(err_code);
    }


    static void scan_init(void)
    {
    ret_code_t err_code;
    nrf_ble_scan_init_t init_scan;

    memset(&init_scan, 0, sizeof(init_scan));

    init_scan.connect_if_match = false;
    init_scan.conn_cfg_tag = APP_BLE_CONN_CFG_TAG;

    err_code = nrf_ble_scan_init(&m_scan, &init_scan, scan_evt_handler);
    APP_ERROR_CHECK(err_code);

    // // Setting filters for scanning.
    // err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_NAME_FILTER, false);
    // APP_ERROR_CHECK(err_code);
    //
    err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_target_periph_name);
    APP_ERROR_CHECK(err_code);

    }


    /**@brief Function for initializing the GATT module.
    */
    static void gatt_init(void)
    {
    ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, NULL);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for handling the idle state (main loop).
    *
    * @details Handle any pending log operation(s), then sleep until the next event occurs.
    */
    static void idle_state_handle(void)
    {
    NRF_LOG_FLUSH();
    nrf_pwr_mgmt_run();
    }


    int main(void)
    {
    // Initialize.
    log_init();
    timer_init();
    leds_init();
    buttons_init();
    power_management_init();
    ble_stack_init();
    scan_init();
    gatt_init();


    // Start execution.
    NRF_LOG_INFO("[[BLE [RFID V1.0.0] Scanner Started]] Total: %d seconds",SCAN_LIST_REFRESH_INTERVAL/1000);
    scan_start();

    // Turn on the LED to signal scanning.
    bsp_board_led_on(CENTRAL_SCANNING_LED);

    // Enter main loop.
    for (;;)
    {
    idle_state_handle();
    }
    }

  • i need help in above code to add putty/mobaxterm for mode of UART COMMUNICATION , CAN PRINT ALL DATA AT SAME TIME OF SCAN IN SERIAL. WHAT BI NEED TO MODIFY

    REGARD SHAMBHU 

  • this data i want to print seprately in putty via serial bus/uart p0.06,p0.08 uart bus or finally i want data extention via modbus .. Also guide how to add header file as app_uart.h in ble_central_c or any guide related to uart. please specifiy my pin. aslso for code ,reply as soon as possible. Above mentioned my code...???????

  • output 

    code

    main.c

    ble_app_blinky_c

    ////////////////////////////////// RFID READER V1.0.0 2024 //////////////////////////
    /* */
    /* R&D EMBEDDED TEAM */
    /* RFID PROJECT */
    /* ACTIVE RFID & ACTIVE TAG */
    /* CENTRAL */
    /* EMPLOYEE ID 013 */
    #include <stdint.h>
    #include <stdio.h>
    #include <string.h>
    #include "nrf_sdh.h"
    #include "nrf_sdh_ble.h"
    #include "nrf_sdh_soc.h"
    #include "nrf_pwr_mgmt.h"
    #include "app_timer.h"
    #include "boards.h"
    #include "bsp.h"
    #include "bsp_btn_ble.h"
    #include "ble.h"
    #include "ble_hci.h"
    #include "ble_advertising.h"
    #include "ble_conn_params.h"
    #include "ble_db_discovery.h"
    #include "ble_lbs_c.h"
    #include "nrf_ble_gatt.h"
    #include "nrf_ble_scan.h"

    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    #include "nrf_log_default_backends.h"


    #define CENTRAL_SCANNING_LED BSP_BOARD_LED_0 /**< Scanning LED will be on when the device is scanning. */
    #define CENTRAL_CONNECTED_LED BSP_BOARD_LED_1 /**< Connected LED will be on when the device is connected. */
    #define LEDBUTTON_LED BSP_BOARD_LED_2 /**< LED to indicate a change of state of the the Button characteristic on the peer. */

    #define SCAN_INTERVAL 0x00A0 /**< Determines scan interval in units of 0.625 millisecond. */
    #define SCAN_WINDOW 0x0050 /**< Determines scan window in units of 0.625 millisecond. */
    #define SCAN_DURATION 0x0000 /**< Timout when scanning. 0x0000 disables timeout. */

    #define MIN_CONNECTION_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS) /**< Determines minimum connection interval in milliseconds. */
    #define MAX_CONNECTION_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /**< Determines maximum connection interval in milliseconds. */
    #define SLAVE_LATENCY 0 /**< Determines slave latency in terms of connection events. */
    #define SUPERVISION_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Determines supervision time-out in units of 10 milliseconds. */

    #define LEDBUTTON_BUTTON_PIN BSP_BUTTON_0 /**< Button that will write to the LED characteristic of the peer */
    #define BUTTON_DETECTION_DELAY APP_TIMER_TICKS(50) /**< Delay from a GPIOTE event until a button is reported as pushed (in number of timer ticks). */

    #define APP_BLE_CONN_CFG_TAG 1 /**< A tag identifying the SoftDevice BLE configuration. */
    #define APP_BLE_OBSERVER_PRIO 3 /**< Application's BLE observer priority. You shouldn't need to modify this value. */

    NRF_BLE_SCAN_DEF(m_scan); /**< Scanning module instance. */
    BLE_LBS_C_DEF(m_ble_lbs_c); /**< Main structure used by the LBS client module. */
    NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */
    BLE_DB_DISCOVERY_DEF(m_db_disc); /**< DB discovery module instance. */

    static char const m_target_periph_name[] = "(NORDIC)"; /**< Name of the device we try to connect to. This name is searched in the scan report data*/


    #define SCAN_LIST_REFRESH_INTERVAL 10000 // 100 sec

    static uint32_t device_number;

    #define FOUND_DEVICE_REFRESH_TIME APP_TIMER_TICKS(SCAN_LIST_REFRESH_INTERVAL) /**< Time after which the device list is clean and refreshed. */


    #define DEVICE_NAME_MAX_SIZE 20
    #define DEVICE_TO_FIND_MAX 50


    typedef struct
    {
    bool is_not_empty; /**< Indicates that the structure is not empty. */
    uint16_t size; /**< Size of manuf data. */
    uint8_t addr[BLE_GAP_ADDR_LEN]; /**< Device address. */
    char dev_name[DEVICE_NAME_MAX_SIZE]; /**< Device name. */
    uint8_t data_buffer[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; /**< Buffer for storing an manuf data. */
    uint8_t rssi ;
    } scanned_device_t;

    void device_list_print(scanned_device_t * p_device);


    scanned_device_t m_device[DEVICE_TO_FIND_MAX]; /**< Stores device info from scan data. */

    void scan_device_info_clear(void)
    {
    memset(m_device, 0, sizeof(m_device));
    device_number = 0;
    }

    /**@brief Function for printing the devices.
    *
    *@details Function print list of devices.
    *
    *
    * @param[in] device Pointer to the struct storing the scanned devices.
    */
    void device_list_print(scanned_device_t * p_device)
    {
    // We could now clear the list:
    scan_device_info_clear();

    }

    scanned_device_t * scan_device_info_get(void)
    {
    return m_device;

    }

    typedef struct
    {
    uint8_t * p_data; /**< Pointer to data. */
    uint16_t data_len; /**< Length of data. */
    } data_t;


    static void device_to_list_add(ble_gap_evt_adv_report_t const * p_adv_report)
    {
    uint8_t idx = 0;
    uint16_t dev_name_offset = 0;
    uint16_t field_len;
    int i = 0;
    data_t adv_data;

    // Initialize advertisement report for parsing
    adv_data.p_data = (uint8_t *)p_adv_report->data.p_data;
    adv_data.data_len = p_adv_report->data.len;

    for ( idx = 0; idx < DEVICE_TO_FIND_MAX; idx++)
    {
    // If address is duplicated, then return.
    if (memcmp(p_adv_report->peer_addr.addr,
    m_device[idx].addr,
    sizeof(p_adv_report->peer_addr.addr)) == 0)
    {
    return;
    }
    }

    // Device is not in the list.
    for (idx = 0; idx < DEVICE_TO_FIND_MAX; idx++)
    {
    if (!m_device[idx].is_not_empty) // We find an empty entry
    {
    device_number = device_number +1;

    m_device[idx].is_not_empty = true; //validating the list record

    memset(m_device[idx].addr,
    0,
    sizeof(p_adv_report->peer_addr.addr));

    memcpy(m_device[idx].addr,
    p_adv_report->peer_addr.addr,
    sizeof(p_adv_report->peer_addr.addr));



    //###=========================================ADVERTIZED DATA SCAN SUCCESSFUL =######=========================================================###//

    /*88888888888888888888888888888888888888888888888 NAME OF DEVICE IN LITERAL 888888888888888888888888888888888888888888888888888*/

    //////////////////////////////////////////////////// TOTAL NO OF DEVICE //////////////////////////////////////////////////////////////
    NRF_LOG_INFO("[TOTAL NUM].DEVS:%d Count\r\n",device_number);
    printf("[TOTAL NUM].DEVS:%d Count\r\n",device_number);

    m_device[idx].rssi = p_adv_report->rssi;
    printf("[SIGNAL ].RSSI:%d dBm\r\n",m_device[idx].rssi);

    ///////////////////////////////////////////// SIGNAL STRENGTH INDEX ////////////////////////////////////////////////////////////////////////


    /////////////////////////// APPLICATION RFID(CENTRAL) DETECTION DATA>> TAG(PHERIFERIAL) //////////////////////////////////////////////////////////////

    //uint8_t * full_name_data = ble_advdata_parse(m_device[idx].data_buffer, m_device[idx].size,BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);

    uint16_t len_full_name = ble_advdata_search(m_device[idx].data_buffer,m_device[idx].size, &dev_name_offset,BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME);
    memset(m_device[idx].dev_name,
    0,
    len_full_name);


    memcpy(m_device[idx].dev_name,
    &m_device[idx].data_buffer[dev_name_offset],
    len_full_name);

    printf("[SIGNATURE].NAME:");
    for(i=0; i<len_full_name;i++)
    {

    printf("%c",m_device[idx].data_buffer[dev_name_offset+i]);
    }
    printf("\r\n");

    /*88888888888888888888888888888888888888888888888 NAME OF DEVICE IN HEX 88888888888888888888888888888888888888888888888*/
    printf("[HEX ID ].ADDR:");
    for(i=0; i< (uint16_t)(sizeof(p_adv_report->peer_addr.addr));i++)
    {
    if(i==0)
    {
    printf("%02X",m_device[idx].addr[i]);
    }
    else
    {
    printf(":%02X",m_device[idx].addr[i]); //add colon in order to give format to address
    }
    }
    printf("\r\n");

    // ##### if you do not want to print adv data then comment #####////


    m_device[idx].size = p_adv_report->data.len;

    memset(m_device[idx].data_buffer,
    0,
    p_adv_report->data.len);
    memcpy(m_device[idx].data_buffer,
    p_adv_report->data.p_data,
    p_adv_report->data.len);



    printf("[ADV DATA ].DATA:");
    for(i=0; i< p_adv_report->data.len;i++)
    {
    printf("%x",m_device[idx].data_buffer[i]);
    }
    printf("\r\n");


    /* DATA */

    uint8_t * aux = p_adv_report->data.p_data;
    uint16_t aux_len = p_adv_report->data.len;

    uint8_t aux_array[100] = {};
    memcpy(aux_array,aux,aux_len);
    printf("[ADV DATA ].DATA:%x\r\n",aux_array);


    return;


    }
    }
    }

    void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
    {
    app_error_handler(0xDEADBEEF, line_num, p_file_name);
    }


    /**@brief Function for the LEDs initialization.
    *
    * @details Initializes all LEDs used by the application.
    */
    static void leds_init(void)
    {
    bsp_board_init(BSP_INIT_LEDS);
    }


    /**@brief Function to start scanning.
    */
    static void scan_start(void)
    {
    ret_code_t err_code;

    err_code = nrf_ble_scan_start(&m_scan);
    APP_ERROR_CHECK(err_code);

    bsp_board_led_off(CENTRAL_CONNECTED_LED);
    bsp_board_led_on(CENTRAL_SCANNING_LED);
    }


    /**@brief Function for handling BLE events.
    *
    * @param[in] p_ble_evt Bluetooth stack event.
    * @param[in] p_context Unused.
    */
    static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
    {
    ret_code_t err_code;

    // For readability.
    ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;

    switch (p_ble_evt->header.evt_id)
    {
    // Upon connection, check which peripheral has connected (HR or RSC), initiate DB
    // discovery, update LEDs status and resume scanning if necessary. */
    case BLE_GAP_EVT_CONNECTED:
    {
    NRF_LOG_INFO("Connected.");
    // err_code = ble_lbs_c_handles_assign(&m_ble_lbs_c, p_gap_evt->conn_handle, NULL);
    // APP_ERROR_CHECK(err_code);
    //
    // err_code = ble_db_discovery_start(&m_db_disc, p_gap_evt->conn_handle);
    // APP_ERROR_CHECK(err_code);

    // Update LEDs status, and check if we should be looking for more
    // peripherals to connect to.
    bsp_board_led_on(CENTRAL_CONNECTED_LED);
    bsp_board_led_off(CENTRAL_SCANNING_LED);
    } break;

    // Upon disconnection, reset the connection handle of the peer which disconnected, update
    // the LEDs status and start scanning again.
    case BLE_GAP_EVT_DISCONNECTED:
    {
    NRF_LOG_INFO("Disconnected.");
    scan_start();
    } break;

    case BLE_GAP_EVT_TIMEOUT:
    {
    // We have not specified a timeout for scanning, so only connection attemps can timeout.
    if (p_gap_evt->params.timeout.src == BLE_GAP_TIMEOUT_SRC_CONN)
    {
    NRF_LOG_DEBUG("Connection request timed out.");
    }
    } break;

    case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST:
    {
    // Accept parameters requested by peer.
    err_code = sd_ble_gap_conn_param_update(p_gap_evt->conn_handle,
    &p_gap_evt->params.conn_param_update_request.conn_params);
    APP_ERROR_CHECK(err_code);
    } break;

    case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
    {
    NRF_LOG_DEBUG("PHY update request.");
    ble_gap_phys_t const phys =
    {
    .rx_phys = BLE_GAP_PHY_AUTO,
    .tx_phys = BLE_GAP_PHY_AUTO,
    };
    err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
    APP_ERROR_CHECK(err_code);
    } break;

    case BLE_GATTC_EVT_TIMEOUT:
    {
    // Disconnect on GATT Client timeout event.
    NRF_LOG_DEBUG("GATT Client Timeout.");
    err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
    BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
    APP_ERROR_CHECK(err_code);
    } break;

    case BLE_GATTS_EVT_TIMEOUT:
    {
    // Disconnect on GATT Server timeout event.
    NRF_LOG_DEBUG("GATT Server Timeout.");
    err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
    BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
    APP_ERROR_CHECK(err_code);
    } break;

    default:
    // No implementation needed.
    break;
    }
    }

    /**@brief Function for initializing the BLE stack.
    *
    * @details Initializes the SoftDevice and the BLE event interrupts.
    */
    static void ble_stack_init(void)
    {
    ret_code_t err_code;

    err_code = nrf_sdh_enable_request();
    APP_ERROR_CHECK(err_code);

    // Configure the BLE stack using the default settings.
    // Fetch the start address of the application RAM.
    uint32_t ram_start = 0;
    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
    APP_ERROR_CHECK(err_code);

    // Enable BLE stack.
    err_code = nrf_sdh_ble_enable(&ram_start);
    APP_ERROR_CHECK(err_code);

    // Register a handler for BLE events.
    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
    }


    /**@brief Function for handling events from the button handler module.
    *
    * @param[in] pin_no The pin that the event applies to.
    * @param[in] button_action The button action (press/release).
    */
    static void button_event_handler(uint8_t pin_no, uint8_t button_action)
    {
    ret_code_t err_code;

    switch (pin_no)
    {
    case LEDBUTTON_BUTTON_PIN:
    break;

    default:
    //APP_ERROR_HANDLER(pin_no);
    break;
    }
    }


    /**@brief Function for handling Scaning events.
    *
    * @param[in] p_scan_evt Scanning event.
    */
    static void scan_evt_handler(scan_evt_t const * p_scan_evt)
    {
    ret_code_t err_code;

    switch(p_scan_evt->scan_evt_id)
    {
    case NRF_BLE_SCAN_EVT_CONNECTING_ERROR:
    err_code = p_scan_evt->params.connecting_err.err_code;
    APP_ERROR_CHECK(err_code);
    break;

    case NRF_BLE_SCAN_EVT_NOT_FOUND:
    device_to_list_add(p_scan_evt->params.p_not_found);
    break;
    default:
    break;
    }
    }

    /**@brief Function for initializing the button handler module.
    */
    static void buttons_init(void)
    {
    ret_code_t err_code;

    //The array must be static because a pointer to it will be saved in the button handler module.
    static app_button_cfg_t buttons[] =
    {
    {LEDBUTTON_BUTTON_PIN, false, BUTTON_PULL, button_event_handler}
    };

    err_code = app_button_init(buttons, ARRAY_SIZE(buttons),
    BUTTON_DETECTION_DELAY);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for initializing the log.
    */
    static void log_init(void)
    {
    ret_code_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
    }

    /**@brief Function for handling the list_timer event,
    */
    static void adv_list_timer_handle(void * p_context)
    {

    // Print devices
    scanned_device_t * p_device_list = scan_device_info_get();
    device_list_print(p_device_list);

    //scan_device_info_clear();
    }


    /**@brief Function for initializing the timer.
    */
    static void timer_init(void)
    {
    ret_code_t err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);

    // Timer for refreshing scanned devices data.
    APP_TIMER_DEF(adv_list_timer);
    err_code = app_timer_create(&adv_list_timer, APP_TIMER_MODE_REPEATED, adv_list_timer_handle);
    APP_ERROR_CHECK(err_code);

    err_code = app_timer_start(adv_list_timer, FOUND_DEVICE_REFRESH_TIME, NULL);
    APP_ERROR_CHECK(err_code);


    }


    /**@brief Function for initializing the Power manager. */
    static void power_management_init(void)
    {
    ret_code_t err_code;
    err_code = nrf_pwr_mgmt_init();
    APP_ERROR_CHECK(err_code);
    }


    static void scan_init(void)
    {
    ret_code_t err_code;
    nrf_ble_scan_init_t init_scan;

    memset(&init_scan, 0, sizeof(init_scan));

    init_scan.connect_if_match = false;
    init_scan.conn_cfg_tag = APP_BLE_CONN_CFG_TAG;

    err_code = nrf_ble_scan_init(&m_scan, &init_scan, scan_evt_handler);
    APP_ERROR_CHECK(err_code);

    // // Setting filters for scanning.
    // err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_NAME_FILTER, false);
    // APP_ERROR_CHECK(err_code);
    //
    err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_NAME_FILTER, m_target_periph_name);
    APP_ERROR_CHECK(err_code);

    }


    /**@brief Function for initializing the GATT module.
    */
    static void gatt_init(void)
    {
    ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, NULL);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for handling the idle state (main loop).
    *
    * @details Handle any pending log operation(s), then sleep until the next event occurs.
    */
    static void idle_state_handle(void)
    {
    NRF_LOG_FLUSH();
    nrf_pwr_mgmt_run();
    }


    int main(void)
    {
    // Initialize.
    log_init();
    timer_init();
    leds_init();
    buttons_init();
    power_management_init();
    ble_stack_init();
    scan_init();
    gatt_init();


    // Start execution.
    NRF_LOG_INFO("[[BLE [RFID V1.0.0] Scanner Started]] Total: %d seconds",SCAN_LIST_REFRESH_INTERVAL/1000);
    scan_start();

    // Turn on the LED to signal scanning.
    bsp_board_led_on(CENTRAL_SCANNING_LED);

    // Enter main loop.
    for (;;)
    {
    idle_state_handle();
    }
    }

  • [#BASIC PROBLEM 1]: GUIDE  I NEED TO PRINT SAME OUTPUT IN PUTTY PLEASE REPLY //NORDIC NRF52832 DK BOARD SDK15.3.0           PCA10040V 3.0.0 

    C:\nRF5_SDK_15.3.0_59ac345\examples\New folder\ble_app_blinky_c_SCANNER\pca10040\s132\ses

    DOING PROGRAMMING IN SEGGER EMBEDDED STUDIO PLATFORM 

    REPLY TO SOVE MY #BASIC PROBLEM

    THANKS IN ADV..

  • ble_app_pheferal // how to advatize uuid and custom device name

    how to modify existing main.c code for tag /ibeacon [#basic problem 2]

    /* RFID PROJECT 20/04/2024 - V1.0.0 ACTIVE TAG
    * Copyright (c) 2014 - 2019, Nordic Semiconductor ASA
    * All rights reserved.
    */
    /** @file
    * @defgroup ble_sdk_app_beacon_main main.c
    * @ingroup ble_sdk_app_beacon
    * @brief Beacon Transmitter Sample Application main file.
    * This file contains the source code for an Beacon transmitter sample application.
    */

    #include <stdbool.h>
    #include <stdint.h>
    #include "nordic_common.h"
    #include "bsp.h"
    #include "nrf_soc.h"
    #include "nrf_sdh.h"
    #include "nrf_sdh_ble.h"
    #include "ble_advdata.h"
    #include "app_timer.h"
    #include "nrf_pwr_mgmt.h"

    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    #include "nrf_log_default_backends.h"


    #define APP_BLE_CONN_CFG_TAG 1 /**< A tag identifying the SoftDevice BLE configuration. */

    #define DEVICE_NAME "SIT-BEACON_1"


    #define NON_CONNECTABLE_ADV_INTERVAL MSEC_TO_UNITS(100, UNIT_0_625_MS) /**< The advertising interval for non-connectable advertisement (100 ms). This value can vary between 100ms to 10.24s). */

    #define APP_BEACON_INFO_LENGTH 0x17 /**< Total length of information advertised by the Beacon. */
    #define APP_ADV_DATA_LENGTH 0x15 /**< Length of manufacturer specific data in the advertisement. */
    #define APP_DEVICE_TYPE 0x02 /**< 0x02 refers to Beacon. */
    #define APP_MEASURED_RSSI 0xC3 /**< The Beacon's measured RSSI at 1 meter distance in dBm. */
    #define APP_COMPANY_IDENTIFIER 0x0059 /**< Company identifier for Nordic Semiconductor ASA. as per www.bluetooth.org. */
    #define APP_MAJOR_VALUE 0x01, 0x02 /**< Major value used to identify Beacons. */
    #define APP_MINOR_VALUE 0x03, 0x04 /**< Minor value used to identify Beacons. */

    //USER DEFINE >> UUID ONLINE GENERATOR>> 90edf9ce-5c1b-4b0c-8e15-872ea3ebcac7

    #define APP_BEACON_UUID 0x90, 0xed, 0xf9, 0xce, \
    0x5c, 0x1b, 0x4b, 0x0c, \
    0x8e, 0x15, 0x87, 0x2e, \
    0xa3, 0xeb, 0xca, 0xc7 /**< Proprietary UUID for Beacon. */

    #define DEAD_BEEF 0xDEADBEEF /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */

    #if defined(USE_UICR_FOR_MAJ_MIN_VALUES)
    #define MAJ_VAL_OFFSET_IN_BEACON_INFO 18 /**< Position of the MSB of the Major Value in m_beacon_info array. */
    #define UICR_ADDRESS 0x10001080 /**< Address of the UICR register used by this example. The major and minor versions to be encoded into the advertising data will be picked up from this location. */
    #endif

    static ble_gap_adv_params_t m_adv_params; /**< Parameters to be passed to the stack when starting advertising. */
    static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; /**< Advertising handle used to identify an advertising set. */
    static uint8_t m_enc_advdata[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; /**< Buffer for storing an encoded advertising set. */

    /**@brief Struct that contains pointers to the encoded advertising data. */
    static ble_gap_adv_data_t m_adv_data =
    {
    .adv_data =
    {
    .p_data = m_enc_advdata,
    .len = BLE_GAP_ADV_SET_DATA_SIZE_MAX
    },
    .scan_rsp_data =
    {
    .p_data = NULL,
    .len = 0

    }
    };


    static uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH] = /**< Information advertised by the Beacon. */
    {
    APP_DEVICE_TYPE, // Manufacturer specific information. Specifies the device type in this
    // implementation.
    APP_ADV_DATA_LENGTH, // Manufacturer specific information. Specifies the length of the
    // manufacturer specific data in this implementation.
    APP_BEACON_UUID, // 128 bit UUID value.
    APP_MAJOR_VALUE, // Major arbitrary value that can be used to distinguish between Beacons.
    APP_MINOR_VALUE, // Minor arbitrary value that can be used to distinguish between Beacons.
    APP_MEASURED_RSSI, // Manufacturer specific information. The Beacon's measured TX power in
    // this implementation.
    };


    /**@brief Callback function for asserts in the SoftDevice.
    *
    * @details This function will be called in case of an assert in the SoftDevice.
    *
    * @warning This handler is an example only and does not fit a final product. You need to analyze
    * how your product is supposed to react in case of Assert.
    * @warning On assert from the SoftDevice, the system can only recover on reset.
    *
    * @param[in] line_num Line number of the failing ASSERT call.
    * @param[in] file_name File name of the failing ASSERT call.
    */
    void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
    {
    app_error_handler(DEAD_BEEF, line_num, p_file_name);
    }

    /**@brief Function for initializing the Advertising functionality.
    *
    * @details Encodes the required advertising data and passes it to the stack.
    * Also builds a structure to be passed to the stack when starting advertising.
    */
    static void advertising_init(void)
    {
    uint32_t err_code;
    ble_advdata_t advdata;
    uint8_t flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;

    ble_advdata_manuf_data_t manuf_specific_data;

    manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER;

    #if defined(USE_UICR_FOR_MAJ_MIN_VALUES)
    // If USE_UICR_FOR_MAJ_MIN_VALUES is defined, the major and minor values will be read from the
    // UICR instead of using the default values. The major and minor values obtained from the UICR
    // are encoded into advertising data in big endian order (MSB First).
    // To set the UICR used by this example to a desired value, write to the address 0x10001080
    // using the nrfjprog tool. The command to be used is as follows.
    // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val <your major/minor value>
    // For example, for a major value and minor value of 0xabcd and 0x0102 respectively, the
    // the following command should be used.
    // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val 0xabcd0102
    uint16_t major_value = ((*(uint32_t *)UICR_ADDRESS) & 0xFFFF0000) >> 16;
    uint16_t minor_value = ((*(uint32_t *)UICR_ADDRESS) & 0x0000FFFF);

    uint8_t index = MAJ_VAL_OFFSET_IN_BEACON_INFO;

    m_beacon_info[index++] = MSB_16(major_value);
    m_beacon_info[index++] = LSB_16(major_value);

    m_beacon_info[index++] = MSB_16(minor_value);
    m_beacon_info[index++] = LSB_16(minor_value);
    #endif

    manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info;
    manuf_specific_data.data.size = APP_BEACON_INFO_LENGTH;

    // Build and set advertising data.
    memset(&advdata, 0, sizeof(advdata));


    advdata.name_type = BLE_ADVDATA_NO_NAME;
    advdata.flags = flags;
    advdata.p_manuf_specific_data = &manuf_specific_data;

    // Initialize advertising parameters (used when starting advertising).
    memset(&m_adv_params, 0, sizeof(m_adv_params));

    m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED;
    m_adv_params.p_peer_addr = NULL; // Undirected advertisement.
    m_adv_params.filter_policy = BLE_GAP_ADV_FP_ANY;
    m_adv_params.interval = NON_CONNECTABLE_ADV_INTERVAL;
    m_adv_params.duration = 0; // Never time out.

    err_code = ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len);
    APP_ERROR_CHECK(err_code);

    err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for starting advertising. */
    static void advertising_start(void)
    {
    ret_code_t err_code;

    err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG);
    APP_ERROR_CHECK(err_code);

    err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for initializing the BLE stack.
    *
    * @details Initializes the SoftDevice and the BLE event interrupt.
    */
    static void ble_stack_init(void)
    {
    ret_code_t err_code;

    err_code = nrf_sdh_enable_request();
    APP_ERROR_CHECK(err_code);

    // Configure the BLE stack using the default settings.
    // Fetch the start address of the application RAM.
    uint32_t ram_start = 0;
    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
    APP_ERROR_CHECK(err_code);

    // Enable BLE stack.
    err_code = nrf_sdh_ble_enable(&ram_start);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for initializing logging. */
    static void log_init(void)
    {
    ret_code_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
    }

    /**@brief Function for initializing LEDs. */
    static void leds_init(void)
    {
    ret_code_t err_code = bsp_init(BSP_INIT_LEDS, NULL);
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for initializing timers. */
    static void timers_init(void)
    {
    ret_code_t err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);
    }


    /**@brief Function for initializing power management. */
    static void power_management_init(void)
    {
    ret_code_t err_code;
    err_code = nrf_pwr_mgmt_init();
    APP_ERROR_CHECK(err_code);
    }

    static void idle_state_handle(void)
    {
    if (NRF_LOG_PROCESS() == false)
    {
    nrf_pwr_mgmt_run();
    }
    }


    int main(void)
    {
    // Initialize.
    log_init();
    timers_init();
    leds_init();
    power_management_init();
    ble_stack_init();
    advertising_init();

    // Start execution.
    NRF_LOG_INFO("Beacon/Tag started.");
    advertising_start();

    // Enter main loop.
    for (;; )
    {
    idle_state_handle();
    }
    }

  • [#basic problem 2]  how to add device name in advertizing data can you modify the code as mentioned above or guide me Nrf52832 pc10040 v3.0.0 provide some video link to understand clear.

Reply Children
Related