C#搭配语音调制解调器执行AT命令时如何检测对方接听通话
针对调制解调器被叫接听检测问题的解决方案
一、AT命令优化方案(优先使用,性能最优)
你当前的AT流程缺失呼叫进程上报的配置,导致无法拿到接听状态码,按照以下步骤调整即可:
- 拨号前先执行
at+vcid=1开启呼叫进程提示,部分DELL USB调制解调器还需要补充执行at+vls=1开启语音线路状态上报 - 拨号
atd[目标号码]后不要立刻发送at+vtx,先持续监听串口返回的状态:- 收到
r代表仍在振铃,继续等待 - 收到
CONNECT/vCON/a字符代表被叫已经接听,此时再执行at+vtx进入语音发送模式即可 - 收到
b代表拒接或接听后挂断,直接终止流程即可
- 收到
注:不同批次的DELL调制解调器可能存在状态码差异,你可以先手动触发接听场景,监听串口在接听瞬间返回的原始数据,记录专属的状态特征码,判断准确率更高。
二、音频字节流分析方案(兜底方案,补充提问解答)
可以通过分析串口返回的音频字节数组区分回铃音和人声,以此判断接听状态,具体判断逻辑:
- 回铃音是运营商预设的固定规则音频:通常为450Hz频率,响1秒、停4秒的周期性规律波形,你可以对拿到的音频字节做快速傅里叶变换(FFT)计算频率特征,连续3秒检测到该固定特征即可判定为仍在振铃
- 人声的频率范围为300Hz~3400Hz,且是不规则的动态波形,不会出现固定频率周期性重复的特征,当检测到连续2秒以上不符合回铃音特征的音频时,即可判定对方已经接听
- 该方案可以作为AT状态码判断的兜底,避免部分场景下状态码上报异常导致判断失败
修正后的完整AT操作流程
ate0 // 关闭回显 at+fclass=8 // 切换到语音模式 at+vsm=4 // 选择WAV语音压缩格式 at+vcid=1 // 开启呼叫进程上报 at+vls=1 // 开启语音线路状态上报 atd[你的目标号码] // 发起拨号 // 循环监听串口返回,直到匹配到接听/挂断状态 // 确认被叫接听后执行以下操作 at+vtx // 进入语音发送模式 // 向串口写入WAV格式的语音字节流
内容的提问来源于stack exchange,提问作者abbas-h
相关产品推荐
相关产品推荐

