彩屏仓耳机介绍
📎 原始文档:https://www.kdocs.cn/l/cq7dLqWwpmPn 彩屏仓耳机介绍
如上图所示,耳机的通信涉及到982和7012。分别负责不同的功能交互
耳机与982:完成智能充电仓基本功能,以及耳机把MAC地址发送给982
耳机与7012:完成彩屏仓本身的功能互动
- 软件设置:
- 982通信相关设置 耳机与982通信设置,以及怎么发送本地MAC地址给到982
打开智能充电仓
在串口数据处理那里加多个命令完成和982交换地址的实现。

//自定义串口指令
#define CMD_CUSTOM_DEAL 0xAA //彩屏仓自定义命令
#define UART_PROFILE_HEAD 0xAA
#define UART_PROFILE_ENDING 0xBB
#define UART_PROFILE_HEAD_INDEX 0
#define UART_PROFILE_CMD_INDEX 1
#define UART_PROFILE_DATA_INDEX 2
enum{
EARPHONE_MAC_MSG=0x31, //earphone mac event
};
void Send_Mac(u8 event,u8 *addr,u8 len)
{
log_info("Send_Mac\n");
put_buf(addr,6);
unsigned char temp[9];
unsigned short j=0;
temp[0]=CMD_CUSTOM_DEAL;//数据包头
temp[1] = event;
memcpy(&temp[2],addr,6);
u16 sum = 0;
for(u8 i=0;i<(sizeof(temp)-1);i++)
{
sum += temp[i];
}
temp[sizeof(temp)-1]=(sum)&0xff;//表示一次传输完成
put_buf(temp,sizeof(temp)),
chargestore_api_write(temp,sizeof(temp));
}
u8* printf_mac(void)
{
printf("%s:\n",__func__);
put_buf(bt_cfg.mac_addr,6);
put_buf(bt_cfg.tws_local_addr,6);
put_buf(bt_mac_addr_for_testbox,6);
return bt_cfg.mac_addr;
}
case CMD_CUSTOM_DEAL:
log_info_hexdump(buf, len);
u16 sum = 0;
for(u8 i=0;i<len-1;i++){
sum += buf[i];
}
u8 check = sum&0xFF;
printf("check:%d buf[len-1]:%d %d\n",check,buf[len-1],buf[UART_PROFILE_CMD_INDEX]);
if(buf[len-1] != check)
{
printf("err check\n");
return ;
}
switch (buf[UART_PROFILE_CMD_INDEX]){
case 0x10:
extern u8* printf_mac(void);
Send_Mac(EARPHONE_MAC_MSG,printf_mac(),6);
printf("充电仓发送mac地址过来\n");
break;
default:
break;
}
break;
- 与7012 BLE通信相关设置 耳机做BLE从机与7012 BLE从机建立通信,去建立BLE服务去收发数据。我们要关注的就是收发数据的接口。把对应的接口加进去。






