No post de hoje, vou ensinar a listar as redes wi-fi usando python ao invés de comandos do shell. Você deve estar se perguntando: “Mas pra quê?” Bueno, você poderia criar uma pequena aplicação que gerencia duas redes wi-fi, escolhendo a com sinal mais forte e se conectando a ela. Ou, listar as redes wifi de um computador remotamente, e por ai vai.

Para isso vamos utilizar a biblioteca wifi, que nada mais é que um wrapper para o iwlist e o arquivo /etc/network/interfaces.

Instalando a biblioteca

A instalação é muito simples, basta o usar o pip:

$ sudo pip install wifi

Se você ainda não conhece o pip, tem uma apresentação no slideshare que apresenta muito bem a ferramenta. (http://www.slideshare.net/pugpe/pip-5939243)

Utilizando para listar as redes ao alcance

Bora programar! Abra o shell do python como root (ou com previlégios usando o sudo, se não o fizer assim não vai funcionar) e digite o seguinte:

from wifi import Cell
cells = Cell.all('wlan0')
for cell in cells:
    print cell.ssid

Inicialmente importamos a classe Cell, que é  o wrapper, de fato, do iwlist. Em seguida, solicitamos os output do iwlist através do método all. Esse método retorna uma lista de objetos, cada um representando uma rede que o iwlist encontrou. O parâmetro que passamos ao all é uma string com o nome da sua interface wifi – Para descobrir qual o nome da sua, use o iwconfig no terminal.

Esses objetos tem diversos atributos, cada qual representa uma informação sobre cada rede. No nosso exemplo, o atributo ssid é o “nome” da rede. Há vários outros que nos revelam informações interessantes sobre as redes ao nosso arredor, para os conhecer, dê uma olhada na documentação da biblioteca.

Listando a rede e a sua potência

No próximo programinha, vamos atribuir a cada rede, a potência que o nosso adaptador de rede mediu. Em seguida, vamos classificar em ordem do sinal mais forte para o mais fraco, indicando a “melhor” rede.

from wifi import Cell

cells = Cell.all('wlp2s0')
cell_power = []

for cell in cells:
    cell_power.append((cell.ssid, cell.signal))

cell_power.sort(key=lambda cell_signal:cell_signal[1], reverse=True)

print cell_power

A iteração do laço, adicionamos um tuple a lista cell_power. Em seguida, utilizamos o método sort para ordenar essa lista, usando como critério o segundo elemento do tuple que criamos no laço.

NOTA: Se estiver com alguma dúvida em relação ao lambda, 
dê uma olhadinha nesse link que você vai entender. :D

Muito bem, apresentamos a pequena biblioteca wifi e colocamos dois exemplinhos para ajudar. Espero que isso ajude você algum dia! Até a próxima!

Anúncios