Как добиться обнаружения службы, как «Принтер Обнаружение» на Android? - PullRequest
2 голосов
/ 12 октября 2010

Я хотел бы узнать о механизмах «обнаружения служб», поддерживаемых android, в частности, Printer Discovery.

Предоставляет ли android такую ​​возможность обнаружения?пример: поддержка вещания по протоколу snmp?

Я опробовал ссылку приложения "PrinterShare": http://www.printeranywhere.com/mobile.sdf, где обнаружение принтера осуществляется через ipp.

Любая помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2010

Рой, я столкнулся с той же проблемой, что и вы, и даже получал то же поведение при запуске этого фрагмента кода на реальном устройстве (при автономном запуске кода, не в Android, он работал нормально). Я нашел эту страницу и заставил ее работать, хотя и только на устройстве, используя следующее, чтобы выяснить Broadcast IP (вместо 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);
}

Надеюсь, это поможет:)

3 голосов
/ 12 октября 2010

Предоставляет ли Android такую ​​возможность обнаружения?

Не то, чтобы я знал, извините.

2 голосов
/ 13 октября 2010

Этот фрагмент кода отлично работает на J2SE.Однако в эмуляторе Android я получаю «Исключение времени ожидания» с откликом = '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(); `
...