sexta-feira, março 13, 2009

Conectando via Bluetooth DUN no Linux

Assim como no caso das placas wireless, o suporte a modems 3G e a conexões via Bluetooth tem evoluído rapidamente, muito diferente do que tínhamos na época dos modems discados. Desde que você use uma distribuição atual, praticamente todos os dispositivos são suportados e a configuração é relativamente simples. As versões recentes do NetworkManager, por exemplo, já oferecem suporte nativo a conexões móveis, através da aba "Banda larga móvel":

index_html_603625b4

Entretanto, o NetworkManager é ainda um trabalho em desenvolvimento. No Ubuntu 8.10, por exemplo, ele é capaz de configurar conexões para modems USB, mas não para smartphones conectados via Bluetooth. Vamos então aos passos manuais, que você pode usar em qualquer distribuição.

O primeiro passo é descobrir qual é o endereço do transmissor Bluetooth do smartphone, usando o comando "hcitool scan":

$ hcitool scan

Scanning ...
00:21:FE:CF:A2:E1 E71

Nos aparelhos baseados no S60, você pode também ver o endereço digitando o código *#2820# na tela inicial.

Precisamos descobrir também qual é o canal usado pelo smartphone para o acesso ao DUN. Para isso, usamos o comando "sdptool search DUN":

$ sdptool search DUN

Inquiring ...
Searching for DUN on 00:1B:AF:E4:AA:5B ...
Service Name: Dial-Up Networking
Service RecHandle: 0x10003
Service Class ID List:
"Dialup Networking" (0x1103)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 2

Language Base Attr List:
code_ISO639: 0x454e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Dialup Networking" (0x1103)
Version: 0x0100

Como pode ver, ele devolve uma grande quantidade de informações, mas o que nos interessa é a linha "Channel", que no meu caso é 2. O canal 2 é usado pela maioria dos aparelhos da Nokia, enquanto aparelhos de outros fabricantes usam normalmente o canal 1. De qualquer forma, não custa verificar.

O passo seguinte é ativar o rfcomm, que cria um link serial entre o desktop e o smartphone, permitindo o uso do DUN. Para isso, edite o arquivo "/etc/bluetooth/rfcomm.conf", deixando-o com o seguinte conteúdo:

rfcomm0 {
bind yes;
device 00:21:FE:CF:A2:E1;
channel 2;
comment "E71";
}

Note que o "00:21:FE:CF:A2:E1" e o "E71" correspondem ao ID e ao nome do aparelho, que você obtém ao rodar o comando "hcitool scan". É importante indicar corretamente o canal, já que sem ele o PC não consegue se conectar ao smartphone.

Continuando, dê uma olhada também no arquivo "/etc/bluetooth/hcid.conf", onde vão as configurações gerais do Bluetooth. Este é um exemplo de arquivo de configuração, que você pode usar como modelo:

options {
autoinit yes;
security auto;
pairing multi;
passkey "1234";
}

device {
name "PC";
class 0x3e0100;
iscan enable; pscan enable;
lm accept;
lp rswitch,hold,sniff,park;
}

As opções importantes aqui são as linhas "passkey" e "name". As demais já vêm configuradas por padrão, permitindo a conexão de qualquer dispositivo.

A opção "name" determina o nome com o qual seu PC aparecerá na piconet (a rede Bluetooth). A passkey (também chamada de PIN) é um código de segurança, que você precisa fornecer na hora de conectar seu celular ou qualquer outro dispositivo ao seu PC. A passkey default é "1234" (depois de testar, não deixe de mudar para algo mais seguro).

Depois de terminar, reinicie o serviço do Bluetooth para que a configuração entre em vigor:

# /etc/init.d/bluetooth restart

Nesse ponto, o comando "rfcomm" deve mostrar algo como:

# rfcomm

rfcomm0: 00:21:FE:CF:A2:E1 channel 2 clean

Isso indica que o link entre o PC e o celular foi criado com sucesso. Verifique também se o arquivo "/dev/rfcomm0" foi criado. Em alguns casos, pode ser necessário desligar e ligar o smartphone para que ele seja criado corretamente.

O próximo passo é (se já não fez anteriormente) ativar o pareamento entre o PC e o smartphone. A principal dica é que você deve definir seu notebook como dispositivo autorizado dentro da configuração do Bluetooth (que nos Nokia vai no "Configurações > Conectiv. > Bluetooth") depois de fazer a conexão inicial, de forma que você possa ativar a conexão quando quiser, sem precisar ficar respondendo a perguntas adicionais:

index_html_564ec3b7

Nesse ponto, o suporte a Bluetooth já está configurado e testado, falta apenas estabelecer a conexão usando o kppp, gnome-ppp ou outro discador.

A forma mais rápida de configurar a conexão é usar o wvdial, que é um discador de modo texto, onde você pode simplesmente colocar as configurações de discagem dentro de um arquivo de configuração e chamá-lo sempre que quiser ativar a conexão. Você pode instalá-lo usando o gerenciador de pacotes, como em:

# apt-get install wvdial

ou:

# urpmi wvdial

Para usá-lo, edite o arquivo "/etc/wvdial.conf", seguindo este modelo:

