Hotdry.
systems-engineering

旋转拨号电话转SIP:脉冲检测、铃响与USB音频桥接

将老式旋转拨号脉冲转换为SIP信令,实现铃响检测、拨号音生成及USB音频接入,支持VoIP会议桥接。

旋转拨号电话(rotary handset)曾是模拟电话网(POTS)的标志,其机械拨号盘通过脉冲信号(loop disconnect)发送数字:拨号 “1” 产生 1 个脉冲断开环路,每脉冲间隙约 70ms,总时长视数字而定(“0” 10 脉冲)。现代 VoIP 依赖 SIP 协议与 DTMF(双音多频)信令,将其桥接需硬件脉冲检测、软件转换及音频集成。本文聚焦单一技术点:用 RP2040 微控制器实现脉冲→SIP 桥接,集成 USB 音频用于会议通话,提供可落地参数、阈值与监控清单。

脉冲检测电路与参数调优

核心是检测拨号盘复位时开关的开 / 断循环。Stavros.io 项目中,用 RP2040 GPIO 监测钩子开关(hook switch)与拨号脉冲引脚。硬件:光耦隔离器(opto-isolator,如 PC817)连接电话线环路至 GPIO,避免模拟电压干扰 MCU。电路简单:电话 Tip/Ring → 光耦输入 → GPIO 拉高 / 低。

软件阈值:

  • 脉冲宽度阈值:40-100ms(标准 pulse break 40ms,inter-digit 600ms)。代码用边沿检测(edge detection):HIGH→LOW 计数脉冲,延时 500ms 确认数字结束。 示例伪码(Pico SDK):
    volatile int pulses = 0;
    bool last_state = true;
    void pulse_isr() {
      bool state = gpio_get(PULSE_PIN);
      if (state && !last_state) pulses++;
      last_state = state;
      if (debounce_timer > 500ms) { sip_digit = pulses; pulses=0; }
    }
    
  • 防抖阈值:10ms(机械抖动),用硬件 RC 滤波(1kΩ+100nF)或软件延时。
  • 数字范围:1-10 脉冲(0=10),超时 3s 重置输入。

风险:脉冲漂移(老电话机械磨损),监控 GPIO 日志,阈值自适应(均值滤波,±20% 浮动)。

SIP 信令转换与 UA 集成

脉冲转 DTMF:用 PJSUA 库(轻量 SIP 栈)在 ESP32/RP2040 上运行 SIP UA。检测数字后,发送 SIP INVITE,DTMF via RFC2833(inband RTP)。

  • 注册参数:SIP 服务器(如 Asterisk/FreeSWITCH),账号1001@192.168.1.100:5060,auth secret。超时重试 3 次,keep-alive 30s。
  • 拨号流程
    1. 摘机(hook off):GPIO 低→检测忙音 / 拨号音(FFT 分析 8kHz 采样,阈值 - 30dBm)。
    2. 累积 10 位数字→SIP INVITE sip:目标@server
    3. 环路闭合(RTP 流)→桥接 USB 音频。
  • 铃响检测:FXS 模拟,环压 75-90Vrms 16-25Hz。用 ADC 监测阈值 > 50V,生成本地铃声(440Hz+480Hz 复合波,PWM 输出)。

落地清单:

组件 参数 供应商 / 阈值
MCU RP2040 Pico 48MHz, USB HID
音频 USB 音卡(CM108) 16kHz/16bit, 增益 + 6dB
SIP 栈 PJSIP 2.14 G.711u, jitter 20ms
电源 5V/1A USB 低功耗 < 500mA

USB 音频集成与会议桥接

VoIP 会议需麦克 / 扬声器。Stavros 方案:黑市 $2 USB 音卡(脱壳焊针)直连手柄,USB 集线器合 RP2040 HID(键盘模拟挂机 Ctrl+W)。会议软(如 Zoom/Teams)选 “Rotary Audio” 输入 / 输出。

参数:

  • 采样率:8kHz(G.711 兼容),缓冲 50ms 防丢包。
  • 回声消除:AEC 阈值 - 40dB,尾长 128ms(speex 库)。
  • 音量:麦克 + 12dB,手柄扬声器 - 3dB(防反馈)。

挂机:钩子 GPIO→HID 发送 ESC / 挂断键序列(Zoom: Ctrl+Shift+E)。拨号盘额外:数字键输入 SIP URI。

监控要点:

  1. 日志:脉冲计数、SIP 状态(200 OK/486 Busy)。
  2. 告警:脉冲 > 12(故障)→蜂鸣 + LED。
  3. 回滚:EEPROM 存阈值,OTA 更新固件。

测试:本地 Asterisk(extensions.conf: exten=>100,1,Dial(PJSIP/rotary)),会议桥接 Jitsi(WebRTC→SIP)。总成本 < 50 元,体积手柄内。

实际部署:会议室桥接,摘机接 SIP 分机,拨脉冲呼转。优于市售 ATA(如 Grandstream HT701,需脉冲转 DTMF 适配器 $20 额外):纯软件,USB 即插即用。

资料来源:

查看归档