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

NRF52832 - advertising data

About this example

https://github.com/NordicPlayground/nrf51-ble-tutorial-advertising

It´s advertising the data

 uint8_t                     data_response[] = "Many_bytes_of_data" with the MAC and RSSI 

without connection.

How can advertising dynamic data without connection ?

For example, MAC, RSSI + some dynamic data ?

Is there some SES example ? 

Thanks

  • Hi.

    As my previous reply show, I made some small modifications to Set_AdvData(), SysTick_Handler(), and main().

    In Set_AdvData() I've added sd_ble_gap_adv_stop(m_adv_handle); at the top, because you can't modify your advertising buffer while you are advertising. And I've added a advertising_start(); at the end of Set_AdvData() to start advertising again.

    In SysTick_Handler() I set your timer to 5 seconds instead of 5 ms.

    In main() I modified your if(g_setAdvData) sentence.

    The modified code:

    //Propaganda
    uint8_t Propaganda = 0;
    
    static void Set_AdvData()
    {
      sd_ble_gap_adv_stop(m_adv_handle);
      ret_code_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;
    
        // Prepare the scan response manufacturer specific data packet
        ble_advdata_manuf_data_t  manuf_data_response;
        uint8_t                     data_response[] = {0x08,0x00,0x03,0x08,0x00,0x03,0x08,0x00,0x03};
        //Change Data Advertising..
        ++Propaganda;
        data_response[0]=Propaganda;
        data_response[1]=Propaganda;
        data_response[2]=Propaganda;
        data_response[3]=Propaganda;
        data_response[4]=Propaganda;
        data_response[5]=Propaganda;
        data_response[6]=Propaganda;
        data_response[7]=Propaganda;
        data_response[8]=Propaganda;
        data_response[9]=Propaganda;
    
        manuf_specific_data.company_identifier  = 0x0059;
        manuf_specific_data.data.p_data         = data_response;
        manuf_specific_data.data.size           = sizeof(data_response);
        
        // 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));
    
        err_code = ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len);
        APP_ERROR_CHECK(err_code);
        
        advertising_start();
    }
    
    #define SYSTICK_COUNT_ENABLE        1
    #define SYSTICK_INTERRUPT_ENABLE    2
      
    uint32_t msTicks = 0; /* Variable to store millisecond ticks */
     
    /* SysTick interrupt Handler. */
    void SysTick_Handler(void)  {
         if(++msTicks == 5000) {
             LEDS_INVERT(BSP_LED_1_MASK); /* light LED 2 very 1 second */
             g_setAdvData = true;
             msTicks = 0;
         }
    }
    
    int main(void)
    {
        // Initialize.
        log_init();
        timers_init();
        leds_init();
        power_management_init();
        ble_stack_init();
        advertising_init();
    
        // Start execution.
        NRF_LOG_INFO("Beacon example started.");
        advertising_start();
    
        uint32_t returnCode;
        returnCode = SysTick_Config(SystemCoreClock / 1000);
    
        // Enter main loop.
        for (;; )
        {
           if(g_setAdvData) {
           sd_ble_gap_adv_stop(m_adv_handle);
              advertising_init();
              advertising_start();
              //Set_AdvData();
              g_setAdvData = false;
          }
            idle_state_handle();
        }
    }

    Hope this helps you.

    - Andreas

  • Hi Andreas

    Two questions!

    1) Getting error

    undefined ble_advertising_init(); not exist, i am using SDK 15.2.0

    2) and why you commented my Set_AdvData() ?

    //Set_AdvData();

    This way wont update my advertising counter :(

  • Hi again.

    I apologize for any confusion I've caused, I assumed you used SDK 15.0, and I also had some help solving your issue, and I missed a crucial point regarding what that solution did with your function Set_AdvData().

     The solution i was gives uses advertising_init() to update your advertising counter instead of your Set_AdvData() function.

    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;
    
        manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info;
        if (g_setAdvData)
        {
            manuf_specific_data.data.p_data[3] = 0xED;
        }
        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);
        ble_advertising_init();
        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);
    }

    Thats why it's commented out.

    Just remove the ble_advertising_init(); I'm unsure how that code snip found its way into the code.

    - Andreas

  • Andreas

    Sorry, i hadnt seen that you had change the advertising_init() to accept my Propaganda variable!

    Thanks

    It´s working! Thanks!

    Btw, i had to put

    uint32_t msTicks = 0; /* Variable to store millisecond ticks */

    /* SysTick interrupt Handler. */
    void SysTick_Handler(void) {
    if(++msTicks >5) {
    LEDS_INVERT(BSP_LED_1_MASK); /* light LED 2 very 1 second */
    g_setAdvData = true;
    msTicks = 0;
    }
    }

    To trigger interrupt each 1 second...is that right ?

  • Hi.

    Try:

    uint32_t msTicks = 0; /* Variable to store millisecond ticks */
     
    /* SysTick interrupt Handler. */
    void SysTick_Handler(void)  {
         if(++msTicks == 1000) {
             LEDS_INVERT(BSP_LED_1_MASK); /* light LED 2 very 1 second */
             g_setAdvData = true;
             msTicks = 0;
         }
    }

    msTicks is milliseconds, so you need to set the if sentence equal to 1000 ms (which is 1 second)

    - Andreas

Related