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

SPP数据接收和状态回调

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

SPP自定义UUID设定

设定SPP自定义UUID,自定义UUID与代码service_data数组对应关系如下修改
自定义SPP
对于自定义UUID的十六进制值,需确保与外部设备(如安卓APP)配置的UUID完全一致,否则会连接失败。
确认SPP UUID

SPP数据发送示例

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

SPP数据接收示例

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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