BAM 3G Digitel en Debian

sábado, agosto 15, 2009

Hoy por fin tuve la oportunidad de jugar con un aparitico USB de Digitel; de esos que llaman Banda Ancha Móvil (un Huawei E160 para ser exáctos) y decidí configurarlo para conectarme desde Debian.

Anteriormente había tenido la oportunidad de configurar unas tarjetas Kiocera y unos CDU-680 de Movilnet, así que imaginé que no debía ser muy diferente, o sea una conexión ppp, unos parámetros de usuario, un número telefónico para marcar, bla, bla, bla y listo! internet parejo.

Sin embargo la cuestión es un tanto diferente respecto a los mencionados arriba, así que me tocó investigar y googlear un buen rato. Todas las soluciones que encontré lo configuraban usando wvdial, pero como soy terco quería hacerlo con ppp así que tuve que leer un poco sobre los chatscripts y hacer unas cuantas pruebas, hasta que dí con ésta solución.

Lo primero es conectar el dispositivo y ejecutar como root el comando dmesg. Deberíamos ver algo como:

USB Serial support registered for GSM modem (1-port)
option 1-5:1.0: GSM modem (1-port) converter detected
usb 1-5: GSM modem (1-port) converter now attached to ttyUSB0
option 1-5:1.1: GSM modem (1-port) converter detected
usb 1-5: GSM modem (1-port) converter now attached to ttyUSB1
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems

Ese mensaje nos indica que el dispositivo fue reconocido correctamente y está bajo el puerto ttyUSB0.

Ahora instalamos el pppconfig:
# aptitude install pppconfig
Posteriormente ejecutamos el pppconfig como root y creamos una conexión nueva. Para ello debemos completar el asistente con los siguientes parámetros:

Nombre del proveedor: conexion (aquí ponemos el nombre que queremos darle a la conexión)
DNS: Dinámico
Método de autenticación: CHAP
Nombre de usuario: digitel
Contraseña: 0000
Método de marcado: Tone
Número a marcar: *99#
Detectar automáticamente el modem: No
Puerto del modem: /dev/ttyUSB0

Guardamos y salimos del asistente.

Ahora la parte divertida (y la que me tomó tiempo en descifrar) es configurar el script de chat de la conexión que acabamos de crear para que funcione correctamente. Lo que tenemos que hacer es abrir (como root) el archivo /etc/chatscripts/conexion con nuestro editor favorito y en la sección # modem init colocar esto:

'' ATZ
'' ATZ+CPIN="0000"
OK 'ATQ0 V1 E1 +FCLASS=0'
OK 'AT+CGDCONT=1,"IP","gprsweb.digitel.ve"'

Un chatscript es una secuencia de pares "cadena esperada" "cadena enviada", es decir, siempre esperas algo antes de enviar algo.

Si queremos enviar algo sin esperar nada debemos usar una cadena vacía al inicio (indicada por '') y de la misma manera si queremos esperar algo sin enviar nada. Es necesario saber que si queremos esperar/enviar una cadena conformada por varias palabras, debemos encerrarla entre comillas para que sea una sola entidad para el script.

Dicho esto, procedo a explicar el script de chat que he creado para la conexión digitel. Primero inicializamos el modem. Observen que no esperamos nada del modem y enviamos la cadena ATZ:

'' ATZ
Luego enviamos el PIN de la SIM Card (si lo han conectado desde Windows se habrán dado cuenta que el software que trae el dispositivo pide el código PIN al momento de iniciar la conexión):

'' ATZ+CPIN="0000"
Ahora enviamos una trama de autenticación (aún no tengo muy clara su función) esperando un OK de la fase anterior pero entre comillas porque tiene varias palabras:

OK 'ATQ0 V1 E1 +FCLASS=0'
Y por último enviamos la información del servidor DNS:

OK 'AT+CGDCONT=1,"IP","gprsweb.digitel.ve"'
y voilá! El archivo /etc/chatscripts/conexion debería quedar algo así:

# This chatfile was generated by pppconfig 2.3.18.
# Please do not delete any of the comments. Pppconfig needs them.
#
# ispauth CHAP
# abortstring
ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TO$
# modeminit
'' ATZ
'' ATZ+CPIN="0000"
OK 'ATQ0 V1 E1 +FCLASS=0'
OK 'AT+CGDCONT=1,"IP","gprsweb.digitel.ve"'
# ispnumber
OK-AT-OK "ATDT*99#"
# ispconnect
CONNECT \d\c
# prelogin

# ispname
# isppassword

Ahora vamos a probar la conexión. En un terminal ejecutaremos el siguiente comando para monitorear el progreso de la conexión:

# tail -f /var/log/messages
y en otro terminal escribiremos:

