1. 星闪简介
星闪(NearLink / SparkLink)是中国自主研发的新一代无线短距通信技术,由国际星闪无线短距通信联盟(International SparkLink Alliance,ISLA,简称"星闪联盟")推动标准化。ISLA 于 2020 年 9 月成立,由国内信息通信领域多家企业联合发起,旨在推动自主无线短距通信技术的产业化和国际化。
星闪协议栈分为三层架构:基础应用层、基础服务层和星闪接入层。其中接入层提供两种通信接口------SLB(SparkLink Basic,同步宽带接入)和 SLE(SparkLink Low Energy,同步窄带接入),分别面向不同场景需求。SLB 对标 Wi-Fi,适用于低时延、高可靠、高并发的业务场景,如车载主动降噪、无线投屏、工业运动控制;SLE 对标蓝牙,适用于低功耗、轻量级连接的业务场景,如无线音频传输、传感器数据采集、工业数据采集等。
1.1 星闪和 SLE 的关系
星闪是一整套无线短距通信技术体系,SLE 是其中的一种接入模式。
星闪接入层定义了两种独立的接入技术:
-
SLB(SparkLink Basic / Synchronous Low Latency Broadband):同步宽带接入,工作频段包含 2.4 GHz 和 5 GHz,采用正交多载波 CP-OFDM 波形,支持最高 1024QAM 调制,空口单向时延小于 20 μs,用于低时延、高可靠、高并发场景。
-
SLE(SparkLink Low Energy / Synchronous Low Energy):同步窄带接入,工作于 2.4 GHz ISM 频段,采用单载波传输,带宽支持 1 / 2 / 4 MHz,调制方式支持 GFSK、BPSK、QPSK、8PSK,采用 Polar 信道编码,空口双向交互时延可低至 250 μs,峰值速率达 12 Mbps,每 bit 能耗仅为蓝牙的约 40%(即相比蓝牙降低约 60%),抗干扰能力提升约 7 dB。
SLE 与 SLB 共享星闪的基础服务层和基础应用层,但空口技术独立,可分别工作于不同场景。本文后续内容中出现的 "SLE" 均指星闪低功耗接入模式,而非星闪技术的全部。
1.2 硬件准备
星闪 SLE 通信测试需要以下硬件:
|----------------------|-----------------------------------------------------------------------------------------------|
| 硬件 | 说明 |
| EASY-EAI-NANO-TB 开发板 | 核心板 RV1126B,至少两块,一块运行 server,一块运行 client |
| DB37 星闪模组 | SDIO 接口,NANO-TB 板卡已自带,无需额外购买 |
| 星闪射频天线 | 两端 ( server 端与 client 端) **各接一根,必须接上。**不接天线时射频层完全无法互通,client 扫描不到任何设备 |
| USB 数据线 | 用于 ADB 连接和固件烧录 |
| 电源适配器 | 为开发板供电 |
1.3 关键前置检查
demo 运行前必须确认以下条件均满足:
- 两端 DB37 模组均已接上星闪射频天线,如下图所示:

- 两端的板子 sparklinkd 守护进程在运行:
执行以下命令查看 sparklinkd 守护进程是否在运行:
cpp
` ps aux | grep sparklinkd`
下图为 sparklinkd 守护进程已在运行:

若未运行则手动执行:
cpp
` sparklinkd &`
- 确认内核模块已加载:
执行以下命令确认内核模块是否加载:
cpp
`lsmod | grep -i sle`
期望看到 sle_soc 和 plat_soc(plat_soc 引用计数应为 3,依赖 wifi_soc、sle_soc、ble_soc),如下图所示:

- 确认 HCI 设备就绪:
执行以下命令确认 HCI 设备是否就绪:
cpp
`hciconfig`
期望 hci0: Type: Primary Bus: SDIO,状态 UP RUNNING,如下图所示:

- . 快速上手
通过串口调试或ssh调试,进入开发板后台,运行lsb_release -a命令,可查看系统版本:

-
- .1 开发环境准备
如果您初次阅读此文档 ,请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》,并按照其相关的操作,进行编译环境的部署。
在PC端Ubuntu系统中执行run脚本,进入EASY-EAI编译环境,具体如下所示。
cpp
`cd ~/develop_environment
./run.sh 2404
`

* 开发环境版本要与开发板【正在运行】的系统版本【一致】。
* 开发板是其它版本的固件,可以修改对应的./run.sh参数(如2204),进入到对应的编译环境;也可以把开发板烧录成与编译环境匹配的固件,具体操作可参考《固件烧录与更新》。
2.2 源码获取以及例程编译
2.2.1 源码获取
首先,在虚拟机后台终端,执行以下命令,创建外设单例源码管理目录:
cpp
`cd /opt/
mkdir -p EASY-EAI-Nano-TB/demo`
如下图所示:

其次,到【百度网盘】上下载相关的单例程序:
提取码: 1234
比如把单例程序下载到:此电脑\C:\Users\Easy-Eai\Desktop\EASY-EAI (无规定,用户可自主选择),如下图所示:

