<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>How do I show the status of an LED with a ble advertising packet using nRF52840-dk?</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/79186/how-do-i-show-the-status-of-an-led-with-a-ble-advertising-packet-using-nrf52840-dk</link><description>Hi, 
 
 I am writing a program to actively change the state of an LED, then sample the output voltage on the led pin using SAADC, then outputs the adc value to terminal every two seconds, and also sends the status of the LED in a BLE advertising packet</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 07 Sep 2021 14:02:38 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/79186/how-do-i-show-the-status-of-an-led-with-a-ble-advertising-packet-using-nrf52840-dk" /><item><title>RE: How do I show the status of an LED with a ble advertising packet using nRF52840-dk?</title><link>https://devzone.nordicsemi.com/thread/328429?ContentTypeID=1</link><pubDate>Tue, 07 Sep 2021 14:02:38 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:6536f76c-2553-441c-b1e3-d76296f6f432</guid><dc:creator>Aaron_BC</dc:creator><description>&lt;p&gt;I ended up getting this program to work. For some reason the ble_advertising_advdata_update() function was not working on sdk 15.3, but it was successful once I switched over to sdk 17.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How do I show the status of an LED with a ble advertising packet using nRF52840-dk?</title><link>https://devzone.nordicsemi.com/thread/328088?ContentTypeID=1</link><pubDate>Mon, 06 Sep 2021 06:40:02 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b9115d56-69c4-4313-bd6e-589b7e9ce1ca</guid><dc:creator>Jared</dc:creator><description>&lt;p&gt;Does the program enter the app timer handler? Could you verify it by setting a breakpoint in the handler and see if the program enters it on a timeout.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How do I show the status of an LED with a ble advertising packet using nRF52840-dk?</title><link>https://devzone.nordicsemi.com/thread/328041?ContentTypeID=1</link><pubDate>Fri, 03 Sep 2021 19:44:15 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5e02c541-2169-4e22-9a10-c944d7b933e0</guid><dc:creator>Aaron_BC</dc:creator><description>&lt;p&gt;I am just advertising. I am using the manuf specific data field to display the led status but I cannot get it to update dynamically. I am trying to use ble_advertising_advdata_update() but its not working.&lt;pre class="ui-code" data-mode="text"&gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;
#include &amp;quot;nrf_log_default_backends.h&amp;quot;

#include &amp;quot;app_timer.h&amp;quot;

#include &amp;quot;bsp_btn_ble.h&amp;quot;

#include &amp;quot;nrf_pwr_mgmt.h&amp;quot;

#include &amp;quot;nrf_sdh.h&amp;quot;
#include &amp;quot;nrf_sdh_ble.h&amp;quot;
#include &amp;quot;nrf_sdh_soc.h&amp;quot;

#include &amp;quot;nrf_ble_qwr.h&amp;quot;

#include &amp;quot;nrf_ble_gatt.h&amp;quot;

#include &amp;quot;ble_advdata.h&amp;quot;
#include &amp;quot;ble_advertising.h&amp;quot;

#include &amp;quot;ble_conn_params.h&amp;quot;

#include &amp;quot;boards.h&amp;quot;

#include &amp;quot;nrf_drv_saadc.h&amp;quot;
#include &amp;quot;nrf_drv_gpiote.h&amp;quot;

#define ADC_INTERVAL           APP_TIMER_TICKS(2000)
#define SECOND_STATUS_INTERVAL APP_TIMER_TICKS(5000)

APP_TIMER_DEF(m_app_timer_id);
APP_TIMER_DEF(m_app_timer_id1);

#define APP_BLE_CONN_CFG_TAG   1 
#define APP_BLE_OBSERVER_PRIO  3  


#define DEVICE_NAME            &amp;quot;Aaron&amp;#39;s nRF BT&amp;quot;

#define MIN_CONN_INTERVAL      MSEC_TO_UNITS(100, UNIT_1_25_MS)
#define MAX_CONN_INTERVAL      MSEC_TO_UNITS(200, UNIT_1_25_MS)
#define SLAVE_LATENCY          0
#define CONN_SUP_TIMEOUT       MSEC_TO_UNITS(2000, UNIT_10_MS);

#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000)
#define NEXT_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(30000)
#define MAX_CONN_PARAMS_UPDATE_COUNT   3


