<?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 to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/122796/how-to-resubscribe-to-old-ble-handles-upon-reconnection</link><description>Hello Nordic Team, 
 
 For my application, I am using two nRF54L15 chips with one configured as a master and the other a slave. For the remainder of this post, I will be discussing my Bluetooth Master code. I setup the discovery process to search through</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 22 Jul 2025 23:57:41 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/122796/how-to-resubscribe-to-old-ble-handles-upon-reconnection" /><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/543262?ContentTypeID=1</link><pubDate>Tue, 22 Jul 2025 23:57:41 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:3d67fbaf-d6ff-4205-bff0-338dd206963e</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Thank you for the direction and insights.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After going over your description and the example you suggested, I believe I know where I am going wrong with bonding.&amp;nbsp; I was confused by the bt_conn_set_bondable( ) function which doesn&amp;#39;t actually initiate the bond and instead should be using bt_conn_set_security to triggers the bond (like you suggested). I added this call at&amp;nbsp;BT_SECURITY_L2 (since&amp;nbsp;BT_SECURITY_L1 is the default and won&amp;#39;t trigger) and this seems to be working.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I need to do more architectural changes to accomplish my goal of skipping discovery, but this is the solution I needed.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thanks for all your help, Susheel!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/543150?ContentTypeID=1</link><pubDate>Tue, 22 Jul 2025 10:57:40 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:96b618db-6546-43ac-91d6-cc07c85890d1</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Most of the central samples in the NCS SDK have this feature already and show you how to trigger bonding.. For example if you look into &lt;a href="https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/samples/bluetooth/central_bas/README.html"&gt;central_bas &lt;/a&gt;it shows how to discover the battery service and use &lt;a href="https://docs.zephyrproject.org/apidoc/latest/group__bt__conn.html#gae001f1268e1ff42c3c974c95dcb6735d"&gt;bt_conn_set_security &lt;/a&gt;in your connected() callback to trigger bonding. It also shows how to use &lt;a href="https://docs.nordicsemi.com/bundle/ncs-1.0.0/page/nrf/include/bluetooth/services/bas_c.html#_CPPv323bt_gatt_bas_c_subscribeP13bt_gatt_bas_c23bt_gatt_bas_c_notify_cb"&gt;bt_gatt_bas_c_subscribe &lt;/a&gt;in your security_changed callback handler once the link is encrypted. You can also see central_hids sample for the same reference.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/542918?ContentTypeID=1</link><pubDate>Fri, 18 Jul 2025 21:24:13 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4486e777-a231-451c-a10d-550feb5846df</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;To complete my thought, are there any good examples how to perform bonding?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/542917?ContentTypeID=1</link><pubDate>Fri, 18 Jul 2025 21:23:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:075aacd0-93f6-40e7-afa2-31df6e49537f</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hello again,&lt;/p&gt;
&lt;p&gt;I spent some time trying a few different tactics as well as the example code you have provided. No attempt has worked.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Despite me re-initializing the structure&amp;nbsp;like your example code above, the last notification will always fail to subscribe with an error code (-12 ---&amp;gt;&amp;nbsp;&lt;span&gt;ENOMEM&lt;/span&gt;). Why am I receiving this error code when trying to subscribe outside of the discovery process? This error code seems to suggest that I am running out of memory for this operation.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;// Create fresh structure for fast subscription
struct bt_gatt_subscribe_params fresh = {
    .notify       = notifyStructBackup[handle].notify,
    .value_handle = notifyStructBackup[handle].value_handle,
    .ccc_handle   = notifyStructBackup[handle].ccc_handle,
    .value        = BT_GATT_CCC_NOTIFY,
};
notifyStruct[handle] = fresh;

