2012-02-03 9 views
8

Estoy tratando de obtener una lista de todas las direcciones IP en una red LAN. La razón de esto es que estoy escribiendo una aplicación que utiliza la impresora de recibos STAR TSP100LAN.Listar todas las direcciones IP de los dispositivos en la red wifi iOS sdk sin bonjour?

El proceso para obtener la dirección IP de la impresora es bastante engorroso para el usuario final. Implica apagar la impresora, mantener presionado el botón de alimentación del papel, volver a encender la impresora, esperar 15 segundos para que la impresora obtenga una dirección IP a través de DHCP y finalmente escupir un recibo con esta información.

Dado que la impresora no está habilitada Bonjour, ¿es posible obtener la dirección IP a través de otros métodos?

¡Cualquier ayuda es muy apreciada! Espero que esto no sea una pregunta repetida, pero a través de mi búsqueda ¡parece que no puedo encontrar una solución!

ACTUALIZACIÓN: Ok después de un poco de pensamiento que han llegado con una pseudo solución:

  1. Determine actual Dirección IP del iPad a través de NSHost.

  2. de Gaza el último cuadrante de la Dirección IP

  3. uso de una cadena despojado como un prefijo, iterar 1-255 para el último cuadrante

  4. Cada iteración, intento de abrir un puerto a la dirección indicada mediante sdk de la impresora Si recibo una respuesta válida, sé que la dirección IP es una impresora Si no, excluyo la dirección IP de la lista de impresoras disponibles.

Hasta ahora esto ha estado funcionando, establecí un tiempo de espera de 5 milésegundos para cada intento de apertura de puerto. Pero descubrieron que esto puede devolver algunos resultados nulos a pesar de que en realidad haya una impresora en la red con una dirección IP asignada.

Tal vez si obtengo un resultado nulo la primera vez, debería aumentar el tiempo de espera a 15 milisegundos para un segundo intento de búsqueda.

+3

* Pele el último cuadrante de la dirección IP ... itere 1-255 * Google "máscara de subred" –

+2

Según el fabricante, hay un SDP (Star Discovery Protocol) disponible. Deberías tratar de implementarlo. Porque podría 'exitosamente' abrir el mismo puerto en un dispositivo no asociado pensando que está conectado a la impresora, si no lo hace. –

Respuesta

2

Su enfoque de sondeo de la subred local/8 es probablemente lo mejor que puede hacer. No puedo encontrar ninguna API para obtener información más detallada sobre la interfaz de red (es decir, la máscara de subred) en iOS. (Aunque usar la máscara de subred sería una forma más correcta de determinar el rango para iterar, si pudiera obtenerlo.)

Como ha visto, 5ms es un intervalo bastante apretado; En mi experiencia, 15ms TODAVÍA puede ser bastante ajustado para una conexión TCP a través de WiFi. Como siguiente paso, sugeriría que se paralelice el sondeo del rango y, por lo tanto, le permita ampliar el intervalo que está dispuesto a esperar. La forma más simple probablemente sea usar GCD. También podría iniciar este proceso de votación en segundo plano antes de que el usuario necesite explícitamente la impresora, lo que podría mejorar la capacidad de respuesta percibida por el usuario de su aplicación.

Alternativamente, podría utilizar la API CFSocket para abrir todas estas conexiones (CFSocketCreate, CFSocketConnectToAddress y amigos) y obtener el paralelismo al darles servicio en el hilo principal con devoluciones de llamada/runloop. Luego, cuando entren esas devoluciones de llamadas, anote la respuesta de las direcciones en el puerto determinado. A menos que la impresora no esté utilizando TCP por alguna razón, esto debería ser factible. Una vez que sepa qué dirección responde en ese puerto, puede recorrer esa lista (con suerte mucho más pequeña) que se conecta con el SDK de la impresora.Este enfoque le dará aún más (y forma de más elegante) paralelismo que engendrar una gran cantidad de subprocesos GCD, pero puede ser difícil entender si no ha trabajado con runloops anteriormente.

Espero que ayude.

+0

Gracias por la respuesta ipmcc, me estoy ejecutando con mi solución por ahora, excepto que probablemente aumente el tiempo de espera hasta 20 ms y aumente a partir de allí en cualquier búsqueda subsiguiente que resulte de ninguna respuesta. ¡Gracias de nuevo! – happs

+1

@ipmcc Esta reciente pregunta de SO enumera cómo obtener la máscara de subred http://stackoverflow.com/questions/15156028/how-to-get-subnet-mask-and-broadcast-address-of-personal-hotspot-in- ios –

0

Puede rápidamente bajar la lista de 255 a un número más pequeño haciendo ping a la dirección de difusión y luego mirando en su memoria caché de arp.

Solo funciona para hosts que responden a pings de difusión.

Cuestiones relacionadas