添加sbox_user_app.c sbox_user_app.h lib_esbox.a文件
- 耳机应用功能相关 耳机应用功能部分,主要分为两部分:一个是耳机这边的状态信息的同步 ,一部分是响应彩屏仓7012的BLE功能指令。
耳机状态信息同步的话,需要在对应的位置添加。例如音量的同步,需要在音量改变时去主动同步音量;
| 功能 | 描述 |
|---|---|
| 同步状态 | 同步与手机蓝牙连接状态,音乐状态,音量等级同步,anc、eq模式状态同步,通话状态 |
| 控制音乐状态 | 控制手机音乐的播放暂停上下曲,音量加减 |
| anc,eq模式切换 | 控制耳机的anc,eq模式实时切换 |
| 查找耳机 | 可以让耳机最大音量播放查找提示音,靠声音查找耳机位置 |
| 控制通话 |
添加手机连接状态:
添加连接仓BLE连接状态:
添加MIC mute标志位:
添加同步耳机状态:
添加耳机电量同步:
添加通话状态同步:
- 彩屏仓耳机SDK或对应DEMO(示例SDK的版本不一定是最新,最新版本需要自己更新/重新对比移植) 主要文件:
| sbox_user_app.c | 主要包含了大部分彩屏仓的应用代码,状态同步和功能实现接口 |
|---|---|
| sbox_user_app.h | 包含所用到的常量和涉及的头文件 |
| lib_esbox.a | 底层库 |
| 相关文件 | 所有需要在耳机对应流程里面添加的彩屏仓相关功能状态接口的文件,例如:电量更新需要在app_power_manager.c里面去获取,音量同步需要在手机音量同步文件vol_sync.c里面去同步下音量给仓。 |
彩屏仓的功能目前已经在可视化各个耳机芯片上同步更新到最新的版本了,优先使用可视化最新的SDK里面的彩屏仓功能
同时仓那边也按以下文档修改适配:
701 仓那边要做以下修改
各系列补丁:
697N_SDK:
AC697_earphone_release_v2.4.1_colorscreen_v1.1s.7z
698N_SDK:
AC698N_earphone_172_colorscreen_v1.0.zip
AC698N_earphone_172_colorscreen_v1.1_20240903_移植添加时间同步+歌词同步+拍照+抖音点赞.zip
700N_平台SDK
700N_普通SDK
注意:若在D4上跑需裁剪功能,另需修改ANC固定地址为0x7e000
JL700N_earphone_release_V1.3.8_colorscreen_V201.7z
701N_平台SDK
701_patch06_ear_box.7z
(上述sdk不建议用了,用701可视化最新的3.3.0SDK)
注意:701 仓那边要做以下修改
问题修改:
701N_普通sdk:
JL701n_earphone_release_v1.6.1_colorscreen_v1.2_patch0507(2024/5/7)
JL701n_earphone_release_v1.6.1_colorscreen_v1.2_patch0507.zip
Describe:
- 修复主从切换不同步手机型号问题
- 修复对耳信息同步在app core任务中执行
- 修复先连接发射器再连接手机时间不同步问题
- 修复耳机连手机播歌首次配对出声音慢问题
JL701n_earphone_release_v1.6.1_colorscreen_v1.2(2024/3/20)
JL701n_earphone_release_v1.6.1_colorscreen_v1.2.zip
Describe:
5. 修复codeblock编译下载问题 
708N_平台SDK
710N_平台SDK
~~旧版本:~~
697_SDK:AC697_earphone_release_v2.4.1_colorscreen_v1.0(2024/3/13)AC697_earphone_release_v2.4.1_colorscreen_v1.0.7z
JL701n_earphone_release_v1.6.1_colorscreen_v1.1(2024/3/14)JL701n_earphone_release_v1.6.1_colorscreen_v1.1.zip
~~Describe:~~1、修复codeblock不能编译问题
JL701n_earphone_release_v1.6.1_colorscreen_v1.0(2024/3/13)JL701n_earphone_release_v1.6.1_colorscreen_v1.0.zip
~~Describe:~~
add sbox协议实现与701彩屏仓的数据交互add 抖音控制功能add 时间同步功能add 歌词显示功能抖音控制介绍
3.1功能介绍
需要打开 TCFG_USER_EDR_ENABLE和USER_SUPPORT_PROFILE_HID
可以实现上滑、下滑、左滑、右滑、点赞。
对于ios手机
因为iPhone手机不同系统版本和型号触摸点位置不一样,可以通过调整坐标记录到vm区,下次连接的时候先移动到记录位置。
3.2移植介绍
1、添加edr_hid文件夹

2、全局搜索TCFG_USER_EDR_ENABLE移植相关宏包含的代码

- 本地播放介绍 需要开启USER_LOCAL_PALY_ENABLE
相关文件:
移植的时候参考USER_LOCAL_PALY_ENABLE包裹的代码
移植文件流程
把下列的.c .h文件全部移植到新建的jl_earbox文件夹。
打开BLE的宏 与第三方协议的支持(不选任意的协议),在app_config.h文件里面添加 JL_SBOX_EN定义,并在对应的位置加上 JL_SBOX_EN

同时可视化工具上面打开智能充电仓,TWS配对方式改为充电仓配对,打开ID3_v2、ID3_v1音乐信息、
TCFG_BT_SUPPORT_MAP

vol_sync.c 里面加上在手机下发音量等级时同步音量等级
app_testbox.c 里面嵌入私有的单线串口通信接口
user_app_chargestore_data_deal
再按照抖音点赞移植文档把bt_profile_config.c配置修改 和 hid的初始化的流程移植进去
彩屏仓抖音点赞移植.otl
协议移植包:jl_earbox.7z(库文件是710版本,其他版本咨询JL工程师)
| 文件 | 文件描述 |
|---|---|
| sbox_protocol.c | 包含了彩屏仓协议BLE相关的初始化配置,以及服务读写回调函数等重要接口的实现 |
| sbox_user_app.c | 包含了彩屏仓协议数据通信相关的初始化配置,以及协议里面状态的同步和响应仓设置的功能响应接口的实现 |
| sbox_core_config.c | 包含了彩屏仓协议数据协议的配置,发数接口,数据缓存保护机制,以及一些功能的定义 |
| sbox_uart_app.c | 包含了彩屏仓协议单线串口通信流程用于交换地址等操作 |
| sbox_eq_switch.c | 自定义EQ增益设置,以及EQ模式切换流程 |
| sbox_key_setting.c | 自定义按键功能设置流程 |
| sbox_connect_emitter.c | 彩屏仓耳机连接仓发射器流程文件 |
| edr_hid_user.c | EDR_HID相关流程文件 |
| user_video_ctr.c | EDR_HID控制抖音,音量加减,手机拍照等功能实现 |
| lib_esbox.a | 彩屏仓协议数据的加密流程文件 |
修改SDK 的makefile文件,添加对应的.C文件 以及 对应的头文件索引路径和库文件