int err = bt_gatt_subscribe(conn, &amp;amp;notifyStruct[handle]);&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I am also using the memset in the notify callback as you suggested, but that did not change anything unfortunately.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;uint8_t genericNotifyCollect(volatile uint8_t* storageArr, volatile bool* storageFlag, void (*codeInject)(uint8_t*),
    struct bt_gatt_subscribe_params *params, const void *data) {
    if ((uint8_t*)data) {
        uint8_t* myData = (uint8_t*)data;

        // Optionally Collect the Data
        if (storageArr != NULL &amp;amp;&amp;amp; storageFlag != NULL) {
            *storageFlag = true;
		    oa_memcpy((uint8_t*)storageArr, myData, VND_MAX_LEN);
        }

        // Optionally, Perform Code Injection
        // This drastically reduces the code for some files
        if (codeInject != NULL) {
            codeInject(myData);
        }
    } else {
          printk(&amp;quot;[BLE] UNSUBSCRIBING: Notify Returned Null: %d\n&amp;quot;, params-&amp;gt;value_handle);

        // Delete Parameters and Unsubscribe
		memset(params, 0, sizeof(*params));
        return BT_GATT_ITER_STOP;
    }

	// Continue Receiving Notification
    return BT_GATT_ITER_CONTINUE;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Researching this a bit more, it seems bonding is the proper way to do this. I haven&amp;#39;t any good examples of how to do this online. I saw 2 examples on the Nordic Academy for enabling bonding on the peripheral but not the central.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/542317?ContentTypeID=1</link><pubDate>Mon, 14 Jul 2025 06:32:46 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5f60c478-7e14-497a-98e4-737ed31f29cc</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;You’re seeing the “-128” errors because once the ATT channel is torn down there’s no socket left to drive the write-of-“0” to the CCCD. In other words, calling bt_gatt_unsubscribe() inside your disconnected() handler is too late. the GATT bearer is already gone, so the unsubscribe write fails with ENOTCONN. Instead, let Zephyr tell you when it’s done (it will invoke your notify callback with data==NULL to signal that unsubscribe has completed) and then just clear out your params struct. Something like this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;static uint8_t genericNotifyCollect(struct bt_gatt_subscribe_params *params,
                                    const void *data, uint16_t length)
{
    if (!data) {
        // completed the CCCD-write
        memset(params, 0, sizeof(*params));
        return BT_GATT_ITER_STOP;
    }
    
    return BT_GATT_ITER_CONTINUE;
}&lt;/pre&gt;&lt;br /&gt;When subscriptions are removed &lt;code&gt;notify&lt;/code&gt; callback is called with the data set to NULL according to the documentation &lt;a href="https://zephyr-docs.listenai.com/doxygen/html/group__bt__gatt__client.html?utm_source=chatgpt.com#gad38ed6884a40271e77b58632172674d5"&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You need to then build&amp;nbsp;a fresh &lt;code&gt;bt_gatt_subscribe_params&lt;/code&gt; (i.e. zero-initialized) on every new connect , fill in only:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;p.value_handle = stored_handle;
p.ccc_handle   = stored_ccc;
p.value        = BT_GATT_CCC_NOTIFY;
p.notify       = your_notify_cb;

and then call 

