本帖最后由 不爱胡萝卜的仓鼠 于 2024-8-14 01:14 编辑
小熊派的demo中就有sle的demo,我们先跑一下这个demo,以此一步一步探索SLE
如果你没有BLE相关经验,推荐先去学习一些简单的BLE知识,后续很多概念和BLE是非常相似的,简单学习一下BLE可以更好的帮助理解SLE
一.demo 效果
首先说一下这个demo的功能,该demo分为server端和client端,需要分别烧录到2块板子上,然后双方会 自动连接,随后我们就可以通过LOG串口透传数据,对端收到数据后会通过LOG串口打印出来
二.demo编译
先配置一下KConfig,把SLE的demo打开,并选择server端或client端,下图是配置了server
client就不贴图了,只需要选择下面的client即可。
然后是把server和client 2个demo分别编译下载,这个我就不展示了,想看如何编译/烧录的具体步骤请看上一篇文章
这里有一个不算BUG的BUG,client demo中有一个打印没有打印出HEX数据,因为代码中直接使用了%s,应该是写demo是cv过来的。修改如下
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[i]);
}
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();
}
}
三.运行demo
双方上电后会自动连接,连上后就可以实现串口透传了
双方连接成功日志中会打印关键字“Connect”
然后我们测试一下收发数据,可以直接向LOG串口发送数据,即可通过SLE把数据发送到对端。下方日志我尝试双方各自发送数据给对端
可以看到速度是很快的,根据日志上的时间戳,server端是00:03:04.067发送串口指令的,client是00:03:04.090收到的,只花了23ms。这个延迟只是demo预设参数,按照BLE的逻辑,应该会有一个连接间隔参数可以调整,取值范围7.5ms-4s,不知道SLE是否有这样的参数,最小可以调到多少。待我回头仔细阅读代码和星闪官方文档后,看能否解答这个疑惑
四.日志解读
首先放一下双方的日志,大家可以复制出来,自己阅读
server日志:
[23:58:52.065]收←◆\0
[23:58:52.315]收←◆boot.
[23:58:52.518]收←◆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
[23:58:52.634]收←◆bt at register ret = 80000005
bt at register ret = 80000005
Clock config succ.
[ACore] 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 server] sle uart add service in
[sle uart server] sle uart add service, server_id:1, service_handle:1, property_handle:2
[sle uart server] sle uart add service out
[sle uart server] sle_uart_local addr: 0x00 0x00 0x00 0x00 0x00 0x00
[ACore] sle set announce param, handle:1, mode:3, min_interval:c8, max_interval:c8, tx_power: 0
[ACore] sle set announce param, own addr:0x00:**:**:**:00:00
[ACore] sle set announce param, peer addr:0x00:**:**:**:00:00
[sle uart server] data.announce_data_len = 6
[sle uart server] data.announce_data: 0x01 0x02 0x01 0x02 0x02 0x00
[sle uart server] local_name_len = 15
[sle uart server] local_name: 0x73 0x6c 0x65 0x5f 0x75 0x61 0x72 0x74 0x5f 0x73 0x65 0x72 0x76 0x65 0x72
[sle uart server] data.seek_rsp_data_len = 20
[sle uart server] data.seek_rsp_data: 0x0c 0x02 0x0a 0x10 0x0b 0x73 0x6c 0x65 0x5f 0x75 0x61 0x72 0x74 0x5f 0x73 0x65 0x72 0x76 0x65 0x72
[sle uart server] set announce data success.
[ACore] sle start announce in, adv_id:1
[ACore] sle adv cbk in, event:0 status:0
[ACore] sle adv cbk in, event:1 status:0
[ACore] sle adv cbk in, event:2 status:0
[ACore] sle adv cbk in, event:3 status:0
[pm_sys]pm_sys_entry.
[23:58:53.130]收←◆[sle uart server] init ok
[23:58:54.783]收←◆[Connected]
addr:ee:**:**:**:8d:5c, handle:00
[ACore] sle adv cbk in, event:7 status:0
[sle uart server] connect state changed callback conn_id:0x00, conn_state:0x1, pair_state:0x1, disc_reason:0x0
[sle uart server] connect state changed callback addr:ee:**:**:**:8d:a0dff
[sle uart server] sle announce terminal callback id:01
[23:58:57.108]收←◆[sle uart server] pair complete conn_id:00, status:0
[sle uart server] pair complete addr:ee:**:**:**:8d:a0dff
[sle uart server] ssaps ssaps_mtu_changed_cbk callback server_id:0, conn_id:0, mtu_size:fb, status:0
[00:03:04.067]发→◇SLE server send data test
□
[00:03:04.073]收←◆update ssap send report handle: pre handle:ffff, current:0
[00:03:21.191]收←◆[sle uart server] ssaps write request callback cbk server_id:1, conn_id:0, handle:2, status:0
SLE client send data test
client日志:
[23:58:54.039]收←◆\0
[23:58:54.264]收←◆boot.
[23:58:54.467]收←◆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
[23:58:54.581]收←◆bt at register ret = 80000005
bt at register ret = 80000005
Clock config succ.
[ACore] 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]pm_sys_entry.
[adv_report] event_type: 0x03, addr_type: 0x0000, addr: 00:**:**:**:00:00
[adv_report] data length: 6, data: 0x01 0x02 0x01 0x02 0x02 0x00
[sle uart client] sle uart scan data :
0x01 0x02 0x01 0x02 0x02 0x00
[sle uart client] sle uart scan data :
0x01 0x02 0x01 0x02 0x02 0x00
[adv_report] event_type: 0x0b, addr_type: 0x0000, addr: 00:**:**:**:00:00
[adv_report] data length: 20, data: 0x0c 0x02 0x0a 0x10 0x0b 0x73
[sle uart client] sle uart scan data :
0x0C 0x02 0x0A 0x10 0x0B 0x73 0x6C 0x65 0x5F 0x75 0x61 0x72 0x74 0x5F 0x73 0x65 0x72 0x76 0x65 0x72
[23:58:54.783]收←◆[Connected]
addr:00:**:**:**:00:00, handle:00
[sle uart client] conn state changed disc_reason:0x0
[sle uart client] SLE_ACB_STATE_CONNECTED
[23:58:55.301]收←◆[sle uart client] sle_low_latency_rx_enable
[23:58:57.120]收←◆[sle uart client] pair complete conn_id:0, addr:00***0000
ssapc exchange info, conn_id:0, err_code:0
[sle uart client] exchange_info_cbk,pair complete client id:0 status:0
[sle uart client] exchange mtu, mtu size: 520, version: 1.
[23:58:57.182]收←◆discovery character cbk in
discovery character cbk complete in
[sle uart client] 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] sle_uart_client_sample_find_structure_cmp_cbk,client id:0 status:0 type:3 uuid len:0
[00:03:04.090]收←◆
sle uart recived data : SLE server send data test
e?
SLE server send data test
[00:03:21.173]发→◇SLE client send data test
□
[00:03:21.201]收←◆ssapc write rsp handle:2
[sle write_req_complete_cbk]conn_id:0, err_code:0
[sle uart client] sle_uart_client_sample_write_cfm_cb, conn_id:0 client id:0 status:0 handle:02 type:00
代码我还没有仔细阅读,通过日志我先简单理解一下这个demo运行过程中经历的阶段。
这边的server和client的概念和BLE一致,但是BLE中一般不叫server或者client,叫主机(client)、从机(server),(平时叫习惯了,所以下面我就用主机、从机来称呼了)
在星闪中也有类似的概念:管理节点(G节点)和被管理节点(T节点),T节点是挂在G节点下面的,G节点下面可以挂多个T节点。G节点可以与别的G节点连接。T节点之间可以通过G节点做跳板,实现数据传输。看这个意思,G节点就很类似BLE中的主机
先看从机日志
整体逻辑和BLE的从机很类似,上电初始化,注册一些回调,添加服务、配置ADV数据,开启ADV,被主机scan,连接
但是这个日志中有个怪怪的,“bt at register ret”,这个日志感觉没有弄好,这个注册接口是不是借用BLE部分的函数?咋还有bt?我搜索了代码,没有发现这串关键字,应该是SDK中调用的
然后说一下我发现的和BLE不同点
BLE中叫ADV、SCAN,但是在SLE中叫announce和seek。
BLE的服务中包含的的特征值,SLE里服务还是叫server,特征值叫property??(不知道这个我理解的对不对)
其他的BLE中都很类似。服务、扫描响应包、local name、mtu等,都是熟悉的东西
再看主机日志
主机这边没啥好说的,该说的,从机那边都说过了。广播数据的内容两边也是对的上的。
五.感悟
整个SLE的demo跑下来,和BLE的运行运行逻辑是很类似的。可惜现在市面上无法阅读到SLE的core文档,还都是保密阶段,无法看到更细节的内容,在demo中也有很多魔法数字或者魔法名字,只能靠猜。
如果要用这个SDK去做产品现在估计可能不太合适,但是尝鲜玩一玩还是挺不错的,也很感谢小熊派官方所做的努力,公开了SDK还写了配套的文档。
我希望后续可以持续跟进SDK或者文档,提供更多内容给到大家,在硬件方面我很希望可以有一个SLE抓包器,这样我就可以看一下空中交互内容了,可以更好的理解SLE底层的动作