作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
情况:
在基于 GSM 的调制解调器上,您使用 ATDxxxxxxxxx 开始语音通话;
某些调制解调器在远程端应答时发出“CONNECT”,或者其他调制解调器在诊断端口上返回“^CONN: 1, 0”。
但是,如果远程端拒绝调用,则仍会发送此连接反馈。
AT+CPAS 返回 4(调用进行中)。
AT+CIND(如果支持)返回调用正在运行,并且调用没有振铃。
一些调制解调器没有在数据端口上发送数据,但其他有(通常发送静音或提示音)。
很长一段时间后,网络断开调用,调制解调器最后在诊断端口上发出“^CEND”,或在应用程序端口上发出“HANGUP:1”。
我想尽快检测远程端何时拒绝了调用,而不是在网络超时之后。我怎么做 ?
编辑:顺便说一句,我不是在谈论“自动”答录机,而是明确拒绝通话(因此它不会被重定向到答录机)。
此外,我想避免“检测数据端口上的铃声”之类的解决方案,这些解决方案将证明是棘手且需要 CPU 密集型的解决方案。
最佳答案
我回答了我自己的问题,因此它在同一情况下为其他人服务。
检测取决于网络。通常,在法语运营商 Free 中,网络不会在调用拒绝时断开您的连接(而是让您听到铃声)。在德国,确实如此。所以我认为法国网络的行为是错误的,或者至少没有帮助。
GSM/3GPP 标准中没有任何用于检测铃声的特定内容,因此此类网络的唯一方法是以编程方式执行检测。
可以通过检查相似“声音”值之间的时间距离来“简单”地完成。
算法是这样的:
int range = 5, value = 350, periodFound = 0; // Arbitrary
int period[16] = {};
void onDataReceived(int sampleRate, short * data, int len)
{
for (int i = 0; i < len; i++)
{
if (data[i] >= value - range && data[i] <= value + range)
{
period[periodFound++] = i;
}
if (periodFound == 16) break;
}
// Compute distance between periods (if it's the same, it's a ring tone)
float avg = 0, dev = 0;
int prev = period[0];
for (int i = 1; i < periodFound; i++)
{
avg += (period[i] - prev);
prev = period[i];
}
avg /= periodFound-1;
prev = period[0];
for (int i = 1; i < periodFound; i++)
{
dev += (period[i] - prev - avg) * (period[i] - prev - avg);
prev = period[i]
}
// Last test
if (fabs(avg - expectedPeriod) < range && dev < errorAllowed)
printf("Ring tone!");
}
关于gsm - 如何检测远端拒绝使用AT命令的语音调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22961684/
我是一名优秀的程序员,十分优秀!