<?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>Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/117891/sending-shell-commands-between-two-nrf52-dk-n52832-mcu-boards-over-ble-based-on-smp</link><description>Hello Support-Team! We are designing a system, where we need to maintain some settings using shell commands (we plan to develop our own set of customised commands). Our platform already implements OTA DFU with MCUboot/SMP-server and external SPI flash</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Fri, 17 Jan 2025 11:27:35 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/117891/sending-shell-commands-between-two-nrf52-dk-n52832-mcu-boards-over-ble-based-on-smp" /><item><title>RE: Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/thread/518826?ContentTypeID=1</link><pubDate>Fri, 17 Jan 2025 11:27:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d8318d09-9e63-4206-816f-b28d287c64eb</guid><dc:creator>SP2AND</dc:creator><description>&lt;p&gt;ok, thank you very much!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/thread/518728?ContentTypeID=1</link><pubDate>Thu, 16 Jan 2025 20:23:37 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0e6b0493-4da3-4434-9e96-5c3f71fc61b0</guid><dc:creator>Amanda Hsieh</dc:creator><description>&lt;p&gt;&lt;span&gt;I have created an internal for the developers to take a look.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/thread/518518?ContentTypeID=1</link><pubDate>Wed, 15 Jan 2025 19:55:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c444ee10-7e85-4c5d-a0da-a0ad9a5fa099</guid><dc:creator>SP2AND</dc:creator><description>&lt;p&gt;v2.5.1&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/thread/518517?ContentTypeID=1</link><pubDate>Wed, 15 Jan 2025 19:52:46 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:3ff2f4ea-8a87-4cb9-b90c-16e16482afab</guid><dc:creator>Amanda Hsieh</dc:creator><description>&lt;p&gt;What NCS version are you using?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/thread/517931?ContentTypeID=1</link><pubDate>Fri, 10 Jan 2025 12:21:36 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:fb1da9ec-d6f2-4e45-bccc-32e6704a14f2</guid><dc:creator>SP2AND</dc:creator><description>&lt;p&gt;Hello Amanda,&lt;br /&gt;thank you very much for your promt response and hints!&lt;br /&gt;First of all (as mentioned already before) - I use central smp_clinet and smp_srv samples as our reference samples. &lt;br /&gt;I can observe the &amp;quot;echo&amp;quot; command (when pressing Button 1), which is send from the SMP central client to &lt;br /&gt;the SMP server and received the &amp;#39;echo&amp;#39; response. This in no problem at all.&lt;br /&gt;I also undestand the operation of:&lt;br /&gt;send_smp_echo() and smp_echo_rsp_proc() functions.&lt;br /&gt;The &amp;#39;echo&amp;#39; belongs to OS group (0) and it has a header id of &amp;#39;0&amp;#39;, &lt;br /&gt;see code snippet of the SMP client sample&amp;nbsp; below:&lt;br /&gt;&amp;nbsp; smp_cmd.header.group_l8 = 0; /* OS */&lt;br /&gt;&amp;nbsp; smp_cmd.header.id&amp;nbsp; = 0; /* ECHO */&lt;br /&gt;--&lt;br /&gt;As we want to extend the functionality for the SHELL commands - we defined &lt;br /&gt;another Button (2) with new set of handler functions:&lt;br /&gt;send_smp_user_tst() for sending SHELL Command&lt;br /&gt;and&lt;br /&gt;smp_user_tst_rsp_proc() for handling SHELL Response&lt;br /&gt;see code below:&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// SHELL Command Sending&lt;br /&gt;static int send_smp_user_tst(struct bt_dfu_smp *dfu_smp,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const char *string) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static struct smp_buffer smp_cmd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_state_t zse[CBOR_ENCODER_STATE_NUM];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t payload_len;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_new_encode_state(zse, ARRAY_SIZE(zse), smp_cmd.payload,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(smp_cmd.payload), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Stop encoding on the error. */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zse-&amp;gt;constant_state-&amp;gt;stop_on_error = true;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_map_start_encode(zse, CBOR_MAP_MAX_ELEMENT_CNT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_tstr_put_lit(zse, &amp;quot;d&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_tstr_put_term(zse, string);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_map_end_encode(zse, CBOR_MAP_MAX_ELEMENT_CNT);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!zcbor_check_error(zse)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Failed to encode SMP User packet, err: %d\n&amp;quot;, zcbor_pop_error(zse));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EFAULT;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; payload_len = (size_t)(zse-&amp;gt;payload - smp_cmd.payload);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.op = 2; /* Write */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.flags = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.len_h8 = (uint8_t)((payload_len &amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.len_l8 = (uint8_t)((payload_len &amp;gt;&amp;gt; 0) &amp;amp; 0xFF);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.group_h8 = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.group_l8 = 9; /* SHELL */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.seq = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_cmd.header.id&amp;nbsp; = 0; /* SHELL command line execute&amp;nbsp; */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return bt_dfu_smp_command(dfu_smp, smp_user_tst_rsp_proc,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(smp_cmd.header) + payload_len,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;smp_cmd);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// SHELL Command&amp;#39;s RESPONSE decoding&lt;br /&gt;static void smp_user_tst_rsp_proc(struct bt_dfu_smp *dfu_smp) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t *p_outdata = (uint8_t *)(&amp;amp;smp_rsp_buff);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const struct bt_dfu_smp_rsp_state *rsp_state;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rsp_state = bt_dfu_smp_rsp_state(dfu_smp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;User response part received, size: %zu.\n&amp;quot;, rsp_state-&amp;gt;chunk_size);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rsp_state-&amp;gt;offset + rsp_state-&amp;gt;chunk_size &amp;gt; sizeof(smp_rsp_buff)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Response size buffer overflow\n&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p_outdata += rsp_state-&amp;gt;offset;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memcpy(p_outdata, rsp_state-&amp;gt;data, rsp_state-&amp;gt;chunk_size);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bt_dfu_smp_rsp_total_check(dfu_smp)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Total User response received - decoding\n&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (smp_rsp_buff.header.op != 3 /* WRITE RSP*/) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Unexpected operation code (%u)!\n&amp;quot;, smp_rsp_buff.header.op);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t group = ((uint16_t)smp_rsp_buff.header.group_h8 &amp;lt;&amp;lt; 8) |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_rsp_buff.header.group_l8;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Response group (%u)\n&amp;quot;, group);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Rsp command Id (%u)\n&amp;quot;, smp_rsp_buff.header.id);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t payload_len = ((uint16_t)smp_rsp_buff.header.len_h8 &amp;lt;&amp;lt; 8) |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_rsp_buff.header.len_l8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_state_t zsd[CBOR_DECODER_STATE_NUM];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct zcbor_string key;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool ok;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zcbor_new_decode_state(zsd, ARRAY_SIZE(zsd), smp_rsp_buff.payload, payload_len, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Stop decoding on the error. */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zsd-&amp;gt;constant_state-&amp;gt;stop_on_error = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Start decoding the CBOR map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ok = zcbor_map_start_decode(zsd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ok) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Failed to start CBOR map decoding err: %d\n&amp;quot;, zcbor_pop_error(zsd));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Decode the key&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ok = zcbor_tstr_decode(zsd, &amp;amp;key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ok) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Failed to decode key error: %d\n&amp;quot;, zcbor_pop_error(zsd));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Key decoded: %.*s\n&amp;quot;, key.len, key.value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (key.len == 2 &amp;amp;&amp;amp; strncmp((char *)key.value, &amp;quot;rc&amp;quot;, 2) == 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int64_t value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Decode integer value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ok = zcbor_int32_decode(zsd, &amp;amp;value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ok) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Failed to decode value for key &amp;#39;rc&amp;#39; error: %d\n&amp;quot;, zcbor_pop_error(zsd));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Key &amp;#39;rc&amp;#39; has value: %lld\n&amp;quot;, value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Unexpected key: %.*s\n&amp;quot;, key.len, key.value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // End decoding the CBOR map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ok = zcbor_map_end_decode(zsd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ok) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Failed to end CBOR map decoding error: %d\n&amp;quot;, zcbor_pop_error(zsd));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;CBOR map decoding completed OK\n&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;--&lt;br /&gt;//-----------------------------------------------------------------------------&lt;br /&gt;// button 2 handler&lt;br /&gt;static void button_user(bool state) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (state) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static unsigned int user_cnt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char buffer[32];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int ret;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++user_cnt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;User test: %d\n&amp;quot;, user_cnt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //snprintk(buffer, sizeof(buffer), &amp;quot;stats show&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; snprintk(buffer, sizeof(buffer), &amp;quot;show&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send User message to SMP Server&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = send_smp_user_tst(&amp;amp;dfu_smp, buffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ret) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&amp;quot;Echo command send error (err: %d)\n&amp;quot;, ret);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;Additionally for smp_srv sample prj.conf (update since yesterday) we set:&lt;br /&gt;CONFIG_SHELL_BACKEND_SERIAL=n&lt;br /&gt;CONFIG_SHELL_BACKEND_DUMMY=y&lt;br /&gt;CONFIG_ZCBOR_VERBOSE=y&lt;br /&gt;to properly service SHELL (avoid using SERIAL Shell backend)&lt;br /&gt;and disply more decoding CBOR messages.&lt;br /&gt;&lt;br /&gt;With the above config/code we can send SHELL Group command from the SMP client to the server:&lt;br /&gt;smp_cmd.header.group_l8 = 9; /* SHELL */&lt;br /&gt;but we are not sure what to set in header.id&amp;nbsp; - see below:&lt;br /&gt;&amp;nbsp;smp_cmd.header.id&amp;nbsp; = 0; /* SHELL command line execute&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;and what to send as payload to this command (e.g. &amp;quot;stats show&amp;quot; or &amp;quot;show:&amp;quot; or anything else ?)&lt;br /&gt;--&lt;br /&gt;Below are our logs for smp_client Button 1:&lt;br /&gt;Echo test: 1&lt;br /&gt;bytes left: 127, byte: 0x61, elem_count: 0x0, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;bytes left: 125, byte: 0x6f, elem_count: 0x1, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;Echo response part received, size: 28.&lt;br /&gt;Total response received - decoding&lt;br /&gt;bytes left: 19, byte: 0x61, elem_count: 0xffffffef, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;bytes left: 17, byte: 0x6f, elem_count: 0xffffffee, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;{_&amp;quot;r&amp;quot;: &amp;quot;Echo message: 1&amp;quot;}&lt;br /&gt;&lt;br /&gt;Below are our logs for smp_srv Button 1:&lt;br /&gt;[01:33:15.940,643] &amp;lt;inf&amp;gt; smp_bt_sample: Connected&lt;br /&gt;bytes left: 19, byte: 0x61, elem_count: 0xffffffef, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;bytes left: 17, byte: 0x6f, elem_count: 0xffffffee, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:62&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:339&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:355&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:483&lt;br /&gt;bytes left: 2466, byte: 0x61, elem_count: 0x0, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;bytes left: 2464, byte: 0x6f, elem_count: 0x1, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;Below are our logs for smp_client Button 2:&lt;br /&gt;User test: 1&lt;br /&gt;bytes left: 127, byte: 0x61, elem_count: 0x0, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;bytes left: 125, byte: 0x64, elem_count: 0x1, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;User response part received, size: 14.&lt;br /&gt;Total User response received - decoding&lt;br /&gt;Response group (9)&lt;br /&gt;Rsp command Id (0)&lt;br /&gt;bytes left: 5, byte: 0x62, elem_count: 0xffffffef, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;Key decoded: rc&lt;br /&gt;bytes left: 2, byte: 0x3, elem_count: 0xffffffee, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;Key &amp;#39;rc&amp;#39; has value: 3&lt;br /&gt;CBOR map decoding completed OK&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;Below are our logs for smp_srv Button 2:&lt;br /&gt;bytes left: 8, byte: 0x61, elem_count: 0xffffffef, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;bytes left: 6, byte: 0x64, elem_count: 0xffffffee, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:124&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:62&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:339&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:355&lt;br /&gt;bytes left: 1, byte: 0xff, elem_count: 0xffffffed, err: 10, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_decode.c:483&lt;br /&gt;bytes left: 2466, byte: 0x62, elem_count: 0x0, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;bytes left: 2463, byte: 0x3, elem_count: 0x1, err: 0, WEST_TOPDIR/modules/lib/zcbor/src/zcbor_encode.c:75&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;So, as you can see - I can send Group 9 command with Id 0 and receive a response (Key &amp;#39;rc&amp;#39; has value: 3)&lt;br /&gt;but I don&amp;#39;t understand the error code...?&lt;br /&gt;I suspect it is (ZCBOR_ERR_LOW_ELEM_COUNT 3) defiend in:&lt;br /&gt;zcbor_common.h&lt;br /&gt;as:&lt;br /&gt;#define ZCBOR_SUCCESS 0&lt;br /&gt;#define ZCBOR_ERR_NO_BACKUP_MEM 1&lt;br /&gt;#define ZCBOR_ERR_NO_BACKUP_ACTIVE 2&lt;br /&gt;#define ZCBOR_ERR_LOW_ELEM_COUNT 3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; Error 3&lt;br /&gt;#define ZCBOR_ERR_HIGH_ELEM_COUNT 4&lt;br /&gt;#define ZCBOR_ERR_INT_SIZE 5&lt;br /&gt;#define ZCBOR_ERR_FLOAT_SIZE 6&lt;br /&gt;#define ZCBOR_ERR_ADDITIONAL_INVAL 7 ///! &amp;gt; 27&lt;br /&gt;#define ZCBOR_ERR_NO_PAYLOAD 8&lt;br /&gt;#define ZCBOR_ERR_PAYLOAD_NOT_CONSUMED 9&lt;br /&gt;#define ZCBOR_ERR_WRONG_TYPE 10&lt;br /&gt;#define ZCBOR_ERR_WRONG_VALUE 11&lt;br /&gt;#define ZCBOR_ERR_WRONG_RANGE 12&lt;br /&gt;#define ZCBOR_ERR_ITERATIONS 13&lt;br /&gt;#define ZCBOR_ERR_ASSERTION 14&lt;br /&gt;#define ZCBOR_ERR_UNKNOWN 31&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;So (if my assumption is right) we are sending (to the SHELL) some wrong command&amp;#39;s payload or arguments are incomplete .&lt;br /&gt;&lt;br /&gt;Could you help us - how the group / header id and other SMP frame&amp;#39;s paramters should be specified for the &lt;br /&gt;SHELL commands?&lt;br /&gt;Best would be a working sample with prefdefined &amp;#39;stats&amp;#39; commands (llike: show, clear or any other).&lt;br /&gt;Best Regards,&lt;br /&gt;Andy&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/thread/517781?ContentTypeID=1</link><pubDate>Thu, 09 Jan 2025 17:30:34 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8b398d06-474f-4b77-9313-d5d366ce6cff</guid><dc:creator>Amanda Hsieh</dc:creator><description>&lt;p&gt;Hi,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;You can use the&amp;nbsp;&lt;/span&gt;&lt;a title="" href="https://docs.nordicsemi.com/bundle/nrf-apis-latest/page/group_bt_dfu_smp_ga8307223846219139dc605c9cb398b1a5.html#ga8307223846219139dc605c9cb398b1a5"&gt;&lt;code&gt;&lt;span&gt;bt_dfu_smp_command()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;function to&amp;nbsp;send a command;&amp;nbsp;&lt;/span&gt;&lt;a title="" href="https://docs.nordicsemi.com/bundle/nrf-apis-latest/page/group_bt_dfu_smp_ga9c01f83ca8124fe3ee6b46e8fc94099e.html#ga9c01f83ca8124fe3ee6b46e8fc94099e"&gt;&lt;code&gt;&lt;span&gt;bt_dfu_smp_rsp_state()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;function to access the data of the current part of the response.&amp;nbsp;&lt;/span&gt;Here is the&amp;nbsp;&lt;a href="https://github.com/nrfconnect/sdk-nrf/tree/v2.9.0/samples/bluetooth/central_smp_client"&gt;central_smp_client&lt;/a&gt;&amp;nbsp;sample showing how to&amp;nbsp;&lt;span&gt;send a simple OS/echo command and respond. Although it doesn&amp;#39;t handle the shell command, it is still worth knowing the flow.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
[quote user="SP2AND"]Do you have any samples how to handle (smp_user_tst_rsp_proc() ) the responses for commands send in this way?[/quote]
&lt;p&gt;I cannot find that function. Is that the correct name? Maybe &lt;a href="https://github.com/nrfconnect/sdk-nrf/blob/v2.9.0/samples/bluetooth/central_smp_client/src/main.c#L265"&gt;this function&lt;/a&gt; could give you some inspiration.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;If the above information cannot help, please provide the snippet code of your&amp;nbsp;send_smp_shell_command and respond functions.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Regards,&lt;br /&gt;Amanda H.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Sending SHELL commands between two nRF52-DK (n52832 MCU) boards over BLE based on SMP</title><link>https://devzone.nordicsemi.com/thread/517718?ContentTypeID=1</link><pubDate>Thu, 09 Jan 2025 13:33:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:48998481-ebc2-4ca8-b59c-1099aff78e1f</guid><dc:creator>SP2AND</dc:creator><description>&lt;p&gt;We further investigated on our side and it seems that we need to simply replace the command group id (Group id of 0 for &amp;#39;echo&amp;#39; with id of 9 for &amp;#39;shell&amp;#39;) commands i.e.:&lt;/p&gt;
&lt;p&gt;smp_cmd.header.group_l8 = 9; /* SHELL */&lt;/p&gt;
&lt;p&gt;Could you please just confirm, if it is the right approach?&amp;nbsp; With this change we can send commands and get responses from server side (we get decoding error: 10). Do you have any samples how to handle (smp_user_tst_rsp_proc() ) the responses for commands send in this way?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>