# pon conexion
El script se ejecutará, enviará las tramas que hemos especificado en la inicialización del modem y marcará el número que indicamos en la configuración de la conexión ppp para luego asignarnos una IP. Si vemos en el log la palabra Failed o Exit es porque la conexión no se realizó con éxito y debemos ejecutar nuevamente el comando pon conexion como root. El terminal ejecutando el tail de /var/log/messages mostrará el progreso de la conexión, algo como:

Aug 15 21:04:33 belzebu pppd[3615]: pppd 2.4.4 started by root, uid 0
Aug 15 21:04:34 belzebu chat[3617]: abort on (BUSY)
Aug 15 21:04:34 belzebu chat[3617]: abort on (NO CARRIER)
Aug 15 21:04:34 belzebu chat[3617]: abort on (VOICE)
Aug 15 21:04:34 belzebu chat[3617]: abort on (NO DIALTONE)
Aug 15 21:04:34 belzebu chat[3617]: abort on (NO DIAL TONE)
Aug 15 21:04:34 belzebu chat[3617]: abort on (NO ANSWER)
Aug 15 21:04:34 belzebu chat[3617]: abort on (DELAYED)
Aug 15 21:04:34 belzebu chat[3617]: send (ATZ^M)
Aug 15 21:04:34 belzebu chat[3617]: send (ATZ+CPIN="0000"^M)
Aug 15 21:04:34 belzebu chat[3617]: expect (OK)
Aug 15 21:04:34 belzebu chat[3617]: ATZ^M^M
Aug 15 21:04:34 belzebu chat[3617]: OK
Aug 15 21:04:34 belzebu chat[3617]: -- got it
Aug 15 21:04:34 belzebu chat[3617]: send (ATQ0 V1 E1 +FCLASS=0^M)
Aug 15 21:04:34 belzebu chat[3617]: expect (OK)
Aug 15 21:04:34 belzebu chat[3617]: ^M
Aug 15 21:04:34 belzebu chat[3617]: ATZ+CPIN="0000"^M^M
Aug 15 21:04:34 belzebu chat[3617]: ERROR^M
Aug 15 21:04:34 belzebu chat[3617]: ATQ0 V1 E1 +FCLASS=0^M^M
Aug 15 21:04:34 belzebu chat[3617]: OK
Aug 15 21:04:34 belzebu chat[3617]: -- got it
Aug 15 21:04:34 belzebu chat[3617]: send (AT+CGDCONT=1,"IP","gprsweb.digitel.ve"^M)
Aug 15 21:04:35 belzebu chat[3617]: expect (OK)
Aug 15 21:04:35 belzebu chat[3617]: ^M
Aug 15 21:04:35 belzebu chat[3617]: AT+CGDCONT=1,"IP","gprsweb.digitel.ve"^M^M
Aug 15 21:04:35 belzebu chat[3617]: OK
Aug 15 21:04:35 belzebu chat[3617]: -- got it
Aug 15 21:04:35 belzebu chat[3617]: send (ATDT*99#^M)
Aug 15 21:04:35 belzebu chat[3617]: expect (CONNECT)
Aug 15 21:04:35 belzebu chat[3617]: ^M
Aug 15 21:04:35 belzebu chat[3617]: ATDT*99#^M^M
Aug 15 21:04:35 belzebu chat[3617]: CONNECT
Aug 15 21:04:35 belzebu chat[3617]: -- got it
Aug 15 21:04:35 belzebu chat[3617]: send (\d)
Aug 15 21:04:36 belzebu pppd[3615]: Serial connection established.
Aug 15 21:04:36 belzebu pppd[3615]: Using interface ppp0
Aug 15 21:04:36 belzebu pppd[3615]: Connect: ppp0 <--> /dev/ttyUSB0
Aug 15 21:04:37 belzebu pppd[3615]: CHAP authentication succeeded
Aug 15 21:04:37 belzebu pppd[3615]: CHAP authentication succeeded
Aug 15 21:04:37 belzebu kernel: [ 1953.295830] PPP BSD Compression module registered
Aug 15 21:04:37 belzebu kernel: [ 1953.314554] PPP Deflate Compression module registered
Aug 15 21:04:39 belzebu pppd[3615]: Could not determine remote IP address: defaulting to 10.64.64.64
Aug 15 21:04:39 belzebu pppd[3615]: local IP address 10.68.174.162
Aug 15 21:04:39 belzebu pppd[3615]: remote IP address 10.64.64.64
Aug 15 21:04:39 belzebu pppd[3615]: primary DNS address 204.59.152.208
Aug 15 21:04:39 belzebu pppd[3615]: secondary DNS address 57.73.127.195

Para finalizar la conexión y retirar el modem basta con ejecutar como root:

# poff conexion
y esperar que se apague el led del aparato.

Es todo, ahí tenemos nuestra flamante conexión de banda ancha desde Debian :) Cualquier otra información útil o sugerencia es bienvenida.

Cambio y fuera