Eu tropecei nisso e, uma vez que fiz algo semelhante, decidi postar uma resposta.
Eu fiz o seguinte:
1. Ping all addresses within given network and subnet (excluding network and broadcast addresses)
2. Wait for response has a timeout so that if device doesn't answer from furthest corner of your WiFi it is considered not present.
3. So we get all IPs on the net that answer to ICMP packets.
4. Then use each detected IP to ask for more and decide which device you like and which one you don't.
No meu caso, eu tinha um servidor HTTP em execução no meu dispositivo. Então, acabei de enviar uma solicitação HTTP HEAD para praticamente nada na porta 80. Se o dispositivo respondeu e o cabeçalho do servidor foi nomeado corretamente, esse é o meu dispositivo.
Mas não consegui ir rápido sem executar o ping primeiro. O HTTP é TCP e a solicitação é grande; portanto, o tempo limite deve ser de 4 segundos para o WiFi. Fazer isso para 253 endereços é lento como o inferno. Mas você não teria 253 dispositivos (provavelmente) mais menos servidores HTTP. (ou, no seu caso, telefones)
Considerando os logs do roteador é uma idéia muito boa e fácil. E ainda mais rápido do que executar ping em todos. Alguns roteadores nem precisam fazer login para acessá-los.
Além disso, vale a pena verificar se o seu dispositivo possui suporte para UPNP. Nesse caso, você pode usar o UPNP para detectar sua presença. Esta seria a solução oficial (ouvindo na transmissão os UDPs do UPNP). Mas todos os dispositivos não suportam isso. Mas todos os dispositivos também não suportam ICMP. (eles não desejam ser bombardeados desnecessariamente).
Há outra possibilidade interessante. Você pode procurar pacotes DHCP e ver quando um roteador está fornecendo um endereço IP a um novo dispositivo. Mas isso não funcionaria para dispositivos com IPs estáticos. Eles nem tocariam na rede até precisarem de algo. A conexão ao próprio WiFi está em outra camada e não pode ser facilmente detectada, a menos que você queira agir como um farejador. Não tenho certeza, mesmo que seja possível com o adaptador de rede em um modo promissor. Eu acho que seria necessário hardware adicional para isso.
Para obter o ping no Python, sem subprocessar o programa de ping e perder velocidade, é necessário criar um soquete bruto e construir o pacote ICMP manualmente. Não é difícil. Há um exemplo disso em algum lugar na web. Obviamente, para enviá-lo, você precisará de permissões de root, assim como o ping. Isso é uma desvantagem. Se você distribuir o software, não poderá esperar que os usuários o executem como root.