# Modelo do /etc/wvdial.conf para conexões via DUN:

[Dialer 3g]
Modem = /dev/rfcomm0
Baud = 921600
DialCommand = ATDT
FlowControl = Hardware(CRTSCTS)
Username = vivo
Password = vivo
Phone = *99#
Check Def Route = on
Stupid mode = 1
Auto Reconnect = on
Auto DNS = on
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init5 = AT+CGDCONT=1,"IP","zap.vivo.com.br","",0,0
ISDN = 0
Modem Type = Analog Modem

As linhas "Modem", "Username", "Password" e "Phone" especificam a porta e as configurações da operadora, enquanto as linhas "Init1", "Init2" e "Init5" especificam as strings de discagem. Estas do exemplo são as strings para conexões via Bluetooth, mas outros tipos de conexões podem utilizar strings diferentes. Veja que a antepenúltima linha especifica a APN da operadora; não se esqueça de alterá-la caso necessário.

Depois de salva a configuração, você precisa apenas usar o comando "wvdial 3g" (como root) quando quiser conectar:

# wvdial 3g

--> WvDial: Internet dialer version 1.56
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1,"IP","zap.vivo.com.br","",0,0
AT+CGDCONT=1,"IP","zap.vivo.com.br","",0,0
OK
--> Modem initialized.
--> Sending: ATDT*99#
--> Waiting for carrier.
ATDT*99#
CONNECT

Como pode ver, o wvdial mostra todos os detalhes da conexão, o que acaba sendo útil para solucionar problemas inesperados (já que você pode ver as mensagens de erro e pesquisar sobre elas). Para encerrar a conexão, pressione Ctrl+C (apenas uma vez) e deixe que ele faça o processo normal de desconexão e restaure a rota padrão. Caso esteja curioso, o "3g" no comando para conectar especifica o nome da conexão, que é definido na linha "[Dialer 3g]".

Se algo der errado durante a discagem (mesmo que a configuração esteja correta), experimente reiniciar o smartphone e tentar de novo. Nos aparelhos da Nokia, é muito comum que o subsistema Bluetooth fique travado, impedindo que você se conecte, o que é rapidamente resolvido ao desligar e ligar o aparelho.

Muitas distribuições antigas (anteriores a 2008) usam uma versão bugada do wvdial, que não altera a rota padrão depois de conectado. Isso faz com que o sistema continue tentando acessar através da placa de rede (ou outra conexão já existente) em vez de acessar usando a conexão 3G, o que causa o famoso "conecta mas não navega". Nesses casos, é necessário rodar o comando "route del default" antes de estabelecer a conexão, como em:
# route del default
# wvdial 3g

Para reconectar à rede local depois de fechar a conexão (se for o caso), use:

# /etc/init.d/networking restart

ou:

# /etc/init.d/NetworkManager restart

(no Ubuntu ou outras distribuição que usam o NetworkManager)

Algumas operadoras, com destaque para a Claro e a Embratel (com o Giro), têm implementado um sistema de timeout, que faz com que as conexões sejam encerradas depois de alguns segundos de inatividade e restabelecidas automaticamente assim que é necessário transmitir dados. O problema é que, em áreas com muitos assinantes, o processo pode demorar alguns segundos, ou mesmo travar a conexão completamente, te obrigando a desconectar e reconectar novamente.

Uma solução simples para isso, no Linux, é usar o ping para enviar um pacote de dados a cada dois segundos, evitando que a conexão seja encerrada. Basta abrir um terminal e deixar o comando correndo enquanto estiver conectado:

$ ping -i 2 google.com

Se estiver preocupado com a segurança, você pode ativar um firewall simples para bloquear tentativas de conexão vindas da Internet adicionando os comandos:
iptables -A INPUT -p tcp -i ppp0 --syn -j DROP
iptables -A INPUT -p udp -i ppp0 --dport 1:1024 -j DROP

... no final do arquivo "/etc/ppp/ip-up.local".

Se quiser compartilhar a conexão com outros micros ligados em rede com o primeiro (você pode criar uma rede ad-hoc, usando a placa wireless, e assim compartilhar a conexão rapidamente com os amigos, por exemplo), adicione as três linhas abaixo no mesmo arquivo:

modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

O arquivo "/etc/ppp/ip-up.local" é executado automaticamente pelo sistema quando a conexão é ativada. Dessa forma, ao colocar os comandos no final do arquivo, o firewall e/ou o compartilhamento passa a ser ativado automaticamente sempre que você ativa a conexão. Você pode também executá-los de forma avulsa diretamente no terminal.

Se, por acaso, você tiver problemas de estabilidade, com a conexão caindo a cada dois minutos, abra o arquivo "/etc/ppp/options" e comente (ou remova) as linhas:

lcp-echo-interval 30
lcp-echo-failure 4

O "lcp-echo" é um pacote de controle, usado para verificar se a conexão ainda está ativa. Quando o servidor do provedor de acesso deixa de responder, o discador presume que a conexão foi perdida e desconecta automaticamente. O problema é que estes pacotes não são suportados em muitos aparelhos (como no Treo 650), fazendo com que a conexão sempre caia depois de dois minutos.

Nenhum comentário:

Postar um comentário