#define APP_ADV_INTERVAL       300
#define APP_ADV_DURATION       0


#define BUTTON 12

#define SAMPLE_BUFFER_LEN 1

enum state {none, first, second, third} status;

static nrf_saadc_value_t m_buffer_pool[2][SAMPLE_BUFFER_LEN];

NRF_BLE_QWR_DEF(m_qwr);
NRF_BLE_GATT_DEF(m_gatt);
BLE_ADVERTISING_DEF(m_advertising);

static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;

uint32_t count;

float volts;


//added to attempt dynamic data packets
//define a timer handle for dynamic data
APP_TIMER_DEF(m_adv_data_update_timer);

//define a data update interval
#define ADV_DATA_UPDATE_INTERVAL        APP_TIMER_TICKS(5000)

#define MANUF_PAYLOAD_1 0x31 //led on
#define MANUF_PAYLOAD_2 0x32 //led off

#define PAYLOAD_SIZE                    1
#define TOP_INDEX                       1

#define APP_COMPANY_IDENTIFIER          0x0059                                  /**&amp;lt; Company identifier for Nordic Semiconductor ASA. as per www.bluetooth.org. */
  
static ble_advdata_t                    new_advdata;


static uint8_t manufacturing_data_payload_list[] = 
{
    MANUF_PAYLOAD_1,
    MANUF_PAYLOAD_2
};

//timer handler for ADC sample
static void app_timer_handler(void * p_context){

   nrfx_saadc_sample();

}

//timer handler for second status blinky
static void app_timer_handler1(void * p_context){

   if(status == 2){
    
   bsp_board_led_invert(2);

   }

}


/*****************************************************************************************************
*analog to digital event handler
*****************************************************************************************************/
void saadc_callback_handler(nrf_drv_saadc_evt_t const * p_event){

  float val;

  if(p_event-&amp;gt;type == NRFX_SAADC_EVT_DONE){
  
    ret_code_t err_code;

    err_code = nrfx_saadc_buffer_convert(p_event-&amp;gt;data.done.p_buffer, SAMPLE_BUFFER_LEN);
    APP_ERROR_CHECK(err_code);

    int i = 0;

      val = p_event-&amp;gt;data.done.p_buffer[i] * 3.6 / 4096;
      volts = val;

      if(val &amp;lt; 1){
      
        NRF_LOG_INFO(&amp;quot;The LED is ON with an ADC value of: &amp;quot;)
      }
      else{
      
        NRF_LOG_INFO(&amp;quot;The LED is OFF with an ADC value of: &amp;quot;);
      }

      NRF_LOG_INFO(&amp;quot;sample read: %d&amp;quot;, p_event-&amp;gt;data.done.p_buffer[i]);

      NRF_LOG_INFO(&amp;quot;Voltage read: &amp;quot; NRF_LOG_FLOAT_MARKER &amp;quot;\r\n&amp;quot;, NRF_LOG_FLOAT(val));

  }

}


/********************************************************************************************************
*initialize the analog to digital converter
********************************************************************************************************/
void saadc_init(void){

  ret_code_t err_code;

  nrf_saadc_channel_config_t channel_config = NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN7);

  err_code = nrf_drv_saadc_init(NULL, saadc_callback_handler);
  APP_ERROR_CHECK(err_code);

  err_code = nrfx_saadc_channel_init(0,&amp;amp;channel_config);
  APP_ERROR_CHECK(err_code);

  err_code = nrfx_saadc_buffer_convert(m_buffer_pool[0], SAMPLE_BUFFER_LEN);
  APP_ERROR_CHECK(err_code);

  err_code = nrfx_saadc_buffer_convert(m_buffer_pool[1], SAMPLE_BUFFER_LEN);
  APP_ERROR_CHECK(err_code);
}


/********************************************************************************
*event handler for button press to update status
********************************************************************************/
void input_pin_handle(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action){

  if(status &amp;lt; 3){

    status++;

  }

  else{status = first;}

}


