2010-10-12 17 views
2

Je voudrais connaître les mécanismes de "découverte de service" supportés par android - en particulier, Printer Discovery.Comment réaliser une découverte de service comme "Printer Discover" sur android?

Est-ce que android fournit une telle option de découverte? exemple: support de la diffusion snmp?

J'ai essayé une application "PrinterShare" lien: http://www.printeranywhere.com/mobile.sdf où la découverte de l'imprimante est réalisée par ipp.

Toute aide est appréciée.

Répondre

3

Est-ce que android fournit une telle option de découverte?

Pas que je sache, désolé.

+0

merci pour la réponse rapide ... btw ... comment avez-vous obtenu un score de réputation massive comme ça ??? * Je me demandais * –

+2

@Roy Samuel: "comment avez-vous obtenu un score de réputation massive comme ça ??? !!!" - une réponse à la fois. Avec un ordre de côté de "n'ayant aucune vie" ... :-) – CommonsWare

2

Cet extrait de code fonctionne correctement sur J2SE. Cependant, sur l'émulateur Android, j'obtiens une 'Exception Time Out' avec response = 'null'

`DatagramSocket clientSocket = new DatagramSocket (8888); clientSocket.setSoTimeout (20000);

/** 
* SSDP is a text-based protocol based on the Hypertext Transfer Protocol (RFC 2616). 
* However, it uses the User Datagram Protocol (UDP) as underlying transport protocol. 
* Services are announced by the hosting system with multicast addressing to a 
* specifically designated IP multicast address at port number 1900. In IPv4, 
* the multicast address is 239.255.255.250. 
*/ 
         //getByName(host) //host the hostName to be resolved to an address or null. 
InetAddress group = InetAddress.getByName("239.255.255.250"); 

//host can be null which means that an address of the loopback interface is returned. 
if(group == null){ 
    Log.d("Discovery","getByName(): returns address of loopback interface."); 
} 
byte[] sendData; 
byte[] receiveData = new byte[128]; 

String sentence = "M-SEARCH * HTTP/1.1\r\n" 
    + "HOST: 239.255.255.250:1900\r\n" 
    + "MAN: \"ssdp:discover\"\r\n" 
    + "MX: 10\r\n" 
    + "ST: ssdp:all\r\n" 
    + "\r\n"; 

sendData = sentence.getBytes(); 
//public DatagramPacket (byte[] data, int length, InetAddress host, int port) 
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, group, 1900); 

try { 
    clientSocket.send(sendPacket); 
} catch (Exception e) { 
    e.getMessage(); 
    e.printStackTrace(); 
} 
Log.d("Discovery","sent packet..."); 
while(true) 
{ 
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
    try 
    { 
     boolean isc = clientSocket.isConnected(); 
     clientSocket.receive(receivePacket); 
    } 
    catch (Exception Ex) 
    { 
     Log.d("Discovery","Time out Exception"); 
    } 
    if (receivePacket.getAddress() == null) 
    { 
     Log.d("Discovery","receivePacket.getAddress() == null"); 
     break; 
    } 
    Log.d("Discovery","Senders Address : " + receivePacket.getAddress().getHostAddress()); 
    String controllerResponse = new String(receivePacket.getData());  
} //end of while() 
clientSocket.close(); ` 
+0

Une idée de pourquoi cela ne fonctionne pas sur l'émulateur Android? –

+0

l'émulateur Android ne supporte pas la diffusion/multidiffusion - besoin de fonctionner sur du vrai matériel Android. –

4

Roy, je suis tombé sur le même problème que vous, et a même été obtenir le même comportement lors de l'exécution qui extrait de code sur un périphérique réel (tout en exécutant la version autonome de code, pas android, a bien fonctionné). J'ai trouvé this page et obtenu ce travail, bien que sur l'appareil, en utilisant ce qui suit pour comprendre la diffusion IP (au lieu de 239.255.255.250):

InetAddress getBroadcastAddress() throws IOException { 
    WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcp = wifi.getDhcpInfo(); 
    // handle null somehow 

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
    byte[] quads = new byte[4]; 
    for (int k = 0; k < 4; k++) 
     quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); 
    return InetAddress.getByAddress(quads); 
} 

Hope that helps :)