找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

CSR8670项目实战:BluePager蓝牙寻呼机

2020-7-31 10:53| 发布者: csdn| 查看: 5344| 评论: 1|来自: CSDN

摘要: BluePager蓝牙寻呼机是一款功能强大的蓝牙source设备,可以作为无线对讲机的蓝牙功能扩充模块,将无线对讲机与蓝牙耳机无缝对接。

1. 引言

BluePager蓝牙寻呼机是一款功能强大的蓝牙source设备,可以作为无线对讲机的蓝牙功能扩充模块,将无线对讲机与蓝牙耳机无缝对接。

2. 主要功能

系统框图如下:

这里写图片描述

主要功能有:

序号功能项功能描述性能指标
1A2DP播放音乐支持source->sink音乐通过I2S输入,支持SBC, APTX, APTX-LL48K,立体声,16bit,8670做I2S slave
2AVRCP控制支持sink端的播放、暂停、音量、上下曲、快进快退等按键动作
3HFP语音通话支持source->sink语音通过模拟输入,sink->source语音通过模拟输出8K,单声道,16bit
4支持末码重播sink设备按下末码重播键,source进入HFP语音通话状态
5支持拨号语音提示source设备发送拨号->sink设备,sink设备播放拨号提示音
6支持RSSI配对source设备只会同RSSI值大于门限值的sink设备配对
7串口通信支持MCU通过串口控制38400bps,8bit,1停止位,0校验位,无流控

串口命令交互表

序号名称传输方向格式应答
1读取sink设备信息MCU->CSR8670AT#state名称、地址、信号强度、协议、电量、当前解码格式
2sink设备末码重播通知CSR8670->MCUNTF#lastnumsink设备按下末码重播键,进入aghfp通话模式
3sink设备avrcp操作通知CSR8670->MCUNTF#avrcpsink设备avrcp命令(透传avrcp键值,参考avc_operation_id定义)
4sink设备连接完成通知CSR8670->MCUNTF#connectedsink设备连接完成
5source设备发起免提通话MCU->CSR8670AT#callscosource设备已启动免提通话,无需sink按下接听键
6source设备拨号呼叫sink设备MCU->CSR8670AT#outcallsource设备进入拨号状态,sink设备可听到0-1-2-3-4-5-6-7-8-9数字
7source设备拨号呼叫本地接听MCU->CSR8670AT#OUTCALLsource设备本地接听拨号呼叫,进入免提通话,无需sink按下接听键
8source设备RSSI连接A2DPMCU->CSR8670AT#A2DP RSSI50source设备开始搜索RSSI为-50dBm以下的信号最强的设备,连接A2DP source设备已搜索到目标设备,开始配对
9source设备RSSI连接A2DP+HFPMCU->CSR8670AT#A2DP+HFP RSSI90source设备开始搜索RSSI为-90dBm以下的信号最强的设备,连接A2DP+HFP source设备已搜索到目标设备,开始配对
10source主动断开连接MCU->CSR8670AT#disconnectsource设备主动断开连接,进入idle状态
11sink断开连接CSR8670->MCUNTF#disconnectsink设备主动断开连接,source进入idle状态
12source设备paging连接A2DPMCU->CSR8670AT#A2DP PAGE1c521600045ac7source设备直接page目标蓝牙地址的设备,连接A2DP
13source设备paging连接A2DP+HFPMCU->CSR8670AT#A2DP+HFP PAGE1c521600045ac7source设备直接page目标蓝牙地址的设备,连接A2DP+HFP

3. 项目难点

此项目的需求的定制化程度很高,在ADK4.1的基础上做了很多修改。

3.1. 获取sink电池电量

ADK4.1默认是不能解析电池电量的HFP AT command消息的,需修改source_aghfp_msg_handler.c的代码,方法如下:

/* indication of unrecognised AT command */
case AGHFP_UNRECOGNISED_AT_CMD_IND:
{
    AGHFP_MSG_DEBUG(("AGHFP_UNRECOGNISED_AT_CMD_IND:\n")); 
    len = ((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->size_data;
    c = ((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->data;
#if 0    
    AGHFP_MSG_DEBUG(("unrecognised at cmd size %d:\n", len)); 
    for (i = 0; i < len; i++)
    {
        putchar(*(c+i));  
    }
    printf("\n");
#endif
    
    /* AT+IPHONEACCEV=2,1,8,2,0\r */
    if (len == 25)
    {
        if ((c[0] == 'A') && (c[1] == 'T') && (c[2] == '+') && (c[3] == 'I')
        && (c[4] == 'P') && (c[5] == 'H') && (c[6] == 'O') && (c[7] == 'N')
        && (c[8] == 'E') && (c[9] == 'A') && (c[10] == 'C') && (c[11] == 'C')
        && (c[12] == 'E') && (c[13] == 'V') && (c[14] == '='))
        {
           bluetest_update_device_bat((c[19]-'0'));
           AghfpSendOk(((AGHFP_RESPONSE_HOLD_STATUS_REQUEST_IND_T *)message)->aghfp);
        }
        else
        {
            AghfpSendError(((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->aghfp);                        
        }
    }
    else
    {
        AghfpSendError(((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->aghfp);                        
    }
}
return;

3.2. AGHFP模式使能AUX in/out

参考CSR8670项目实战:BlueCar蓝牙音频网关

3.3. 获取sink设备的RSSI值和名称

ADK4.1的source工程在默认状态下没有使能inquiry_eir_mode,不能在搜索状态下获取sink设备的RSSI值和名称。

获取RSSI值的代码修改方式如下:

/* connection_msg_handler in source_connection_msg_handler.c */

if (((CL_INIT_CFM_T *)message)->version == bluetooth2_1)
{
    /* EIR inquiry mode */
    ConnectionWriteInquiryMode(&theSource->connectionTask, inquiry_mode_eir);
}
else
{
    /* EIR inquiry mode */
    ConnectionWriteInquiryMode(&theSource->connectionTask, inquiry_mode_eir);
}

获取设备名称的代码修改方式:

/* inquiry_parse_eir_data in source_inquiry.c */

else if ((*(p+1) == EIR_TYPE_REMOTE_NAME_SHORTENED) || (*(p+1) == EIR_TYPE_REMOTE_NAME_COMPLETE))
{
    result.device_name_size = *p;
    INQUIRY_DEBUG(("device_name_size: %d\n", result.device_name_size));
    if (result.device_name_size > (REMOTE_DEVICE_NAME_MAX_SIZE-1))
    {
        result.device_name_size = REMOTE_DEVICE_NAME_MAX_SIZE-1;
    }
    memcpy(result.device_name_buf, (const uint8 *)(p+2), result.device_name_size);
    result.device_name_buf[result.device_name_size] = '\0';
    bluetest_update_device_name(result.device_name_buf, (result.device_name_size+1));
    INQUIRY_DEBUG(("device_name: %s\n", result.device_name_buf));
}

4. 总结

通过此项目对source模式的深度定制开发,发现CSR的ADK有很强的可塑性和灵活性,并且隐藏着惊人的潜能。

在BluePager的基础上,可以进一步拓展功能。如支持更多输入源(USB, SPDIF等)、一拖二寻呼等。


来源:https://blog.csdn.net/wzz4420381/article/details/81587600
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

路过

雷人

握手

鲜花

鸡蛋

相关阅读

发表评论

最新评论

引用 Eric9527 2021-4-6 00:36
现在搞定没有

查看全部评论(1)

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-25 16:20 , Processed in 0.123165 second(s), 33 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部