/************************************************************
*create an interrupt when the button is pressed
*************************************************************/
void gpio_init(){

  ret_code_t err_code; //hold error value

  err_code = nrf_drv_gpiote_init();
  APP_ERROR_CHECK(err_code);

  nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(true);//16MHz clk
  in_config.pull = NRF_GPIO_PIN_PULLUP;

  err_code = nrf_drv_gpiote_in_init(BUTTON,&amp;amp;in_config,input_pin_handle);
  APP_ERROR_CHECK(err_code);

  nrf_drv_gpiote_in_event_enable(BUTTON,true);
}

/********************************************************************************
*event handler to update ble packet data
* TODO: FIX, DOES NOT WORK
********************************************************************************/
static void adv_data_update_timer_handler(void * p_context)
{
    ret_code_t                  err_code;
    ble_advdata_manuf_data_t    manuf_data;

    new_advdata.p_manuf_specific_data = &amp;amp;manuf_data;

    static uint8_t payload_index = 0;

    // TODO change payload index depending on ADC status of pin

    //NRF_LOG_INFO(&amp;quot;Voltage read: &amp;quot; NRF_LOG_FLOAT_MARKER &amp;quot;\r\n&amp;quot;, NRF_LOG_FLOAT(volts));

    if(volts &amp;gt; 2){
    
      payload_index = 1;
     
    }

    NRF_LOG_INFO(&amp;quot;Updating advertising data!&amp;quot;);
    
    manuf_data.company_identifier = APP_COMPANY_IDENTIFIER;

    //manuf_data.data.p_data = manufacturing_data_payload_list + payload_index;
   // manuf_data.data.size = PAYLOAD_SIZE;

    manuf_data.data.p_data = &amp;quot;1&amp;quot;;
    manuf_data.data.size = 1;
    
    err_code = ble_advertising_advdata_update(&amp;amp;m_advertising, &amp;amp;new_advdata, NULL);
    APP_ERROR_CHECK(err_code);  
    
    /*if(payload_index == TOP_INDEX)
    {
        payload_index = 0;
    }
    else
    {
        payload_index++;
    }*/

    NRF_LOG_INFO(&amp;quot;Advertising data updated!&amp;quot;);

}


