问题描述
每到招生季,总是需要大量地给考生打电话,提醒报名、核对信息和确认志愿云云,而且须要使用办公室的固定电话,对于每一位考生:
看一眼电脑上的信息表,背下电话号码
拿起话筒,拨号,嘀嘀嘀嘀嘀嘀嘀嘀嘀嘀嘀,按下11位号码
等待接通(或者时常出现拨错,重新开始,法克。。。绝赞招生中
挂断话筒,回第一步
一天下来手都麻了,打算想个办法,于是有了本文。
解决方案
让电脑拨打电话,一共分成两步:
- 把电脑和电话连接起来
- 在电脑上写程序自动拨号(人生苦短,我选Python!)
电脑连接电话
我的电话机背后有两个接口,都是RJ11,一个是“Line”连接外线,另一个是“Phone”,连接分机。我的方案是把电脑当作分机,从这台“分机”上拨号,再用电话机的话筒进行实际的通话。
现在的电脑都没有RJ11接口,这里需要安装一个Modem(俗称“猫”),一头用USB插上电脑,另一头的RJ11插上电话线,线的另一头接电话机的“Phone”口。注意,我们需要的不是ADSL上网猫,因为这里是需要通话和拨号,所以应该选择56K猫,有的店家会叫它传真猫。这里附上我买的型号,二手,95¥。
Windows 11 依然保留了历史悠久的驱动文件modem.sys
,因此可以插上即用,方便免驱。如下图所示:
写程序自动拨号
Modem 在编程接口上属于串口设备,在写程序前,需要先确定设备路径。
首先打开设备管理器,找到“调制解调器”设备;
之后打开“属性”,切到“调制解调器”页,记下“端口”;
最后请 ChatGPT 简单写一段代码,安装一下依赖pip install pyserial
即可。
import serial
import time
# Replace with the actual COM port (e.g., "COM3" on Windows or "/dev/ttyUSB0" on Linux/macOS)
MODEM_PORT = 'COM4'
BAUD_RATE = 9600 # Most modems use a baud rate of 9600
def dial_number(phone_number):
try:
# Open a serial connection to the modem
modem = serial.Serial(MODEM_PORT, BAUD_RATE, timeout=1)
# Wait for the modem to initialize
time.sleep(2)
# Send the AT command to dial the number
modem.write(f'ATD{phone_number};\r'.encode())
# Wait a moment to let the modem process the command
time.sleep(5)
# Check for a response from the modem (Optional: use if you need to read responses)
response = modem.read(100).decode()
print("Modem response:", response)
# Close the connection
modem.close()
except serial.SerialException as e:
print(f"Failed to connect to modem: {e}")
# Replace with the phone number you want to dial
phone_number = "01234567890"
dial_number(phone_number)
之后就是一些无聊的UI工作,接入数据表格,设计交互等等。
落地效果
偷懒,GUI就免了,使用CLI交互吧!
摘下话筒
呼叫前显示出考生姓名,按下 Enter 呼出对应的号码
等待接通绝赞招生中
挂断话筒,回第一步
这样一来,我的手指就轻松多了。
一些后话
作为95后,电话网络对现在的我来说,已经属于神秘的古代技术。现在,通话网络都在升级:GSM被VoLTE代替,就连家里所谓的“固话”也已经是从光猫接出来的了,我丝毫不会怀疑,模拟电话网络已经,或者在不远的将来就会,被数字化的方式取代,后者会更方便我用程序来操作。
至于电脑进行固话拨号的事情,我想这个问题肯定有不少在售的产品能搞定,但是在2024年的今天,顺手解决这样一个古老的问题,莫名地很有成就感,哈哈!