Prezado(a) leitor(a)!
Organizei mais essa seção para compartilhar informações sobre o projeto OpenWrt.
O OpenWrt é uma distribuição do GNU/Linux, altamente customizável, direcionada a sistemas embarcados (frequentemente roteadores wireless).(Fonte: OpenWrt).
Para dar os primeiros passos consultar o tutorial https://wiki.openwrt.org/doc/playground/newcomer.
E pedir ajuda no Fórum https://forum.openwrt.org.
A primeira notícia que tive sobre este projeto foi através do nosso amigo Nelson Saraiva que utilizou um mini roteador TPLink modelo MR3020 (Figura 2) para fazer uma conexão wifi com uma placa Arduino.
O primeiro passo foi providenciar a compra do roteador no site do BoaDica.
As informações sobre a compatibilidade desse modelo com o OpenWrt estão disponíveis na página https://wiki.openwrt.org/toh/tp-link/tl-mr3020.
A tabela Supported Hardware Versions informa quais versões do firmware são compatíveis com as diferentes versões de hardware. Verifiquei na etiqueta que o roteador (figura 3) era da versão 1.9 e portanto seria compatível com o firmware a partir da versão 12.09 (Attitude Adjustment).
Seguindo a sugestão “Use the latest available release for new deployments unless you know exactly what you do” baixei a última versão (Chaos Calmer 15.05.1) do OpenWrt para o roteador MR3020: openwrt-15.05.1-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin.
Esse download foi feito no dia 04/08/2016, e portanto verifique a versão do firmware compatível com a versão do seu hardware e procurei baixar a última versão.
Baixei também o arquivo md5sum e comparei o md5sum do arquivo .bin com a tabela para verificar a integridade do arquivo e evitar problemas.
Em seguida liguei o roteador, conectei com o PC através do cabo Ethernet, abri o navegador e digitei o endereço 192.168.0.254. Alguns tutoriais recomendam resetar o roteador para restaurar as configurações de fábrica antes de fazer a atualização do firmware.
O login padrão é admin, senha admin, e em seguida selecione a opção System Tools e Firmware Upgrade. Na tela seguinte, selecione o arquivo .bin do firmware e clique em Upgrade.
No meu caso, ele não reconheceu o arquivo e pediu para selecionar novamente o arquivo .bin. Nessa hora me lembrei de ter lido em algum lugar para renomear o arquivo com um nome menor no caso de não ser reconhecido. Apenas troquei o nome para openwrt-15.05.1.bin e pude dar prosseguimento à atualização. Enquanto isso fui fazer um lanche para não ficar ansioso esperando o resultado. :-)
Após a atualização digitei no browser o endereço 192.168.1.1 e pude ver a tela de login (figura 4).
Segundo a seção Log into your Router Running OpenWrt basta clicar em “Login” sem precisar,por enquanto, digitar a senha de root.
É possível visualizar informações do roteador na opção Status -> Overview, mas para definir a senha de root selecionar no menu System -> Administration (figura 5), digitar a senha de root e clicar no botão Save & Apply.
Depois de definir a senha de root segui os tutoriais Nelson Saraiva e Secure and Turn on Wifi para ativar o Wifi e definir a senha para os clientes.
O meu objetivo inicial é configurar o roteador para funcionar como cliente WISP (Wireless Internet Service Provider) conforme a figura 6.
Mas fiquei muito confuso com tantas opções de modo de operação na seção: Network -> Wifi -> Edit -> Interface Configuration -> Mode:
Access Point
Client
Ad-Hoc
802.11s
Pseudo Ad-Hoc (ahdemo)
Monitor
Access Point (WDS)
Client (WDS)
Comecei a encontrar informações mais esclarecedoras de como configurar o roteador para diferentes funções quando passei a pesquisar com as seguintes palavras chaves: “OpenWrt” AND “client”.
Escolhi o vídeo Configurar Router con Firmware OpenWRT en Modo Cliente e consegui, pela primeira vez, fazer o roteador MR3020 com OpenWrt (Cliente) acessar a Internet através do roteador Huawei E156B da Vivo (Master) obtendo a configuração como indicada na figura 7.
Figura 7. Roteador com OpenWrt operando no modo WISP (Fonte: guia de instalação rápida do fabricante TP-Link).
Essa configuração foi obtida com as seguintes etapas:
Abrir o browser, digitar o endereço 192.168.1.1 e logar como root
Network -& Wifi & Scan, para identificar as redes disponíveis
Selecionar a rede para acessar a Internet e clicar em “Join Network”
Digitar a senha para acesso à rede wifi master e clicar em “Submit”
Na tela seguinte (Network -> Wifi -> Edit -> Interface Configuration -> Mode) selecionar o modo “Client” e clicar em “Save & Apply”
No meu caso, o endereço do roteador master era 192.168.1.1, ou seja, o mesmo endereço do roteador OpenWrt e para evitar conflito alteramos o IP do roteador cliente para 192.168.2.1 (mantendo a máscara de rede em 255.255.255.0), selecionando no menu Network -> Interfaces e clicando em “Edit” da interface “LAN”
Após alterar o IP clicar o botão “Save & Apply”.
Após essas alterações me loguei no OpenWrt com o comando:
ssh
root@192.168.2.1
E pude verificar o acesso à Internet com o comando ping:
root@OpenWrt:~# ping www.google.com PING www.google.com (201.87.209.181): 56 data bytes 64 bytes from 201.87.209.181: seq=0 ttl=60 time=15.170 ms 64 bytes from 201.87.209.181: seq=1 ttl=60 time=17.943 ms
Com o comando ifconfig verifiquei que a interface wlan0 do roteador MR3020 recebeu o IP 192.168.0.102 do roteador Huawei (C2O), e a interface br-lan (MR3020) ficou com o IP fixo de 192.168.2.1. Um Laptop conectado na porta Ethernet do MR3020 recebeu o IP 192.168.2.141, e um tablet conectado na rede C2O recebeu o IP 192.168.0.103, conforme a figura 11.
Fiquei satisfeito pois, pelo menos, poderia dar prosseguimento à instalação de pacotes usando o gerenciador de pacotes OPKG, visando habilitar o uso da porta USB para instalação de pacotes adicionais e a conexão de uma placa Arduino.
Mas ainda queria encontrar uma maneira de criar uma rede Wifi exclusiva para o roteador MR3020, ou seja, criar uma rede sem fio privada apenas com o roteador MR3020 com OpenWrt e independente de um segundo roteador com acesso à Internet.
Encontrei um tutorial muito didático para a configuração do OpenWrt em diferentes modos: Modo Cliente/Repetidor/WDS con Openwrt, e resolvi experimentar a parte 2 do tutorial “Parte 2 :: Modo repetidor sobre cliente enrutado” (repetidor em cliente em modo roteado).
Após me logar na interface LuCI selecionei Network -> Wifi e cliquei no botão “Add” para criar uma nova configuração de Ponto de Acesso. Após a criação, clicar no botão “Edit”.
Na aba “General Setup” da seção “Interface Configuration” defini o ESSID como “OpenWrt”, Mode como “Access Point” e em Network selecionei a opção “lan”.
Após clicar em “Save & Apply” a tela Wireless Overview mostra:
Com essa nova configuração é possível identificar a rede wifi “OpenWrt” na qual foi possível conectar um laptop e um tablet.
Com o comando ifconfig identifiquei no roteador MR3020 a interface br-lan com IP 192.168.2.1, wlan0 com IP 192.168.0.100 e wlan0-1 sem IP. Um Laptop conectado na rede “OpenWrt” mostra um interface wlan0 com IP 192.168.2.126 e um tablet conectado na rede “OpenWrt” recebeu o IP 192.168.2.148, conforme a figura 14.
Resolvi fazer um teste e desligar o roteador principal (C2O) para verificar se o roteador MR3020 manteria as conexões. Após desligar o roteador principal os dispositivos conectados perdem a conexão mas o sinal da rede OpenWrt reaparece após alguns instantes e foi possível reconectar o laptop e o tablet ao roteador MR3020. :-)
Encontrei algumas informações que foram muito úteis para entender os modos de operação nos excelentes tutoriais do Luiz Angelo Daros de Luca que transcrevo literalmente a seguir:
...Durante a configuração do OpenWRT, não vemos as usuais interfaces do Linux (eth1, wlan0,...). O que encontramos são interfaces de "mais alto nível" como LAN e WAN. Estas interfaces podem ser mapeadas diretamente para uma única interface do roteador (agora sim eth0, etc) ou agrupá-las em uma bridge.
Por padrão, existem duas interfaces: WAN (Wide area network) e a LAN (Local area network). A WAN normalmente é composta apenas de uma interface (eth1), normalmente destacada das demais portas, utilizada para a conexão com a Internet. A LAN é uma bridge que junta a eth0 (portas da rede local) e a interface wireless (wlan0).
A interface wlan0 pode se juntar com a WAN, as portas da LAN serem usadas para conexões diversas com a Internet ou juntar tudo e tornar o roteador um simples ponto de acesso (access-point) sem qualquer roteamento.
Alguém pode perguntar: "mas as portas da rede local, aquelas 4, são mapeadas para uma única interface, a eth0?". Sim, são. Mas isto não é um limitador. Apesar de, por padrão, estarem juntas, as portas, se o HW permitir, podem ser isoladas em diversas redes, enviar pacotes com tags de VLANs e assim por diante. Porém, isto é um tema para um artigo isolado.
Em geral, não é alterada a rede LAN e a WAN opera configurada por DHCP, PPPoE, dependendo do seu provedor.
OK, até agora como qualquer roteador. Porém, agora entra a flexibilidade do OpenWRT. As funções das interfaces podem ser:
Alteradas
Alternadas
Agregadas
Divididas
Para os roteadores wireless, é provavel que o desejo seja ativar o rádio. Isto é feito na configuração Wifi. SSID, criptografia (WPA ou WPA2, por favor. Esqueça que WEP existe), uma senha razoável, potência, canal, tudo isto que já encontramos em todos os firmwares. Vou focar nas diferenças: modo de operação.
Existe uma boa gama de opções do modo de operação desde o clássico "AP", passando pelo simplório Ad-hoc e por coisas mais interessantes como redes Mesh (802.11s), WDS cliente ou servidor, ou até mesmo se comportando como um cliente wireless comum, conectando-se a outro roteador Wireless. Há também o modo "monitor", para realizar captura de pacotes wireless.
Passando rapidamente, outra coisa interessante pode não ser notada. Na configuração do Wifi, existe um botão para "Adicionar".
Adicionar o que?
Outra configuração wireless.
Se o HW permitir, e normalmente permite, você pode ter múltiplas configurações de rede sem fio, operando em modos diferentes, com senhas diferentes, com SSID diferentes, cada uma representando uma interface. Vou tentar fazer um artigo somente sobre casos interessantes de uso da rede sem fio múltipla. ...
Seguindo as dicas do Nelson Saraiva e da página USB Basic Support atualizei os pacotes com o gerenciador de pacotes OPKG:
opkg
install
kmod-usb-core
Mas aparentemente esse pacote já estava instalado:
root@OpenWrt:~# opkg install kmod-usb-core Package kmod-usb-core (3.18.23-1) installed in root is up to date.
Depois instalei o pacote kmod-usb-ohci:
opkg
install
kmod-usb-ohci
Mas ao carregar o módulo com o comando insmod usb-ohci retorna a mensagem:
root@OpenWrt:~# insmod usb-ohci Failed to find usb-ohci. Maybe it is a built in module ?
Não entendi a mensagem, então removi o ohci e instalei o uhci e o kmod-usb2 conforme as mensagens:
root@OpenWrt:~# opkg remove kmod-usb-ohci Removing package kmod-usb-ohci from root... root@OpenWrt:~# opkg install kmod-usb-uhci Installing kmod-usb-uhci (3.18.23-1) to root... Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base/kmod-usb-uhci_3.18.23-1_ar71xx.ipk. Configuring kmod-usb-uhci. root@OpenWrt:~# insmod usbcore module is already loaded - usbcore root@OpenWrt:~# insmod uhci Failed to find uhci. Maybe it is a built in module ? root@OpenWrt:~# opkg install kmod-usb2 Package kmod-usb2 (3.18.23-1) installed in root is up to date. root@OpenWrt:~# insmod ehci-hcd module is already loaded - ehci-hcd
Conectei um pen-drive na porta USB e vi no final as mensagens do comando dmesg:
[ 1481.830000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 1481.850000] ohci-platform: OHCI generic platform driver [ 1629.140000] uhci_hcd: USB Universal Host Controller Interface driver [ 1897.780000] usb 1-1: new high-speed USB device number 2 using ehci-platform
Parece que os drivers ohci, uhci e ehci já estavam instalados.
Considerando que o suporte básico a dispositivos USB já estava instalado parti para a seção USB Storage e foi então que percebi que não havia espaço para instalar o restante dos pacotes.
Cheguei a pedir ajuda no fórum do OpenWrt com a mensagem Need space to install package for USB storage e recebi diferentes sugestões. Alguns sugeriram preparar uma imagem menor com o Image Generator (Image Builder) mas não me pareceu uma alternativa trivial e não fiquei animado a seguir essa sugestão.
Uma outra sugestão foi instalar uma imagem mais antiga e menor, para evitar ficar com pouco espaço e impedido de instalar os pacotes para suporte a USB storage (kmod-usb-storage block-mount kmod-fs-ext4).
Acabei optando pela instalação de uma versão mais antiga do OpenWrt e resolvi utilizar a mesma versão usada no tutorial do Nelson Saraiva (Attitude Adjustment 12.09).
Baixei o arquivo openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin, calculei o md5sum e fiz a nova gravação pela interface LuCI selecionando System > Backup/Flash Firmware > Flash operations > Flash new firmware image.
Selecionar o arquivo openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin, desmarcar a opção “Keep settings” e iniciar a gravação clicando no botão “Flash image”.
Não tive nenhum sinal do final da operação, os LEDs ficaram piscando e não vi o roteador reiniciar. Depois de alguns minutos fui almoçar e deixei o processo rodando.
Depois de aproximadamente 1 hora os LEDs continuavam piscando e a interface LuCI continuava aguardando a conexão.
Achei que tinha dado errado e resolvi desligar/religar o roteador e após alguns instantes, consegui reconectar abrindo o navegador no endereço 192.168.1.1. :-)
A seguir providenciei a configuração da senha de root, alteração do endereço IP do roteador OpenWrt para 192.168.2.1, ativação da interface wifi e configuração do roteador no modo “client” conforme descrito na seção de instalação.
Reiniciei o roteador, me conectei com o comando ssh root@192.168.2.1 e tive que executar alguns comandos sugeridos pelo ssh para criar nova chave. Apos criar uma conexão ssh testei a conexão com o comando ping pelo terminal.
Fiz a instalação dos pacotes sugeridos na seção USB Storage:
opkg
update
opkg
install
kmod-usb-storage block-mount kmod-fs-ext4
O gerenciador de pacotes se encarregou de instalar as dependências necessárias.
Em seguida, utilizei outro computador para particionar e formatar um pen-drive de 4GB com o sistema de arquivos ext4 com os comandos fdisk e mkfs.ext4 conforme o tutorial https://wiki.openwrt.org/doc/howto/storage.
Conectei um pen-drive em um hub USB conectado na porta USB e pude ver as mensagens de reconhecimento do dispositivo do final do comando dmesg:
hub 1-0:1.0: USB hub found [ 8.050000] hub 1-0:1.0: 1 port detected [ 8.070000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 8.130000] Initializing USB Mass Storage driver... [ 8.140000] usbcore: registered new interface driver usb-storage [ 8.140000] USB Mass Storage support registered. [ 8.380000] usb 1-1: new full-speed USB device number 2 using ehci-platform [ 8.540000] hub 1-1:1.0: USB hub found [ 8.540000] hub 1-1:1.0: 4 ports detected [ 8.830000] usb 1-1.1: new full-speed USB device number 3 using ehci-platform [ 8.970000] usb 1-1.1: not running at top speed; connect to a high speed hub [ 8.990000] scsi0 : usb-storage 1-1.1:1.0 [ 9.990000] scsi 0:0:0:0: Direct-Access Generic Flash Disk 8.07 PQ: 0 ANSI: 4 [ 10.010000] sd 0:0:0:0: [sda] 15728640 512-byte logical blocks: (8.05 GB/7.50 GiB) [ 10.020000] sd 0:0:0:0: [sda] Write Protect is off [ 10.020000] sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00 [ 10.030000] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 10.060000] sda: sda1 [ 10.070000] sd 0:0:0:0: [sda] Attached SCSI removable disk [ 28.710000] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
Após o reconhecimento do pendrive a próxima etapa era configurar o sistema para montar o sistema de arquivos no pendrive.
Alguns links importantes para essa etapa:
Criei o diretório /mnt/usb
e montei o pendrive:
root@OpenWrt:~#
mount /dev/sda1 /mnt/usb
Em seguida criei o arquivo /etc/config/fstab
:
cat /etc/config/fstab config global automount option from_fstab 1 option anon_mount 1 config global autoswap option from_fstab 1 option anon_swap 0 config mount option target /mnt/usb option device /dev/sda1 option fstype ext4 option options rw,sync option enabled 1 option enabled_fsck 0 config swap option device /dev/sda2 option enabled 0
Em seguida copiar os arquivos da /overlay
para a nova partição:
tar -C /overlay -cvf - . | tar -C /mnt/usb -xf -
Após reiniciar foi possível ver as seguintes informações:
root@OpenWrt:~# df -h Filesystem Size Used Available Use% Mounted on rootfs 7.5G 255.6M 6.8G 4% / /dev/root 2.0M 2.0M 0 100% /rom tmpfs 14.3M 92.0K 14.2M 1% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/sda1 7.5G 255.6M 6.8G 4% /overlay overlayfs:/overlay 7.5G 255.6M 6.8G 4% / root@OpenWrt:~# mount rootfs on / type rootfs (rw) /dev/root on /rom type squashfs (ro,relatime) proc on /proc type proc (rw,noatime) sysfs on /sys type sysfs (rw,noatime) tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime,size=14608k) tmpfs on /dev type tmpfs (rw,noatime,size=512k,mode=755) devpts on /dev/pts type devpts (rw,noatime,mode=600) /dev/sda1 on /overlay type ext4 (rw,sync,relatime,user_xattr,barrier=1,data=ordered) overlayfs:/overlay on / type overlayfs (rw,relatime,lowerdir=/,upperdir=/overlay) debugfs on /sys/kernel/debug type debugfs (rw,relatime) none on /proc/bus/usb type usbfs (rw,relatime)
Alguns links importantes para essa etapa:
Para a montagem do dispositivo /dev/ttyACM
instalei o pacote:
opkg
update
opkg
install
kmod-usb-acm
E ao conectar a placa Arduino no hub USB pude ver a mensagem de reconhecimento com o comando dmesg:
... usb 1-1.3: new full-speed USB device number 4 using ehci-platform [ 4823.100000] cdc_acm 1-1.3:1.0: ttyACM0: USB ACM device
Para minha surpresa descobri que havia no repositório um pacote para o interpretador tcl:
root@OpenWrt:~# opkg list | grep tcl ... tcl - 8.5.8-1 - Tcl (Tool Command Language) is a very powerful but easy to learn dynamic programming language, suitable for a very wide range of uses, including web and desktop applications, networking, administration, testing and many more. Open source and business-friendly, Tcl is a mature yet evolving language that is truly cross platform, easily deployed and highly extensible.
Então fiz a instalação com o comando:
opkg
install
tcl
Mas ao executar o interpretador aparecia a seguinte mensagem:
Can't find a usable init.tcl in the following directories: /usr/lib/tcl8.5 /usr/lib/tcl8.5 /lib/tcl8.5 /usr/library /library /tcl8.5.8/library /tcl8.5.8/library
Encontrei a solução na mensagem tcl 8.5 in AA and trunk, error with init.tcl and other library.
Mas não consegui criar um diretório:
root@OpenWrt:/# mkdir /usr/lib/tcl8.5 mkdir: can't create directory '/usr/lib/tcl8.5': Read-only file system
Não consegui descobrir o motivo, mas depois de reinicializar o roteador o problema “sumiu” e pude criar o diretório e copiar o arquivo init.tcl para a pasta /usr/lib/tcl8.5
com o comando: (Fonte: OpenWRT: Cópia de arquivos de/para o roteador)
scp
/home/markos/init.tcl root@192.168.2.1:/usr/lib/tcl8.5/init.tcl
E finalmente tive acesso ao interpretador Tcl dentro do OpenWrt sem mensagens de erro:
root@OpenWrt:~# tclsh8.5 tclsh8.5.8>
E pude executar os comandos:
root@OpenWrt:~# tclsh8.5 tclsh8.5.8> set porta [open /dev/ttyACM0 r+]
Mas ao tentar configurar os parâmetros de comunicação serial recebia uma mensagem de erro:
tclsh8.5.8> fconfigure $porta -mode 9600,n,8,1 [Error] bad option "-mode": should be one of -blocking, -buffering, -buffersize, -encoding, -eofchar, or -translation
Então instalei o pacote coreutils-stty conforme o link https://wiki.openwrt.org/doc/recipes/serialbaudratespeed:
opkg
install
coreutils-stty
E fiz a configuração dos parâmetros de comunicação serial com o comando: (Fonte: http://www.tldp.org/LDP/nag2/x-087-2-serial-configuration.html)
stty
-F
/dev/ttyACM0 9600 cs8 -parenb -cstopb
E finalmente pude ver as mensagens do Arduino com o loop:
tclsh8.5.8> while 1 { after 500 puts [gets $porta] } Clicks em 10 segundos - 0 Volume em 10 segundos - 0.00 Clicks em 10 segundos - 0 Volume em 10 segundos - 0.00
Esta placa Arduino estava sendo usado no projeto do Pluviômetro.
Mas uma semana depois...
Ao retomar os testes com o OpenWrt observei que o programa em Tcl não conseguia ler os dados enviados pelo Arduino. :-(
O Arduino funcionava normalmente quando conectado ao Laptop mas quando conectado ao roteador os dados não eram recebidos.
O comando dmesg indica a criação do dispositivo /dev/ttyACM0
mas também mostrava algumas mensagens de erro (Maybe the USB cable is bad?)
cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device [ 33.040000] usbcore: registered new interface driver cdc_acm [ 33.040000] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters [ 36.910000] device eth0 entered promiscuous mode [ 37.340000] eth0: link up (100Mbps/Full duplex) [ 37.340000] br-lan: port 1(eth0) entered forwarding state [ 37.350000] br-lan: port 1(eth0) entered forwarding state [ 39.350000] br-lan: port 1(eth0) entered forwarding state [ 156.060000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 157.070000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 158.080000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 159.090000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 160.100000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 160.100000] hub 1-1:1.0: Cannot enable port 2. Maybe the USB cable is bad? [ 161.120000] hub 1-1:1.0: cannot disable port 2 (err = -145) [ 162.130000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 163.140000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 164.150000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 165.160000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 166.170000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 166.170000] hub 1-1:1.0: Cannot enable port 2. Maybe the USB cable is bad? [ 167.190000] hub 1-1:1.0: cannot disable port 2 (err = -145) [ 168.200000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 169.210000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 170.220000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 171.230000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 172.240000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 172.240000] hub 1-1:1.0: Cannot enable port 2. Maybe the USB cable is bad? [ 173.260000] hub 1-1:1.0: cannot disable port 2 (err = -145) [ 174.270000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 175.280000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 176.290000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 177.300000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 178.310000] hub 1-1:1.0: cannot reset port 2 (err = -145) [ 178.310000] hub 1-1:1.0: Cannot enable port 2. Maybe the USB cable is bad? [ 179.330000] hub 1-1:1.0: cannot disable port 2 (err = -145) [ 180.340000] hub 1-1:1.0: cannot disable port 2 (err = -145) [ 180.340000] sd 0:0:0:0: Device offlined - not ready after error recovery [ 180.350000] sd 0:0:0:0: [sda] Unhandled error code [ 180.350000] sd 0:0:0:0: [sda] Result: hostbyte=0x05 driverbyte=0x00 [ 180.360000] sd 0:0:0:0: [sda] CDB: cdb[0]=0x28: 28 00 00 04 1b 80 00 00 80 00 [ 180.360000] end_request: I/O error, dev sda, sector 269184 [ 180.370000] sd 0:0:0:0: rejecting I/O to offline device [ 184.390000] sd 0:0:0:0: rejecting I/O to offline device [ 185.390000] hub 1-1:1.0: hub_port_status failed (err = -145)
Uma das suspeitas era a falta de energia da fonte de alimentação do roteador e por isso providencei a compra de um hub usb com fonte de alimentação externa mas tive problemas ao tentar usar o hub.
Percebi que o laptop “desligava” quando conectava o hub (energizado) na porta usb do laptop. Fiquei preocupado com o Laptop e não quis mais insistir nessa alternativa e resolvi devolver para a loja o hub usb com a fonte externa.
Mais tarde passei a considerar que o problema pudesse ser simplesmente devido ao cabo USB.
Mas além disso, continuei a pesquisar pela Internet e encontrei no forum do Arduino a mensagem: http://forum.arduino.cc/index.php?topic=143486.0 que sugeria a inclusão das opções “-echo” e “-hupcl” no comando stty para evitar um bug no Arduino Uno.
Resolvi testar outros cabos e também seguir a sugestão de incluir o comando:
stty
-F
/dev/ttyACM0 9600 cs8 -parenb -cstopb -echo -hupcl
No arquivo /etc/rc.local
para ser executado em cada inicialização.
Mas curiosamente, percebi que, em casa, o Arduino funcionava perfeitamente ao ser concectado no roteador, mas no IVR o Arduino parava de funcionar. :-(
Uma outra idéia que surgiu foi a possibilidade de intereferência eletromagnética gerada pelo transformador do estabilizador que era usado no IVR. O cabo de alimentação do roteador é relativamente curto e o roteador, ou o cabo USB do Arduino poderia estar sofrendo esse tipo de interferência.
Com todas essas dificuldades resolvi deixar pra mais tarde as tentativas de conexão do Arduino diretamente no roteador MR3020 com o OpenWrt e resolvi usar apenas o gabinete de um PC antigo para ligar o Arduino e o roteador.
Essa placa Arduino seria usada no projeto de implantação de um Pluviômetro.
Ou seja, o PC ficaria em local abrigado e seria usado para receber as leituras do Arduino e estaria conectado fisicamente ao roteador através de um cabo Ethernet. E o roteador seria o “Ponto de Acesso” (como um switch em uma rede Ethernet) de uma rede wireless, permitindo a transferência de dados do PC ligado ao Arduino para um outro PC na rede para armazenamento dos dados e exibição dos gráficos e relatórios pluviométricos.
Os detalhes da implantação desse projeto podem ser vistos na seção www.c2o.pro.br/proj/pluviometro/index.html.
Eu havia criado inicialmente uma interface “WAN” em modo “Client” conectada a um outro roteador (Huawei E156B - SSID C2O) para acesso à Internet. (Figura 9)
Para entender essa configuração conectei um tablet na rede C2O e um desktop no roteador com OpenWrt com um cabo Ethernet e obtive os IPs conforme o diagrama da figura 11.
E em seguida criei uma interface “LAN” no modo “Access Point” (Figura 12) para compartilhar o acesso à Internet com outras máquinas.
Com essa configuração pude conectar um tablet e um laptop à rede wireless do OpenWrt e navegar na Internet conforme o diagrama da figura 14.
Mas, ao contrário da primeira vez, quando desliguei roteador principal (C2O) o sinal da rede OpenWrt desapareceu. :-(
Como disse anteriormente, eu já estava muito confuso com tantas opções de modo de operação na seção: Network -> Wifi -> Edit -> Interface Configuration -> Mode:
Access Point
Client
Ad-Hoc
802.11s
Pseudo Ad-Hoc (ahdemo)
Monitor
Access Point (WDS)
Client (WDS)
Mas depois de “muito penar” e postar 2 perguntas no fórum do OpenWrt (Keep a home network without Internet connection e OpenWrt as a switch to a LAN, without Internet, but with DHCP) eu encontrei uma explicação didática sobre os fundamentos das redes Wireless no post Linux Sem Fios - Parte 1, e no qual eu pude finalmente entender o que é o modo “Access Point”:
O ponto de acesso: fazendo uma analogia com as redes com fios, é como se fosse um hub ou um switch Ethernet. A principal função de um ponto de acesso é agrupar e controlar a comunicação entre várias estações em uma mesma rede Wi-Fi. É possível criar uma rede sem fios sem um ponto de acesso, através do modo “Ad-Hoc” (Fonte:Linux Sem Fios - Parte 1).
Resolvi simplesmente deletar a interface “Client” do roteador Huawei E156B (SSID C2O) e, após reiniciar o roteador, voltou a aparecer a rede OpenWrt.
A etapa seguinte foi abrir portas no firewall do roteador para testar a comunicação cliente-servidor usando o protocolo TCP/IP com Tcl.
No site OpenWRT: Fazendo mágica com linux no roteador - Parte 1 encontrei dicas dos comandos para abrir uma porta para protocolo TCP incluindo as seguintes regras no arquivo /etc/config/firewall
:
config rule option target 'ACCEPT' option src 'lan' option proto 'tcp' option dest_port '2540' option name 'Echo'
Mas essa configuração também pode ser feita pela interface LuCI: Network > Firewall > Traffic Rules> Open ports on router
E no final da página Network > DHCP and DNS existe a seção “Static Leases” com a opção de fixar um IP e hostname para um MAC address. Isso vai permite definir apenas o hostname ao invés do endereço IP nos programas cliente-servidor.
Alguns links: