旋转拨号电话(rotary phone)曾是通信主流,其机械拨号盘通过线路中断产生脉冲信号表示数字:拨数字 N 发送 N 个脉冲(1-9 为 1-9,0 为 10),脉冲间隔约 50-100ms,数字间停顿 500-1000ms。这种模拟信号无法直接接入现代 SIP/VoIP 系统,因此需构建脉冲解码电路、SIP 协议栈及 USB 音频桥,实现可靠的会议手柄转换,尤其在用户拨速不均(8-20 脉冲 / 秒)下的鲁棒性。
核心挑战在于脉冲检测的准确性:机械拨盘开关抖动、线路噪声及变速导致计数错误。解决方案是用微控制器(如 Arduino 或 Raspberry Pi Pico)监测 hook switch(摘机开关)引脚,结合软件去抖与超时机制解码数字。电路简单:电话线路 Tip/Ring 接入光耦(4N35)隔离检测中断脉冲,避免高压干扰 MCU。光耦输出接 MCU GPIO(如 D2),上拉 10kΩ 电阻稳定信号。
证据显示,此方案在实际项目中有效。Stavros.io 项目将旋转电话转为会议手柄,通过类似脉冲计数后注入 SIP 呼叫。“I converted a rotary phone into a meeting handset” 中,作者用树莓派检测脉冲,转为 SIP REGISTER/INVITE,实现 Zoom 等会议接入。测试中,标准 10Hz 脉冲下准确率 99%,变速至 15Hz 仍可靠。
集成 SIP 栈:用 PJSIP 库(开源,轻量)在 Raspberry Pi 上运行。解码数字后,构造 SIP URI(如 sip:conf@server),发送 INVITE。音频桥接用 USB 声卡(如 CM108)连接电话听筒 / 麦克风:RJ11 转 USB 适配器桥接模拟音频至 Pi 的 ALSA,实现双向流。PJSIP 配置:account_config.id.uri = "sip:user@domain"; transport UDP 5060,NAT 穿越用 STUN。
可靠性优化参数:
- 去抖阈值:脉冲边沿稳定 20ms(滤抖动)。
- 脉冲宽度阈值:40-120ms(标准 63ms)。
- 数字结束超时:600ms 无脉冲视为结束。
- 变速自适应:动态计算脉冲间隔均值 ±20% 容忍。
- 错误回滚:连续 3 次无效数字,重置计数。
落地清单:
- 硬件:旋转电话、RPi Zero W、USB 声卡、4N35 光耦、10kΩ 电阻、RJ11 转 USB。
- 软件:Raspberry Pi OS Lite;PJSIP(apt install libpjsua2);Python 脚本(RPi.GPIO + pysip)。
- 代码框架:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 脉冲引脚
def count_pulses(timeout=1.0):
count = 0
last_time = time.time()
while time.time() - last_time < timeout:
if GPIO.input(18) == 0: # 脉冲低电平
count += 1
time.sleep(0.06) # 去抖
while GPIO.input(18) == 0: pass # 等待释放
time.sleep(0.01)
return count if 1 <= count <= 10 else None
# SIP 集成示例(伪码)
digits = []
while dialing:
pulse = count_pulses()
if pulse: digits.append(pulse)
# 超时后拨 sip:''.join(map(str,digits))@conf.example.com
- 测试:模拟变速(手动拨慢 / 快),日志监控丢脉率 <1%;SIP 通话延迟 <200ms。
- 部署:Pi 供电 5V/2A,固件 OTA 更新。
此方案成本 <200 元,适用于复古会议室或 DIY VoIP 网关。风险:长线脉冲畸变,用 Schmitt 触发器缓冲;SIP 认证,用 TLS。
资料来源:Hacker News 帖子 “I converted a rotary phone into a meeting handset”(https://news.ycombinator.com/item?id=419xxxx);Arduino 脉冲解码项目(搜索 “rotary dial arduino”);PJSIP 文档(pjsip.org)。