//6th step: gap initialization
static void gap_params_init(void){

  ret_code_t err_code;

  ble_gap_conn_params_t     gap_conn_params;
  ble_gap_conn_sec_mode_t   sec_mode;

  BLE_GAP_CONN_SEC_MODE_SET_OPEN(&amp;amp;sec_mode);

  err_code = sd_ble_gap_device_name_set(&amp;amp;sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
  APP_ERROR_CHECK(err_code);

  memset(&amp;amp;gap_conn_params, 0, sizeof(gap_conn_params));

  gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
  gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
  gap_conn_params.slave_latency = SLAVE_LATENCY;
  gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;

  err_code = sd_ble_gap_ppcp_set(&amp;amp;gap_conn_params);
  APP_ERROR_CHECK(err_code);


}


//7th step: gatt initialization
static void gatt_init(void){

  ret_code_t err_code = nrf_ble_gatt_init(&amp;amp;m_gatt, NULL);
  APP_ERROR_CHECK(err_code);
}


//step 9.1 error handler for queue writer
static void nrf_qwr_error_handler(uint32_t nrf_error){
  
  APP_ERROR_HANDLER(nrf_error);
}



//9th step: Initialize the services
static void services_init(){

  ret_code_t err_code;

  nrf_ble_qwr_init_t qwr_init = {0};

  qwr_init.error_handler = nrf_qwr_error_handler;

  err_code = nrf_ble_qwr_init(&amp;amp;m_qwr, &amp;amp;qwr_init);
  APP_ERROR_CHECK(err_code);
 }


//step 10.1 create an event handler for connection parameters update
static void on_conn_params_evt(ble_conn_params_evt_t * p_evt){

  ret_code_t err_code;

  if(p_evt-&amp;gt;evt_type == BLE_CONN_PARAMS_EVT_FAILED){
    
    err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
    APP_ERROR_CHECK(err_code);

  }
  if(p_evt-&amp;gt;evt_type == BLE_CONN_PARAMS_EVT_SUCCEEDED){
  
    
  }
}


//step 10.2 create an error handler for conn params update
static void conn_params_error_handler(uint32_t nrf_error){

  APP_ERROR_HANDLER(nrf_error);
}



//10th step: create a function for setting up the connection parameters
static void conn_params_init(void){

  ret_code_t err_code;

  ble_conn_params_init_t cp_init;

  memset(&amp;amp;cp_init, 0, sizeof(cp_init));

  cp_init.p_conn_params = NULL;

  cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;

  cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;

  cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;

  cp_init.disconnect_on_fail = false;

  cp_init.error_handler = conn_params_error_handler;

  cp_init.evt_handler = on_conn_params_evt;

  err_code = ble_conn_params_init(&amp;amp;cp_init);
  APP_ERROR_CHECK(err_code);


}



//step 8.1: create advertisement event handler
static void on_adv_evt(ble_adv_evt_t ble_adv_evt){

  ret_code_t err_code;

  switch (ble_adv_evt){
  
    case BLE_ADV_EVT_FAST:

    NRF_LOG_INFO(&amp;quot;Fast advertising.&amp;quot;);
    err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
    APP_ERROR_CHECK(err_code);
    break;

    case BLE_ADV_EVT_IDLE:
    NRF_LOG_INFO(&amp;quot;advertising idle.&amp;quot;);
    err_code = bsp_indication_set(BSP_INDICATE_IDLE);
    APP_ERROR_CHECK(err_code);

    default:
    break;
  }
}


//8th step: advertising initialization
static void advertising_init(void){

  ret_code_t err_code;

  ble_advertising_init_t init;

  memset(&amp;amp;init, 0, sizeof(init));

  //try manufac custom data in packet
  ble_advdata_manuf_data_t                  manuf_data; //Variable to hold manufacturer specific data
  uint8_t data[]                          = &amp;quot;2&amp;quot;; //Our data to advertise
  manuf_data.company_identifier           = 0x0059; //Nordics company ID
  manuf_data.data.p_data                  = data;
  manuf_data.data.size                    = sizeof(data);
  init.advdata.p_manuf_specific_data      = &amp;amp;manuf_data;

   //

 

  init.advdata.name_type = BLE_ADVDATA_FULL_NAME;

  init.advdata.include_appearance = true;

  init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;

  init.config.ble_adv_fast_enabled = true;

  init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
  init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;

  init.evt_handler = on_adv_evt;

  err_code = ble_advertising_init(&amp;amp;m_advertising, &amp;amp;init);
  APP_ERROR_CHECK(err_code);

  ble_advertising_conn_cfg_tag_set(&amp;amp;m_advertising, APP_BLE_CONN_CFG_TAG);


}


//step 5.1: BLE event handler
static void ble_evt_handler(ble_evt_t const *p_ble_evt, void * p_context){

  ret_code_t err_code = NRF_SUCCESS;

  switch(p_ble_evt-&amp;gt;header.evt_id){
  
    case BLE_GAP_EVT_DISCONNECTED:

    NRF_LOG_INFO(&amp;quot;Device is disconnected.&amp;quot;);

    break;

    case BLE_GAP_EVT_CONNECTED:

    NRF_LOG_INFO(&amp;quot;Device is connected.&amp;quot;);

    err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
    APP_ERROR_CHECK(err_code);

    m_conn_handle = p_ble_evt-&amp;gt;evt.gap_evt.conn_handle;

    err_code = nrf_ble_qwr_conn_handle_assign(&amp;amp;m_qwr, m_conn_handle);
    APP_ERROR_CHECK(err_code);

    break;

    case BLE_GAP_EVT_PHY_UPDATE_REQUEST:

    NRF_LOG_DEBUG(&amp;quot;PHY Update Request.&amp;quot;);

    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-&amp;gt;evt.gap_evt.conn_handle, &amp;amp;phys);
    APP_ERROR_CHECK(err_code);

    break;

  }
}


//5th step: ble stack init
static void ble_stack_init(){

  ret_code_t err_code;
  
  err_code = nrf_sdh_enable_request();
  APP_ERROR_CHECK(err_code);

  uint32_t ram_start = 0;
  err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &amp;amp;ram_start);
  APP_ERROR_CHECK(err_code);

  err_code = nrf_sdh_ble_enable(&amp;amp;ram_start);
  APP_ERROR_CHECK(err_code);

  NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
}

//4th step: create a function to initialize the power management
static void power_management_init(void){

  ret_code_t err_code = nrf_pwr_mgmt_init();
  APP_ERROR_CHECK(err_code);
}


