[BearPi-Pico H2821]测评 ③SLE数据收发测试及日志流程解读
<div class='showpostmsg'> 本帖最后由 不爱胡萝卜的仓鼠 于 2024-8-14 01:14 编辑<p>小熊派的demo中就有sle的demo,我们先跑一下这个demo,以此一步一步探索SLE</p>
<p> </p>
<p>如果你没有BLE相关经验,推荐先去学习一些简单的BLE知识,后续很多概念和BLE是非常相似的,简单学习一下BLE可以更好的帮助理解SLE</p>
<p> </p>
<p><strong><span style="font-size:24px;">一.demo 效果</span></strong></p>
<p>首先说一下这个demo的功能,该demo分为server端和client端,需要分别烧录到2块板子上,然后双方会 自动连接,随后我们就可以通过LOG串口透传数据,对端收到数据后会通过LOG串口打印出来</p>
<p> </p>
<p><strong><span style="font-size:24px;">二.demo编译</span></strong></p>
<p>先配置一下KConfig,把SLE的demo打开,并选择server端或client端,下图是配置了server</p>
<div style="text-align: center;">
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<p> </p>
</div>
<p>client就不贴图了,只需要选择下面的client即可。</p>
<p>然后是把server和client 2个demo分别编译下载,这个我就不展示了,想看如何编译/烧录的具体步骤请看上一篇文章</p>
<p> </p>
<p>这里有一个不算BUG的BUG,client demo中有一个打印没有打印出HEX数据,因为代码中直接使用了%s,应该是写demo是cv过来的。修改如下</p>
<pre>
<code class="language-cpp">static void sle_uart_client_sample_seek_result_info_cbk(sle_seek_result_info_t *seek_result_data)
{
osal_printk("%s sle uart scan data :\r\n", SLE_UART_CLIENT_LOG);
for (int i = 0; i < seek_result_data->data_length; i++)
{
osal_printk("0x%02X ", seek_result_data->data);
}
osal_printk("\r\n");
if (seek_result_data == NULL) {
osal_printk("status error\r\n");
} else if (strstr((const char *)seek_result_data->data, SLE_UART_SERVER_NAME) != NULL) {
memcpy_s(&g_sle_uart_remote_addr, sizeof(sle_addr_t), &seek_result_data->addr, sizeof(sle_addr_t));
sle_stop_seek();
}
}</code></pre>
<div style="text-align: center;"></div>
<p> </p>
<p><span style="font-size:24px;"><strong>三.运行demo</strong></span></p>
<p>双方上电后会自动连接,连上后就可以实现串口透传了</p>
<p> </p>
<p>双方连接成功日志中会打印关键字“Connect”</p>
<div style="text-align: center;"></div>
<p>然后我们测试一下收发数据,可以直接向LOG串口发送数据,即可通过SLE把数据发送到对端。下方日志我尝试双方各自发送数据给对端</p>
<div style="text-align: center;"></div>
<p>可以看到速度是很快的,根据日志上的时间戳,server端是00:03:04.067发送串口指令的,client是00:03:04.090收到的,只花了23ms。这个延迟只是demo预设参数,按照BLE的逻辑,应该会有一个连接间隔参数可以调整,取值范围7.5ms-4s,不知道SLE是否有这样的参数,最小可以调到多少。待我回头仔细阅读代码和星闪官方文档后,看能否解答这个疑惑</p>
<p> </p>
<p><strong><span style="font-size:24px;">四.日志解读</span></strong></p>
<p>首先放一下双方的日志,大家可以复制出来,自己阅读</p>
<p>server日志:</p>
<pre>
<code>收←◆\0
收←◆boot.
收←◆Flashboot Init!
Power On
Reboot cause:0xF0F0
Reboot count:0x0
Reboot count:0x0
Flash Init Succ!
No need to upgrade...
Jump to app! addr = 0x90115300
Debug uart init succ:80000
version: BS2X 1.0.11
*******************************************************
This sdk only for BearPi_Pico H2821 development board !
Powered by www.bearpi.cn
*******************************************************
cpu 0 entering scheduler
LOS_QueueCreate queueId 0
LOS_QueueCreate queueId 1
收←◆bt at register ret = 80000005
bt at register ret = 80000005
Clock config succ.
sle enable cbk in, result:0
sle enable
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
sle enable: 0
sle uart add service in
sle uart add service, server_id:1, service_handle:1, property_handle:2
sle uart add service out
sle_uart_local addr: 0x00 0x00 0x00 0x00 0x00 0x00
sle set announce param, handle:1, mode:3, min_interval:c8, max_interval:c8, tx_power: 0
sle set announce param, own addr:0x00:**:**:**:00:00
sle set announce param, peer addr:0x00:**:**:**:00:00
data.announce_data_len = 6
data.announce_data: 0x01 0x02 0x01 0x02 0x02 0x00
local_name_len = 15
local_name: 0x73 0x6c 0x65 0x5f 0x75 0x61 0x72 0x74 0x5f 0x73 0x65 0x72 0x76 0x65 0x72
data.seek_rsp_data_len = 20
data.seek_rsp_data: 0x0c 0x02 0x0a 0x10 0x0b 0x73 0x6c 0x65 0x5f 0x75 0x61 0x72 0x74 0x5f 0x73 0x65 0x72 0x76 0x65 0x72
set announce data success.
sle start announce in, adv_id:1
sle adv cbk in, event:0 status:0
sle adv cbk in, event:1 status:0
sle adv cbk in, event:2 status:0
sle adv cbk in, event:3 status:0
pm_sys_entry.
收←◆ init ok
收←◆
addr:ee:**:**:**:8d:5c, handle:00
sle adv cbk in, event:7 status:0
connect state changed callback conn_id:0x00, conn_state:0x1, pair_state:0x1, disc_reason:0x0
connect state changed callback addr:ee:**:**:**:8d:a0dff
sle announce terminal callback id:01
收←◆ pair complete conn_id:00, status:0
pair complete addr:ee:**:**:**:8d:a0dff
ssaps ssaps_mtu_changed_cbk callback server_id:0, conn_id:0, mtu_size:fb, status:0
发→◇SLE server send data test
□
收←◆update ssap send report handle: pre handle:ffff, current:0
收←◆ ssaps write request callback cbk server_id:1, conn_id:0, handle:2, status:0
SLE client send data test
</code></pre>
<p>client日志:</p>
<pre>
<code>
收←◆\0
收←◆boot.
收←◆Flashboot Init!
Power On
Reboot cause:0xF0F0
Reboot count:0x0
Reboot count:0x0
Flash Init Succ!
No need to upgrade...
Jump to app! addr = 0x90115300
Debug uart init succ:80000
version: BS2X 1.0.11
*******************************************************
This sdk only for BearPi_Pico H2821 development board !
Powered by www.bearpi.cn
*******************************************************
cpu 0 entering scheduler
LOS_QueueCreate queueId 0
LOS_QueueCreate queueId 1
收←◆bt at register ret = 80000005
bt at register ret = 80000005
Clock config succ.
sle enable cbk in, result:0
sle enable
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
bt at register ret = 80000005
sle enable: 0.
pm_sys_entry.
event_type: 0x03, addr_type: 0x0000, addr: 00:**:**:**:00:00
data length: 6, data: 0x01 0x02 0x01 0x02 0x02 0x00
sle uart scan data :
0x01 0x02 0x01 0x02 0x02 0x00
sle uart scan data :
0x01 0x02 0x01 0x02 0x02 0x00
event_type: 0x0b, addr_type: 0x0000, addr: 00:**:**:**:00:00
data length: 20, data: 0x0c 0x02 0x0a 0x10 0x0b 0x73
sle uart scan data :
0x0C 0x02 0x0A 0x10 0x0B 0x73 0x6C 0x65 0x5F 0x75 0x61 0x72 0x74 0x5F 0x73 0x65 0x72 0x76 0x65 0x72
收←◆
addr:00:**:**:**:00:00, handle:00
conn state changed disc_reason:0x0
SLE_ACB_STATE_CONNECTED
收←◆ sle_low_latency_rx_enable
收←◆ pair complete conn_id:0, addr:00***0000
ssapc exchange info, conn_id:0, err_code:0
exchange_info_cbk,pair complete client id:0 status:0
exchange mtu, mtu size: 520, version: 1.
收←◆discovery character cbk in
discovery character cbk complete in
sle_uart_client_sample_find_property_cbk, client id: 0, conn id: 0, operate ind: 5, descriptors count: 1 status:0 property->handle 2
sle_uart_client_sample_find_structure_cmp_cbk,client id:0 status:0 type:3 uuid len:0
收←◆
sle uart recived data : SLE server send data test
e?
SLE server send data test
发→◇SLE client send data test
□
收←◆ssapc write rsp handle:2
conn_id:0, err_code:0
sle_uart_client_sample_write_cfm_cb, conn_id:0 client id:0 status:0 handle:02 type:00</code></pre>
<p>代码我还没有仔细阅读,通过日志我先简单理解一下这个demo运行过程中经历的阶段。</p>
<p> </p>
<p>这边的server和client的概念和BLE一致,但是BLE中一般不叫server或者client,叫主机(client)、从机(server),(平时叫习惯了,所以下面我就用主机、从机来称呼了)</p>
<p>在星闪中也有类似的概念:管理节点(G节点)和被管理节点(T节点),T节点是挂在G节点下面的,G节点下面可以挂多个T节点。G节点可以与别的G节点连接。T节点之间可以通过G节点做跳板,实现数据传输。看这个意思,G节点就很类似BLE中的主机</p>
<p> </p>
<p>先看从机日志</p>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<p> </p>
</div>
<p>整体逻辑和BLE的从机很类似,上电初始化,注册一些回调,添加服务、配置ADV数据,开启ADV,被主机scan,连接</p>
<p>但是这个日志中有个怪怪的,“bt at register ret”,这个日志感觉没有弄好,这个注册接口是不是借用BLE部分的函数?咋还有bt?我搜索了代码,没有发现这串关键字,应该是SDK中调用的</p>
<p> </p>
<p>然后说一下我发现的和BLE不同点</p>
<p>BLE中叫ADV、SCAN,但是在SLE中叫announce和seek。</p>
<p>BLE的服务中包含的的特征值,SLE里服务还是叫server,特征值叫property??(不知道这个我理解的对不对)</p>
<p> </p>
<p>其他的BLE中都很类似。服务、扫描响应包、local name、mtu等,都是熟悉的东西</p>
<p> </p>
<p> </p>
<p>再看主机日志</p>
<div style="text-align: center;"></div>
<p>主机这边没啥好说的,该说的,从机那边都说过了。广播数据的内容两边也是对的上的。</p>
<p> </p>
<p><span style="font-size:24px;"><strong>五.感悟</strong></span></p>
<p>整个SLE的demo跑下来,和BLE的运行运行逻辑是很类似的。可惜现在市面上无法阅读到SLE的core文档,还都是保密阶段,无法看到更细节的内容,在demo中也有很多魔法数字或者魔法名字,只能靠猜。</p>
<p>如果要用这个SDK去做产品现在估计可能不太合适,但是尝鲜玩一玩还是挺不错的,也很感谢小熊派官方所做的努力,公开了SDK还写了配套的文档。</p>
<p>我希望后续可以持续跟进SDK或者文档,提供更多内容给到大家,在硬件方面我很希望可以有一个SLE抓包器,这样我就可以看一下空中交互内容了,可以更好的理解SLE底层的动作</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>sle抓包器暂时不用想,几个群里都提过,没有下文。这样响应时间也是很奇怪,理论上星闪不应该这么慢。</p>
walker2048 发表于 2024-8-14 12:02
sle抓包器暂时不用想,几个群里都提过,没有下文。这样响应时间也是很奇怪,理论上星闪不应该这么慢。
<p>这个时间确实有点问题,有点慢,这个就是demo的表现,回头我改个代码,发之前拉个GPIO,收到后拉一下GPIO,看这两个时间差,这应该就是纯星闪的交互时间了,没有其他无关代码执行、串口发送啥的干扰了。</p>
<p> </p>
<p>还有就是连接间隔,我看了client的代码,里面就交换了MTU,并没有连接间隔,按照蓝牙的套路,这玩意儿是主机主动发起的,但是没有,就很奇怪,不交换的话,那他默认值又是多少呢?</p>
<p>gpio的性能也不咋地,测试了一下,翻转性能也就760Khz这样。</p>
<p>默认打印函数是阻塞运行,占用周期长。我这边测试,光是打印一点东西,占用接近2ms</p>
<p> </p>
不爱胡萝卜的仓鼠 发表于 2024-8-14 14:06
这个时间确实有点问题,有点慢,这个就是demo的表现,回头我改个代码,发之前拉个GPIO,收到后拉一下GPIO ...
<p>楼主你好,我按照你说的这种方法测试了一下两个GPIO拉高的时间差,这个时间在6ms到20ms之间,最短的是6.8ms,这与他们宣传的250us差距还挺大的,而且这个时间波动范围也很大,楼主测试的结果也是这样吗</p>
zmlzplzqz 发表于 2024-10-8 11:41
楼主你好,我按照你说的这种方法测试了一下两个GPIO拉高的时间差,这个时间在6ms到20ms之间,最短的是6.8 ...
<p>这个我没有去试过,在config中有一个low latency的开关,你可以打开试一下,可以降低延迟。不过因为没有找到对应的参数配置,也没有第三方抓包工具,没法知道在空口上他到底是多久通讯一次。250us那种是宣传上的极限参数,甚至可能是理论值,看看就好,肯定还是空中的速度,你还要带上收到后的信息处理等,延迟也会变大。就像传输速率,宣传的12Mbps,那玩意儿是理论极限值,实际纯空口都跑不到这个速度的,还带上串口等外设,速率就更低了,有其他家的测速测试,带上串口收发和上位机处理,最大就1.2Mbps</p>
不爱胡萝卜的仓鼠 发表于 2024-10-8 13:48
这个我没有去试过,在config中有一个low latency的开关,你可以打开试一下,可以降低延迟。不过因为没有 ...
<p>好的,谢谢楼主</p>
页:
[1]