venerdì 23 novembre 2012

Comunicazione UDP tra PC e Android

In questo post viene descritta la possibilita' di stabilire una connessione UDP tra il telefono Android in funzione Server ed un PC mediante script Python

per il lato server (Android) si deve creare un programma che inserisca tra i permessi di AndroidManifest.xml la seguente riga

<uses-permission android:name="android.permission.INTERNET" />

sulla funzione OnCreate si puo' creare il server UDP come riportato nell'esempio seguente (porta di connessione 12345 e lunghezza massima del pacchetto 1024 bytes
------------------------------------------------------------

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
   String lText;
   byte[] lMsg = new byte[1024];
   DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
   DatagramSocket ds = null;
   while (true)
   {
   try {
       ds = new DatagramSocket(12345); //porta del server UDP 12345

//riceve il pacchetto


       ds.receive(dp);
       lText = new String(lMsg, 0, dp.getLength());
       Log.i("Richiesta", lText);
        //manda la risposta

        byte[] b = "Risposta".getBytes();
        DatagramPacket sendPacket = new DatagramPacket(b, b.length, dp.getAddress(), dp.getPort());
        ds.send(sendPacket);      
        
   } catch (SocketException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   } finally {
       if (ds != null) {
           ds.close();
       }
   }
   }
}

------------------------------------------------------------

creato il server si passa al lato client in Python da mettere sul PC Desktop
il programma manda un pacchetto al server ed il server lo mette nel file di log
--------------------------------------------------
from socket import socket, AF_INET, SOCK_DGRAM
data = 'Richiesta'
port = 12345
hostname = 'localhost'
udp = socket(AF_INET,SOCK_DGRAM)
#manda la richiesta
udp.sendto(data, (hostname, port))
#aspetta e stampa la risposta

data, server = udp.recvfrom(1024)
print data
--------------------------------------------------

per poter effettuare le prove con l'emulatore di Android ci si collega via telnet alla shell dell'emulatore(telnet localhost 5554) e si digita 
redir add udp:12345:12345

che reindirizza le chiamate alla porta localhost:12345 del Desktop alla porta 12345 dell'emulatore dove gira il server