再将下载好的单例复制进入虚拟机的文件系统,过程如下:
首先复制整个单例文件夹,如下图所示:

其次在虚拟机中执行以下操作将单例粘贴到虚拟机家目录中:

最后,在终端中执行以下命令进入到对应的例程目录:
cpp
`cd EASY-EAI-Nano-TB/demo/14_sle-uuid`
如下图所示:

2.2.2 例程编译
由于依赖库部署在板卡上,因此交叉编译过程中必须保持 /mnt 挂载,如若已将板子目录挂载到 /mnt/ 目录,则可跳过此命令(若是板子目录已经挂载但是没有挂载到 /mnt/ 目录,则需先解除挂载板子目录再执行以下命令):
cpp
`sudo mount -t nfs -o nolock,vers=3 192.168.3.113:/ /mnt `
注:
* 192.168.3.113 要替换成您自己的板子 ip,可以在板子上执行命令 ifconfig 查看板子 ip。
如下图所示:

执行编译操作,命令如下所示:
cpp
`./build.sh`
编译成功后会在 Release/ 目录下生成两个 demo:sle_server_sample、sle_client_sample,如下图所示:

并且脚本会自动将两个demo复制到板子的 /userdata/ 目录下,如下图所示:

执行以下命令解除板子目录挂载:
cpp
`sudo umount -l /mnt`

2.3 例程运行
2.3.1 拷贝 demo 到板子
因为该 demo 分 server 端和 client 端,因此,需要将server 端的 demo 和 client端的 demo 分别拷到两块板子上。按照章节 2.2 源码获取以及例程编译 的步骤,一块板子上已经有两个 demo:sle_server_sample、sle_client_sample 了,若是没有也可按照以下步骤将两个 demo 拷贝到板子上。
首先执行以下命令进入到对应的例程目录:
cpp
`cd EASY-EAI-Nano-TB/demo/14_sle-uuid`
如下图所示:

在拷贝 demo 之前要先执行以下命令(192.168.3.178 要替换成您自己板子的 ip,可以在板子上运行命令 ifconfig 查看板子 ip)将板子挂载到容器:
cpp
`sudo mount -t nfs -o nolock,vers=3 192.168.3.178:/ /mnt`
如下图所示:

执行以下命令拷贝 demo 到板子的 /userdata 目录:
cpp
`sudo cp Release/* /mnt/userdata/`
如下图所示:

执行以下命令解除板子目录挂载:
cpp
`sudo umount -l /mnt`
如下图所示:

2.3.2 server 端运行(开发板 A)
先启动 server 端,因为 server 启动后会进入广播状态等待 client 扫描发现。
执行以下命令进入存放 demo 的板子目录:
cpp
`cd userdata/`
如下图所示:

执行以下命令运行 server 端 demo:
cpp
`./sle_server_sample`
如下图所示:

当看到 sle announce enable callback id:01, state:0 时,表示 server 已进入广播状态,此时可以启动 client 端,如下图所示:

2.3.3 client 端运行(开发板 B)
在 server 端广播已开启后,再启动 client 端。
执行以下命令进入存放 demo 的板子目录:
cpp
`cd userdata/`
如下图所示:

执行以下命令运行 client端 demo:
cpp
`./sle_client_sample`
如下图所示:

实际测试中,client 端在扫描启动后约 1.7 秒 即扫描到 server。偶有第一次连接超时的情况,client 会自动断开并重新扫描,第二次连接通常能成功。
2.4 运行效果
配对成功、服务发现完成后,client 开始持续发送数据,server 端每收到 100 个数据包计算并输出一次通信速率,如下图所示:

速率计算方式(位于 sle_uuid_server.c 的 sle_ssaps_write_request_cbk 回调中):
float time = (float)(g_end_tv_us - g_begin_tv_us) / 1000000.0;
float speed = write_cb_para->length * RECV_PKT_CNT * 8 / time / 1000.0;
即:每接收 100 个数据包(RECV_PKT_CNT = 100),用总数据量(单包长度 × 100 × 8 比特)除以总耗时(微秒精度),换算为 Kbps。
实测通信速率范围约为 296 ~ 396 Kbps,平均约 355 Kbps。速率波动属正常现象,受无线环境、天线位置、板间距离等因素影响。
停止测试时,按 Ctrl+C 分别退出 client 和 server 程序。server 端退出时会打印 recv signal: 2, exit sle_server_sample.,然后执行 deinit 流程(关闭广播、删除服务、disable SLE)。
3. 星闪例程说明
例程源码目录 14_sle-uuid 的目录结构为:

3.1 server 端
server 端示例代码路径为:14_sle-uuid /sle_uuid_server / sle_app.c。该测试用例代码逻辑流程如下所示:




3.2 client 端
client 端示例代码路径为:14_sle-uuid /sle_uuid_client /src/ sle_client.c。该测试用例代码逻辑流程如下所示:



