De mudança para o Rio de Janeiro, procurando garantir que eu tenha Internet sempre, contratei da Vivo (eu gosto de mudar de operadora, porque acho todas ruins) um plano 3G ilimitado. O serviço, devo dizer, me deixou satisfeito até agora. A banda é razoável, a latência é ruim, mas é suficiente pra eu trabalhar com ssh em hosts remotos, ler email via IMAP, usar IRC e jabber tranquilamente.
O modem que eu comprei foi um AIKO 83D, porque na caixinha tem escrito que ele suporta ‘Linux’. O mais engraçado foi que a atendente primeiro me disse que não tinha como funcionar, aí eu falei que no site da Vivo diz que tem um modem que funciona hah.
Antes de falar o que eu fiz, vejamos o que o manual diz. Ele diz que eu preciso entrar no site nacional da Aiko e baixar o ‘driver’ para Linux. De fato lá estava o driver para ‘Linux’, ou melhor, para ‘Ubuntu’. Eu sou um pessimista quando se trata de empresas falando de ‘driver’ ou ‘discador’; normalmente eu espero que seja algo mal-feito, mal-acabado, e algumas vezes destrutivo. A Aiko não me decepcionou =(.
Dá uma olhada no conteúdo dos ‘drivers’:
kov@abacate /tmp> tar ztpf BVIVO_PC_LinuxUI1.0.0B01_tmp081023.tar.gz
LinuxUI/install.sh
LinuxUI/MCManager.tar.gz
kov@abacate /tmp> tar ztpf Ubuntu.tar.gz
Ubuntu/
Ubuntu/libaudio2_1.9.1-1_i386.deb
Ubuntu/libqt3-mt_3.3.8-b-0ubuntu3_i386.deb
Não é engraçado que você tenha que instalar esses debs? Aí tem o tal do MCManager, que parece mais interessante. Ele tem um driver pro Linux, que você tem que compilar, e uma tonelada de arquivos com propósitos cada um mais interessante que o outro. O manual de instalação para ‘Ubuntu’ é bem divertido. Olha esse ponto:
7- Conecte o Modem ao discador e espere. Pode ser que a gaveta do CDROM se abra, feche-a.
Haha. Não, sério. É preciso muito esforço pra ser tão amador =D. Quando é que as empresas vão começar a fazer as coisas direito, contribuir os drivers ou definições certas pra Linux/hal/udev fazerem todo o trabalho certinho? Repitam depois de mim: um discador tosco, feito em qt3 não é substituto para o Network Manager ou o que quer que a minha distribuição use para se conectar à Internet.
Como eu faço questão de o meu sistema ficar limpo, não segui as instruções. Achei em buscas na Internet várias soluções, especialmente de usuários de Ubuntu, para fazer o modem funcionar, e aqui está o que eu fiz. O modem Aiko 83D é um daqueles dispositivos USB que são 2 em 1. O padrão é ele ser um “CD-ROM” virtual, que contém os ‘drivers’ pra Windows. Para que ele se torne modem, é preciso fazer um ‘mode switch’. Eu instalei, portanto, o pacote usb-modeswitch e coloquei a seguinte configuração para o udev:
kov@abacate ~> cat /etc/udev/rules.d/00_aiko-modem.rules
ACTION!="add", GOTO="ZTE_End"
SUBSYSTEM=="usb", ATTRS{idProduct}=="2000",
ATTRS{idVendor}=="19d2"
RUN+="/usr/sbin/usb_modeswitch -v 0x19d2 -p 0x2000 -V 0x19d2 -P 0x0057 -m 0x01 -M 55534243123456782000000080000c85010101180101010101000000000001"
GOTO="ZTE_End"
SUBSYSTEM=="usb", ATTRS{idProduct}=="0057",
ATTRS{idVendor}=="19d2"
RUN="modprobe usbserial vendor=0x19d2 product=0x0057"
MODE="660", GROUP="dialout"
LABEL="ZTE_End"
O que essa coisinha linda faz? Quando ele detecta o dispositivo com id de vendor 19d2 e id de produto 2000, ele roda o usb_modeswitch com aquela linha de comando mágica que eu achei por aí, pra mudar a configuração desse modem. O engraçado é que a Aiko teve a manha de fazer a cagada bem cagadinha, e o product id 2000 é usado para uma enorme quantidade de modems diferentes, que exigem mágicas diferentes. Chique demais =). De qualquer forma, depois de o modo ter sido trocado, é como se o dispositivo com id de produto 2000 fosse desconectado, e um novo dispositivo, com id de produto 0057 fosse conectado. A regra do udev faz, então, que o driver de serial da USB seja carregado com as opções necessárias e deixa as permissões arrumadas.
Depois de configurar isso aí, você já pode colocar o modem e se você for sortudo como eu, até aqui já resolvemos metade do problema. Agora o modem já vira modem, e já vai ficar com a luzinha verdinha, que significa que ele conectou na rede de celular. Agora precisamos fazer o Network Manager querer usar o bichinho. O network manager confia no udev pra dizer pra ele que dispositivos seriais têm capacidade de agir como modem GSM. Temos que ensinar pro udev, então, que esse aqui faz. Na verdade a gente só precisa convencer o udev a verificar se ele tem as capacidades!
O udev usa um arquivo de “configuração”, chamado /lib/udev/rules.d/77-nm-probe-modem-capabilities.rules. Eis o conteúdo do meu, agora:
kov@abacate ~> cat /lib/udev/rules.d/77-nm-probe-modem-capabilities.rules
# do not edit this file, it will be overwritten on update
ACTION!="add|change", GOTO="nm_modem_probe_end"
SUBSYSTEM!="tty", GOTO="nm_modem_probe_end"
DRIVERS=="serial_cs|nozomi", IMPORT{program}="nm-modem-probe --delay 3000 --export $tempnode", GOTO="nm_modem_probe_end"
# Only probe known mobile broadband drivers
DRIVERS=="option|sierra|hso|cdc_acm|qcserial", GOTO="probe"
KERNEL=="ttyUSB3", GOTO="probe"
GOTO="nm_modem_probe_end"
LABEL="probe"
# Don't probe new-style beagleboard cdc-acm ports
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0525", GOTO="nm_modem_probe_end"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", DRIVERS=="?*", ENV{NM_MODEM_DRIVER}="$attr{driver}"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="?*", ENV{NM_MODEM_USB_INTERFACE_NUMBER}="$attr{bInterfaceNumber}"
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="?*", ATTRS{idProduct}=="?*", IMPORT{program}="nm-modem-probe --vid 0x$attr{idVendor} --pid 0x$attr{idProduct} --usb-interface $env{NM_MODEM_USB_INTERFACE_NUMBER} --driver $env{NM_MODEM_DRIVER} --delay 3000 --export $tempnode", GOTO="nm_modem_probe_end"
LABEL="nm_modem_probe_end"
Eu editei ele pra basicamente scanear o dispositivo ttyUSB3. Isso porque nenhum daqueles drivers é carregado para o modem. Alguns upgrades de kernel atrás, o dispositivo que servia como modem GSM era o ttyUSB2, e por algum motivo apareceu esse ttyUSB3 de uns tempos pra cá. Vai entender. Note que a primeira linha do arquivo é bem direta: não edite esse arquivo. Enquanto não houver uma forma sã de tratar todos esses modems de alguma forma genérica não vejo outro jeito, no entanto… talvez funcione se você copiar esse aquivo pra /etc/udev/rules.d e editar o de lá, mas eu não quis saber, e brutalizei =P. Você pode convencer o dpkg a não substituir esse arquivo nos upgrades rodando o seguinte comando:
# dpkg-divert --local --rename --divert /root/77-nm-probe-modem-capabilities.rules /lib/udev/rules.d/77-nm-probe-modem-capabilities.rules
Tosco. O que isso faz é mover o arquivo para /root, e os upgrades que vierem instalarão o arquivo novo no /root. Aí você pode copiar o arquivo de volta e editar que o dpkg não vai mais encostar nele. Não usem dpkg-divert indiscriminadamente =P!
Então, depois disso configurado assim, o network manager ficou feliz da vida, viu o modem e bastou adicionar uma conexão GSM com o telefone *99#, usuário e senha vivo, que tudo funcionou bonitinho.
Simples e (quase)bonito. Agora bem que a Aiko podia fazer o trabalho direito e ajudar a colocar configurações sãs no Linux/udev pra isso funcionar sem a gente ter trabalho. Que tal?