Enumere las direcciones IP de todos los dispositivos en el sdk iOS de la networking wifi sin bonjour?

Estoy tratando de get una list de todos los IP en una networking LAN. La razón de esto es que estoy escribiendo una aplicación que utiliza la impresora de recibos STAR TSP100LAN.

El process para get la dirección IP de la impresora es bastante engorroso para el usuario final. Implica apagar la impresora, mantener pulsado el button 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.

Al ver que la impresora no está habilitada para Bonjour, ¿es posible get la dirección IP a través de otros methods?

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

ACTUALIZACIÓN : Ok, después de un poco de pensamiento, he llegado a una pseudo solución:

  1. Determine la IPAddress actual del iPad a través de NSHost.

  2. Quite el último cuadrante del IPAddress

  3. Usando la cadena eliminada como prefijo, itera 1-255 para el último cuadrante

  4. Cada iteración, bash abrir un puerto a la dirección dada usando el sdk de la impresora. Si recibo una respuesta válida, sé que la IP es una impresora. Si no excluyo la IP de la list de impresoras disponibles.

Hasta ahora, esto ha estado funcionando, establecí un time de espera de 5 milésimas de segundo para cada bash de apertura de puerto. Pero han descubierto que esto puede devolver algunos resultados nulos a pesar de que en realidad hay una impresora en la networking con una dirección IP asignada.

Tal vez si obtengo un resultado nulo la primera vez debería boost el time de espera a 15 milésimas de segundo para un segundo bash de búsqueda.

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

Como has visto, 5 ms es un intervalo bastante estrecho; En mi experiencia, 15 ms TODAVÍA puede ser bastante apretado para una connection TCP a través de Wi-Fi. Como paso siguiente, sugeriría que se paralelice el sondeo del range y, por lo tanto, le permitirá extender el intervalo que está dispuesto a esperar. La forma más simple sería utilizar GCD. También podría comenzar este process de sondeo 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, puede usar la API CFSocket para abrir todas estas conexiones (CFSocketCreate, CFSocketConnectToAddress y amigos) y get el paralelismo atendiendo a todos en el hilo principal con callbacks / runloop. Luego, a medida que ingresen las devoluciones de llamada, tome nota de qué direcciones responden en el puerto dado. A less que la impresora no esté usando TCP por alguna razón, esto debería ser viable. Una vez que sepa qué direcciones responden en ese puerto, puede repetir esa list (con suerte mucho más pequeña) conectándose con el SDK de la impresora. Este enfoque le dará aún más (y mucho más elegante) paralelismo que engendrar una gran cantidad de subprocesss de GCD, pero puede ser difícil darse la vuelta si no ha trabajado con runloops anteriormente.

Espero que ayude.

Puede boost rápidamente la list de 255 a un número menor haciendo ping a la dirección de transmisión y luego buscando en su caching de arp.

Solo funciona para los hosts que responden a los pings de la transmisión.