IP-Adressen aller Geräte auf dem WLAN-Netzwerk iOS SDK ohne Bonjour auflisten?

8

Ich versuche, eine Liste aller IPs in einem LAN-Netzwerk zu erhalten. Der Grund dafür ist, dass ich eine Anwendung schreibe, die den STAR TSP100LAN Belegdrucker verwendet.

Der Prozess zum Abrufen der IP-Adresse des Druckers ist für den Endbenutzer ziemlich umständlich. Dazu muss der Drucker ausgeschaltet, die Papiervorschubtaste gedrückt, der Drucker wieder eingeschaltet werden, 15 Sekunden gewartet werden, bis der Drucker über DHCP eine IP-Adresse erhalten hat, und schließlich eine Quittung mit diesen Informationen ausgegeben werden.

Da der Drucker nicht Bonjour-fähig ist, ist es möglich, die IP-Adresse durch andere Methoden zu erhalten?

Jede Hilfe wird sehr geschätzt! Ich hoffe, das ist keine wiederholte Frage, aber durch meine Suche kann ich keine Lösung finden!

UPDATE : Nach ein bisschen Nachdenken habe ich eine Pseudo-Lösung gefunden:

  1. Ermitteln Sie die aktuelle IP-Adresse des iPad über NSHost.

  2. Entfernen Sie den letzten Quadranten von der IP-Adresse

  3. Verwenden Sie die abgestreifte Zeichenfolge als Präfix, iterieren Sie 1-255 für den letzten Quadranten

  4. Bei jeder Iteration versuchen Sie, einen Port für die angegebene Adresse mit dem SDK des Druckers zu öffnen Wenn ich eine gültige Antwort bekomme, weiß ich, dass die IP ein Drucker ist Wenn nicht, schließe ich die IP aus der verfügbaren Druckerliste aus.

Bisher hat das funktioniert, ich habe für jeden Öffnungsversuch einen Timeout von 5 Millisekunden gesetzt. Aber haben festgestellt, dass dies einige Null Ergebnisse zurückgeben kann, obwohl tatsächlich ein Drucker im Netzwerk mit einer IP-Adresse zugewiesen ist.

Wenn ich zum ersten Mal ein Null-Ergebnis erhalte, sollte ich das Zeitlimit für einen zweiten Suchversuch auf 15 Millisekunden erhöhen.

    
happs 03.02.2012, 08:13
quelle

2 Antworten

2

Ihr Ansatz, das lokale / 8-Subnetz abzufragen, ist wahrscheinlich das Beste, was Sie tun können. Ich kann keine API finden, um detailliertere Informationen über die Netzwerkschnittstelle (d. H. Subnetzmaske) in iOS zu erhalten. (Obwohl die Verwendung der Subnetzmaske eine bessere Möglichkeit wäre, den zu iterierenden Bereich zu bestimmen, wenn Sie ihn erhalten könnten.)

Wie Sie gesehen haben, ist 5ms ein ziemlich enges Intervall; Nach meiner Erfahrung können 15ms für eine TCP-Verbindung über WiFi noch ziemlich eng sein. Als nächsten Schritt würde ich vorschlagen, die Abfrage des Bereichs zu parallelisieren und Ihnen dadurch zu ermöglichen, das Intervall, das Sie warten möchten, zu verlängern. Der einfachste Weg wäre wahrscheinlich, GCD zu verwenden. Sie können diesen Abrufvorgang auch im Hintergrund starten, bevor der Benutzer den Drucker explizit benötigt, was die vom Benutzer wahrgenommene Reaktionszeit Ihrer App verbessern könnte.

Alternativ können Sie die CFSocket-API verwenden, um alle diese Verbindungen (CFSocketCreate, CFSocketConnectToAddress und friends) zu öffnen und Parallelität zu erhalten, indem Sie sie alle im Hauptthread mit Callbacks / dem Runloop bedienen. Dann, wenn diese Callbacks eingehen, notieren Sie, welche Adressen auf dem gegebenen Port antworten. Wenn der Drucker TCP aus irgendeinem Grund nicht verwendet, sollte dies praktikabel sein. Sobald Sie wissen, welche Adressen überhaupt auf diesem Port antworten, können Sie über diese (hoffentlich viel kleinere) Liste, die sich mit dem Drucker-SDK selbst verbindet, iterieren. Dieser Ansatz wird Ihnen noch mehr (und weit elegantere) Parallelität geben, als eine riesige Anzahl von GCD-Threads hervorzubringen, aber es kann schwierig sein, Sie herumzukriegen, wenn Sie noch nicht mit Runloops gearbeitet haben.

Ich hoffe, das hilft.

    
ipmcc 09.02.2012, 14:53
quelle
0

Sie können die Liste schnell von 255 auf eine kleinere Zahl verkleinern, indem Sie die Broadcast-Adresse anpingen und dann in Ihren ARP-Cache schauen.

Funktioniert nur für Hosts, die auf Broadcast-Pings antworten.

    
alfwatt 27.11.2013 00:51
quelle

Tags und Links