bt_gatt_subscribe(conn, &amp;amp;p);&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;To kick of bonding (SMP pairing) from your master side you need to register your authentication callbacks using &lt;a href="https://docs.zephyrproject.org/apidoc/latest/group__bt__conn.html#ga1bf13d2dfdbdf0a72f9b1c759ef23f60"&gt;bt_conn_auth_cb_register&lt;/a&gt; and also set the security level once you are connected using &lt;a href="https://docs.zephyrproject.org/apidoc/latest/group__bt__conn.html#gae001f1268e1ff42c3c974c95dcb6735d"&gt;bt_conn_set_security &lt;/a&gt;to say BT_SECUTIRY_L2 for example.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/542287?ContentTypeID=1</link><pubDate>Fri, 11 Jul 2025 22:40:25 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4c2acef0-a10e-4af6-9c6f-704cea34bd92</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hi Susheel,&lt;/p&gt;
&lt;p&gt;I have tested your initial response for resetting the subscribe params and found this yields the same result as before. Additionally, I tried unsubscribing during the disconnected() callback and found that the unsubscribing fails, providing a (-128) socket not connected error. See updated code below with log output. Thoughts?&lt;/p&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;void subscribeToStoredHandles(struct bt_conn *conn, char* addr) {
    bool subscribe;

    for (NOTIFY_CHAR_HANDLES_T handle = NOTIFY_FS_STATUS; handle &amp;lt; NUM_OF_NOTIFY_CHARS; handle++) {
        // Reset Subscribe Status
        subscribe = false;

        // Check if Handle is Valid
        if (notifyStruct[handle].ccc_handle != 0) {
            // Determine if Current Connection Matches Handle
            switch(handle) {
                case NOTIFY_FS_STATUS:
                case NOTIFY_FS_QUAT:
                case NOTIFY_FS_LOG:
                case NOTIFY_FS_RAW:
                    if (conn == *ptrFSConn) {
                        subscribe = true;
                    }
                    break;
                case NOTIFY_GL_VALUE:
                    if (conn == *ptrGLConn) {
                        subscribe = true;
                    }
                    break;
                case NOTIFY_TB_CMD:
                case NOTIFY_FWU_INFO:
                case NOTIFY_FWU_DATA:
                    if (conn == *ptrTBConn) {
                        subscribe = true;
                    }
                    break;
                default:
                    break;
            }

            // Perform Subscribe
            if (subscribe) {
                // Create fresh structure for fast subscription
                struct bt_gatt_subscribe_params fresh = {
                    .notify       = notifyStruct[handle].notify,
                    .value_handle = notifyStruct[handle].value_handle,
                    .ccc_handle   = notifyStruct[handle].ccc_handle,
                    .value        = BT_GATT_CCC_NOTIFY,
                };
                notifyStruct[handle] = fresh;

                int err = bt_gatt_subscribe(conn, &amp;amp;notifyStruct[handle]);
                // int err = bt_gatt_resubscribe(BT_ID_DEFAULT, addr, &amp;amp;notifyStruct[handle]);
                if (err) {
                    printk(&amp;quot;[BLE] FAILURE: Subscribe failed (err %d). value=%d, value_handle=%d, ccc_handle=%d, notify=%d, subscribe=%d, node=%d, flags=%d, handle=%d\n&amp;quot;,
                        err,
                        notifyStruct[handle].value,
                        notifyStruct[handle].value_handle,
                        notifyStruct[handle].ccc_handle,
                        notifyStruct[handle].notify,
                        notifyStruct[handle].subscribe,
                        notifyStruct[handle].node,
                        notifyStruct[handle].flags,
                        handle);
                } else {
                    printk(&amp;quot;      - - Subscribed to value=%d, value_handle=%d, ccc_handle=%d, notify=%d, subscribe=%d, node=%d, flags=%d, handle=%d\n&amp;quot;,
                        notifyStruct[handle].value,
                        notifyStruct[handle].value_handle,
                        notifyStruct[handle].ccc_handle,
                        notifyStruct[handle].notify,
                        notifyStruct[handle].subscribe,
                        notifyStruct[handle].node,
                        notifyStruct[handle].flags,
                        handle);

                }
            }
        }
    }&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Log:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;00&amp;gt; [BLE] Primary Service Discovered. Val = 0x1855, Handle = 41, End Handle = 55
00&amp;gt;       - 16-Bit Characteristic Discovered. Val = 0x2b26, Handle = 42
00&amp;gt;       - 16-Bit Characteristic Discovered. Val = 0x2b29, Handle = 44
00&amp;gt;       - - Looking for Notify Descriptor...
00&amp;gt;       - - Descriptor Discovered. Val = 0x2902, Handle = 46
00&amp;gt;       - - Subscribed to value=1, value_handle=45, ccc_handle=46, notify=176809, subscribe=0, node=0, flags=536904920, handle=0
00&amp;gt;       - 16-Bit Characteristic Discovered. Val = 0x2b2a, Handle = 47
00&amp;gt;       - - Looking for Notify Descriptor...
00&amp;gt;       - - Descriptor Discovered. Val = 0x2902, Handle = 49
00&amp;gt;       - - Subscribed to value=1, value_handle=48, ccc_handle=49, notify=176845, subscribe=0, node=536904924, flags=536904944, handle=1
00&amp;gt;       - 16-Bit Characteristic Discovered. Val = 0x2b2c, Handle = 50
00&amp;gt;       - - Looking for Notify Descriptor...
00&amp;gt;       - - Descriptor Discovered. Val = 0x2902, Handle = 52
00&amp;gt;       - - Subscribed to value=1, value_handle=51, ccc_handle=52, notify=176881, subscribe=0, node=536904948, flags=536904968, handle=2
00&amp;gt;       - 16-Bit Characteristic Discovered. Val = 0x2b2d, Handle = 53
00&amp;gt;       - - Looking for Notify Descriptor...
00&amp;gt;       - - Descriptor Discovered. Val = 0x2902, Handle = 55
00&amp;gt;       - - Subscribed to value=1, value_handle=54, ccc_handle=55, notify=176913, subscribe=0, node=536904972, flags=536904992, handle=3
00&amp;gt; [BLE] Looking for Next Service...
00&amp;gt; [BLE] Bluetooth Discovery: Complete


00&amp;gt; [BLE] UNSUBSCRIBING: Notify Returned Null: 54
00&amp;gt; [BLE] UNSUBSCRIBING: Notify Returned Null: 51
00&amp;gt; [BLE] UNSUBSCRIBING: Notify Returned Null: 48
00&amp;gt; [BLE] UNSUBSCRIBING: Notify Returned Null: 45
00&amp;gt; [BLE] FAILURE: Unsubscribe failed (err -128). value=0, value_handle=45, ccc_handle=46, notify=176809, subscribe=0, node=0, flags=536904920, handle=0
00&amp;gt; [BLE] FAILURE: Unsubscribe failed (err -128). value=0, value_handle=48, ccc_handle=49, notify=176845, subscribe=0, node=0, flags=536904944, handle=1
00&amp;gt; [BLE] FAILURE: Unsubscribe failed (err -128). value=0, value_handle=51, ccc_handle=52, notify=176881, subscribe=0, node=0, flags=536904968, handle=2
00&amp;gt; [BLE] FAILURE: Unsubscribe failed (err -128). value=0, value_handle=54, ccc_handle=55, notify=176913, subscribe=0, node=0, flags=536904992, handle=3
00&amp;gt; [BLE] Device Status: Disconnected 0x8


00&amp;gt; [BLE] Device Status: Connected
00&amp;gt; [BLE] Using Cached Handles
00&amp;gt;       - - Subscribed to value=1, value_handle=45, ccc_handle=46, notify=176809, subscribe=0, node=0, flags=536904920, handle=0
00&amp;gt;       - - Subscribed to value=1, value_handle=48, ccc_handle=49, notify=176845, subscribe=0, node=536904924, flags=536904944, handle=1
00&amp;gt;       - - Subscribed to value=1, value_handle=51, ccc_handle=52, notify=176881, subscribe=0, node=536904948, flags=536904968, handle=2
00&amp;gt; [BLE] FAILURE: Subscribe failed (err -12). value=1, value_handle=54, ccc_handle=55, notify=176913, subscribe=0, node=0, flags=536904992, handle=3&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I am not bonded with my device, but I also tried using bt_gatt_resubscribe(). Predictably, this does not work either. I did some quick searching for the bonding API but did not find anything. What function must be called to initiate bonding with my peripheral?&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/542188?ContentTypeID=1</link><pubDate>Fri, 11 Jul 2025 06:57:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:50ef03f6-645c-429f-aae0-413e86ce89b7</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;It looks like you are re-using the structures from the previous connection. Do not reuse bt_gatt_subscribe_params structures from a previous connection. Reinitialize these structures before resubscribing. Use bt_gatt_resubscribe() if you are bonded and the server supports persistent subscriptions, but still ensure the parameters are valid and reinitialized. Always set all required fields before calling bt_gatt_subscribe() or bt_gatt_resubscribe().&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/542160?ContentTypeID=1</link><pubDate>Thu, 10 Jul 2025 23:39:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e953f4d2-20a7-4526-9273-dd57250635b1</guid><dc:creator>LeviRand</dc:creator><description>&lt;p&gt;Hi Susheel,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I appreciate your response. It is clear from what you are saying that my approach is incorrect. Thank you for providing an example using the resubscribe method. I will fully evaluate your response and get back soon. Work is busy, so hopefully early next week.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thanks,&lt;/p&gt;
&lt;p&gt;Levi&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How to Resubscribe to Old BLE Handles Upon Reconnection</title><link>https://devzone.nordicsemi.com/thread/541872?ContentTypeID=1</link><pubDate>Wed, 09 Jul 2025 07:09:32 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:afd32809-c36d-4e1d-ab07-2f1458745f36</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Zephyr ties each bt_gatt_subscribe_params to internal state; you can’t just reuse it after a disconnect without resetting it. If your device is bonded and the server persists CCC, call bt_gatt_resubscribe() on reconnect and I think there no discovery needed.&lt;/p&gt;
&lt;p&gt;Otherwise, explicitly call bt_gatt_unsubscribe() on disconnect, memset your params to zero, repopulate handle/callback fields, then bt_gatt_subscribe() again.&lt;/p&gt;
&lt;p&gt;Something like this (not tested)&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;@@ void subscribeToStoredHandles(struct bt_conn *conn) {
-        // Perform Subscribe
-        if (subscribe) {
-            int err = bt_gatt_subscribe(conn, &amp;amp;notifyStruct[handle]);
-            if (err) {
-                printk(&amp;quot;[BLE] FAILURE: Subscribe failed (err %d)\n&amp;quot;, err);
-            } else {
-                printk(&amp;quot;      - - Subscribed to Handle = %d, Notify = %d\n&amp;quot;,
-                       notifyStruct[handle].ccc_handle, handle);
-            }
-        }
+        // Susheel changes: Perform Subscribe (re‐init struct so internal .node is cleared)
+        if (subscribe) {
+            struct bt_gatt_subscribe_params fresh = {
+                .notify       = notifyStruct[handle].notify,
+                .value_handle = notifyStruct[handle].value_handle,
+                .ccc_handle   = notifyStruct[handle].ccc_handle,
+                .value        = BT_GATT_CCC_NOTIFY,
+            };
+            /* overwrite the old one (zeroes out .node, .handle, .flags, etc) */
+            notifyStruct[handle] = fresh;
+
+            int err = bt_gatt_subscribe(conn, &amp;amp;notifyStruct[handle]);
+            if (err) {
+                printk(&amp;quot;[BLE] FAILURE: Subscribe failed (err %d)\n&amp;quot;, err);
+            } else {
+                printk(&amp;quot;      - - Subscribed to Handle = %d, Notify = %d\n&amp;quot;,
+                       notifyStruct[handle].ccc_handle, handle);
+            }
+        }&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>