移植实例说明
1. BLE核心通信部分
GATT服务定义:
因为耳机可视化SDK默认用的服务特征AE01,AE02都已经被RCSP所使用,所以可视化平台所用的服务特征需要重新创建。这是可视化平台和普通平台的差异,如果要用同一个仓的话,需要把仓服务特征也修改。
| 可视化平台 | 普通平台 | |
|---|---|---|
| 服务uuid | AE00 | AE30 |
| 服务特征uuid(write_no_response) | AE98 | AE01 |
| 服务特征uuid(notify) | AE99 | AE02 |
广播间隔和连接参数:
私有协议收发接口:
int att_write_without_rsp_handler(uint8_t *buffer, uint16_t buffer_size);//耳机协议收数接口
int custom_send_data_to_box(u8 *data, u16 len);//耳机协议发数接口
私有协议的加密解密处理:
涉及到私有协议的加密解密的处理的文件是,lib_earbox.a或者是对应的需要编译成库的.c,.h文件(sbox_core_code.c,aes.c,aes.h)。加密解密主要是为了和我们自己的仓做绑定,不让其他方案能兼容我们的耳机或者仓
//aes解密处理处理接口
bool sbox_ble_aes128_ecb_decrypt(uint8_t *key, uint8_t *input, uint16_t input_len, uint8_t *output)
//aes加密处理处理接口
bool sbox_ble_aes128_ecb_encrypt(uint8_t *key, uint8_t *input, uint16_t input_len, uint8_t *output)
//彩屏仓私有协议数据处理handle
int att_write_without_rsp_handler(uint8_t *buffer, uint16_t buffer_size)
//按照私有协议格式BLE发数的接口
void custom_app_send_ble_data(u8 *data, u16 len)
BLE接收数据的缓存:
对应的接口都放在sbox_core_config.c里面了,实质流程就是BLE收到私有协议栈的数据后缓存进CBUF里面,再遍历处理指令数据,处理完后清空CBUF里面的指令数据。

仓和耳机配对连接流程:
耳机通过充电脚的单线通信发送地址给到982,982再转给仓。仓收到耳机地址后本地记忆保存,并在每次开机或者开盖的时候会主动搜索该地址的BLE进行连接。
2. 耳机状态同步部分
需要同步给仓的应用状态有以下这些:
| 播歌状态 | 通话来电状态 | 音量等级 | EQ模式 | ANC状态 | 手机时间 | 歌词同步 | 自定义按键 | 耳机电量 |
|---|
(请根据实际情况去增删功能的同步代码)
所有信息的同步:
经典蓝牙的连接完成、连接断开以及BLE连接,都会同步下所有的状态信息。

播歌状态同步:
播歌状态在手机下发AVRCP状态后会同步播歌状态
通话状态同步:
来电去电通话状态变化时会同步通话状态
音量等级同步:
在手机同步或者耳机/仓 设置音量都会同步下播歌的音量等级


EQ模式、anc模式、自定义按键同步:
同步所有信息的时候以及设置功能的时候会去同步EQ模式、anc模式、自定义按键状态信息给到仓。
时间信息同步:
获取手机时间的功能需要打开蓝牙MAP协议
(注意别的地方不能又发USER_CTRL_MAP_READ_TIME了)
歌词同步:
需要more_avctp_cmd_support 、TCFG_DEC_ID3_V2_ENABLE、TCFG_DEC_ID3_V1_ENABLE置1,同时在bredr_handle_register()里面注册回调函数bt_music_info_handle_register(user_get_bt_music_info); 这些都设置OK后,耳机会在获取到歌词信息的时候把信息同步到仓(耳机能不能获取到歌词信息取决与手机播放器是否支持)
耳机电量同步:
耳机电量在tws同步或者电量变化的时候会主动同步给到仓
3. 耳机功能设置部分:
需要响应仓的设置有以下这些:
| 音量设置 | 歌曲播放控制 | EQ设置 | ANC设置 | 查找耳机 | 自定义按钮设置 | 通话控制 | 连接发射器设置 | 控制手机拍照 | 控制抖音点赞 |
|---|
(其他自定义的功能可以自己添加)
所有的功能设置都是仓通过BLE指令发送过来,耳机这边在sys_smartstore_event_handle()里面去解析指令。而功能的响应接口都封装进struct s_box_app_cb 结构体里面去实现了。
