~ Caller ID with Linux and Huawei e220
» By Joren on Sunday 11 April 2010This is the scenario: you have a Huawei e220, a linux computer and you want to react to a call from a set of predefined numbers. E.g. ordering a pizza when you receive a call from a certain number.
The Huawei e220 supports a subset of the AT commands, which subset is an enterprise secret of te Huawei company. So there is no documentation available for the device I bought, thanks Huawei. Anyhow when you attach the e220 to a Linux machine you should get two serial ports:
1
2
/dev/ttyUSB0
/dev/ttyUSB1
To connect to the devices you can use a serial client. GNU Screen can be used as a serial client like this: screen /dev/ttyUSB0 115200
. The first device, ttyUSB0
is used to control ttyUSB1
, so to enable caller ID on te Huawei e220 you need to send this message to ttyUSB0
:
1
AT+CLIP=1
To check for calls you should listen to ttyUSB1
. A serial session for ttyUSB1
looks like:
1
2
3
4
5
^BOOT:44594282,0,0,0,6
^RSSI:18
RING
+CLIP: "+33499311152",145,,,,0
^BOOT:44594282,0,0,0,6
The RING
and CLIP
messages are the most interesting. The RING
signifies an incoming call, the CLIP
is the caller ID. The BOOT
and RSSI
are some kind of ping messages. The following Python script demonstrates a complete session that enables caller ID, waits for a phone call and prints the number of the caller.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
import serial, re
command_channel = serial.Serial(
port='/dev/ttyUSB0',
baudrate=115200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
command_channel.open()
#enable caller id
command_channel.write("AT+CLIP=1" + "\r\n")
command_channel.close()
ser = serial.Serial(
port='/dev/ttyUSB1',
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
ser.open()
pattern = re.compile('.*CLIP.*"\+([0-9]+)",.*')
while 1:
buffer = ser.read(ser.inWaiting()).strip()
buffer = buffer.replace("\n","")
match = pattern.match(buffer)
if match:
number = match.group(1)
print number