杰理蓝牙耳机开发 -- SPP功能开发与应用
杰理蓝牙耳机开发 -- SPP功能开发与应用
- 蓝牙SPP应用场景
- 杰理SDK SPP功能开发流程
- 使能SPP
- SPP数据接收和状态回调
- SPP自定义UUID设定
- SPP数据发送示例
- SPP数据接收示例
蓝牙SPP(Serial Port Profile,串行端口协议)是一种蓝牙协议,其核心作用是在蓝牙设备之间建立虚拟的串口(模拟传统有线串口)来进行数据通信,是实现设备间数据交互的关键协议。最近在开发蓝牙耳机中的SPP通信功能,本篇文章简单介绍杰理SDK中SPP的使用方法,梳理SPP功能的开发流程。
蓝牙SPP应用场景
蓝牙SPP的设计初衷是“无线替代有线串口”,解决传统串口布线受限、传输距离短的问题,同时兼容现有基于串口的上位机系统,降低开发成本。在实际开发中,SPP的应用场景高度聚焦于“非实时性数据传输”,尤其适用于产线生产测试场景、与安卓设备或外设通信的场景(IOS不开放SPP功能,因此蓝牙SPP仅支持安卓设备、Windows、其他蓝牙外设)等。
蓝牙SPP有以下主要优势:
- 模拟串口:它能让蓝牙设备像传统串口线一样通信,上位机应用无需修改原有的串口通信逻辑,只需将数据 “发送到” 虚拟的蓝牙串口即可;
- 通用性强:支持所有蓝牙版本(从1.x版本到6.x),兼容性较强,无需复杂的适配。
- 数据类型灵活:主要传输字节流数据,不限制内容格式,可用于传输指令、文本、传感器数据等各类非实时性数据。
杰理SDK SPP功能开发流程
杰理的SDK就自带有完整的SPP开发接口,开发者可通过“配置+代码调用”的方式快速集成支持SPP功能,以下以JL708N-SDK为例,演示如何使用杰理可视化SDK打开蓝牙SPP通信功能。
使能SPP
在可视化工具的“蓝牙配置”模块中使能SPP打开开关,使能开关直接关联SDK的宏定义TCFG_BT_SUPPORT_SPP。

耳机设备开机进入蓝牙模式后,调用app_spp_init()函数初始化SPP,为后续通信分配内存、初始化协议栈状态机提供基础运行环境。

SPP数据接收和状态回调
SPP通信需实时处理 “数据接收”和“连接状态变化”(如连接成功、断开、异常),因此需为SPP通道分配唯一标识(handle),并注册对应的回调函数。handl是SPP通道的唯一标识,每个SPP连接对应一handle,SDK通过handle管理不同设备的连接(如同时连接两个安卓手机时,需两个handle区分)。杰理SDK提供了以下三个关键回调函数接口,需根据需求注册,重点是需要注册数据接收回调和SPP状态变化回调,如下图。

SPP自定义UUID设定
设定SPP自定义UUID,自定义UUID与代码service_data数组对应关系如下修改

对于自定义UUID的十六进制值,需确保与外部设备(如安卓APP)配置的UUID完全一致,否则会连接失败。

SPP数据发送示例
杰理SDK提供app_spp_data_send()函数用于发送SPP数据,只需传入 “handle”、“数据缓冲区”、“数据长度”三个参数即可完成发送,比如这里使用发送函数发送一个6字节的数
发送成功后手机SPP终端上数据显示

SPP数据接收示例
当外部设备(如安卓手机)发送SPP数据给耳机芯片时,SDK会自动触发之前注册的 “数据接收回调函数” custom_demo_spp_receive_callback(),开发者可在回调中解析数据、打印日志或执行控制逻辑。
如下手机发送0x00010203AABBCCDD的8个字节数据,耳机收到数据进入注册的custom_demo_spp_receive_callback中,并将数据打印输出。