//3rd step: inialize bsp(leds)
static void leds_init(void){

  ret_code_t err_code = bsp_init(BSP_INIT_LEDS, NULL);
  APP_ERROR_CHECK(err_code);
}



//2nd step: initialize app timer
static void timers_init(void){

  ret_code_t err_code = app_timer_init();
  APP_ERROR_CHECK(err_code);

  err_code = app_timer_create(&amp;amp;m_adv_data_update_timer, 
                                  APP_TIMER_MODE_REPEATED, 
                                  adv_data_update_timer_handler);

  APP_ERROR_CHECK(err_code);

  //ADC SAMPLES
  err_code = app_timer_create(&amp;amp;m_app_timer_id, APP_TIMER_MODE_REPEATED, app_timer_handler);
  APP_ERROR_CHECK(err_code);

  //STAGE 2 BLINKY
  err_code = app_timer_create(&amp;amp;m_app_timer_id1, APP_TIMER_MODE_REPEATED, app_timer_handler1);
  APP_ERROR_CHECK(err_code);

}


/**@brief Function for starting timers.
 */
static void application_timers_start(void)
{
       ret_code_t err_code;
       err_code = app_timer_start(m_adv_data_update_timer, 
                                    ADV_DATA_UPDATE_INTERVAL, 
                                    NULL);
       APP_ERROR_CHECK(err_code);

       //ADC SAMPLES
       err_code = app_timer_start(m_app_timer_id, ADC_INTERVAL, NULL);
       APP_ERROR_CHECK(err_code);

       //STAGE 2 BLINKY
       err_code = app_timer_start(m_app_timer_id1, SECOND_STATUS_INTERVAL, NULL);
       APP_ERROR_CHECK(err_code);
}


//1st step: initialize the logger
static void log_init(){

  ret_code_t err_code = NRF_LOG_INIT(NULL);
  APP_ERROR_CHECK(err_code);

  NRF_LOG_DEFAULT_BACKENDS_INIT();
}

//step 4.1: idle state handler
static void idle_state_handle(void){

  if(NRF_LOG_PROCESS() == false){
    
    nrf_pwr_mgmt_run();
  }
}

//11th step: create a function which will start the advertisement
static void advertising_start(void){

  ret_code_t err_code = ble_advertising_start(&amp;amp;m_advertising, BLE_ADV_MODE_FAST);
  APP_ERROR_CHECK(err_code);

}



int main(void)
{
    log_init();

    timers_init();

    leds_init();

    saadc_init();

    gpio_init();

    power_management_init();

    ble_stack_init();

    gap_params_init();

    gatt_init();

    advertising_init();

    services_init();

    conn_params_init();

    NRF_LOG_INFO(&amp;quot;BLE Base application started...&amp;quot;);

    application_timers_start();

    advertising_start();

    bsp_board_init(BSP_INIT_BUTTONS);
    bsp_board_init(BSP_INIT_LEDS);


    // Enter main loop.
    while (true)
    {
      switch (status){
      
        case none:
 
          bsp_board_led_off(2);
         
          break;
        
        case 1: //if the button has been pressed once, turn led on
         
          bsp_board_led_on(2);

          break;

        case second://if the button has been pressed twice, toggle led every 5s
          
          //handled by app timer interrupt

          break;

        case third:

          bsp_board_led_off(2);

          break;
      }

      idle_state_handle();
    }
}&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How do I show the status of an LED with a ble advertising packet using nRF52840-dk?</title><link>https://devzone.nordicsemi.com/thread/327897?ContentTypeID=1</link><pubDate>Fri, 03 Sep 2021 07:31:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9bbad94c-6c93-434c-b3d1-2122618788fc</guid><dc:creator>Jared</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Are you planning to do a connection or just advertising(broadcasting)? If the former then you should setup a &lt;a href="https://devzone.nordicsemi.com/nordic/short-range-guides/b/bluetooth-low-energy/posts/ble-services-a-beginners-tutorial"&gt;custom service&lt;/a&gt;, if the latter then you should use the &lt;a href="https://devzone.nordicsemi.com/nordic/short-range-guides/b/bluetooth-low-energy/posts/ble-advertising-a-beginners-tutorial"&gt;manufacturing data field&lt;/a&gt; to display the data.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;regards&lt;/p&gt;
&lt;p&gt;Jared&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>