簡體   English   中英

列出沒有bonjour的wifi網絡iOS SDK上所有設備的IP地址?

[英]List all devices' IP Addresses on wifi network iOS sdk without bonjour?

我正在嘗試獲取LAN網絡上所有IP的列表。 原因是我正在編寫一個使用STAR TSP100LAN收據打印機的應用程序。

對於最終用戶而言,獲取打印機IP地址的過程非常繁瑣。 它包括關閉打印機,按住進紙按鈕,重新打開打印機,等待15秒鍾,以便打印機通過DHCP獲得IP地址,然后最終將上面包含此信息的收據吐出來。

好像打印機沒有啟用Bonjour,是否可以通過其他方法獲取IP地址?

任何幫助深表感謝! 我希望這不是一個重復的問題,但是通過我的搜索,我似乎找不到解決方案!

更新 :好一想,我想出了一個偽解決方案:

  1. 通過NSHost確定iPad的當前IP地址。

  2. 從IPAddress剝離最后一個象限

  3. 使用剝離的字符串作為前綴,對最后一個象限重復1-255

  4. 每次迭代時,嘗試使用打印機的sdk打開到給定地址的端口。如果得到有效的響應,則表明該IP是一台打印機。如果不是,則從可用打印機列表中排除該IP。

到目前為止,這一直有效,我為每個端口打開嘗試設置了5毫秒的超時時間。 但是已經發現,盡管網絡上確實有一個分配了IP地址的打印機,但是這可能會返回空結果。

也許如果我第一次得到空結果,我應該將超時時間增加到15毫秒,以便進行第二次搜索。

您輪詢本地/ 8子網的方法可能是最好的方法。 我找不到任何API可以獲取有關iOS中網絡接口(即子網掩碼)的更多詳細信息。 (盡管可以使用子網掩碼來確定要迭代的范圍,這是更正確的方法。)

如您所見,5ms是一個非常緊密的間隔; 以我的經驗,對於通過WiFi的TCP連接,15ms仍然很緊。 下一步,我建議並行化范圍的輪詢,從而使您能夠延長願意等待的間隔。 最簡單的方法可能是使用GCD。 您還可以在用戶明確需要打印機之前在后台啟動此輪詢過程,這可能會改善用戶感知的應用程序響應能力。

或者,您可以使用CFSocket API打開所有這些連接(CFSocketCreate,CFSocketConnectToAddress和friends),並通過使用回調/ runloop在主線程上為它們提供服務來獲取並行性。 然后,當這些回調進入時,記下在給定端口上應答的地址。 除非打印機由於某種原因未使用TCP,否則這應該是可行的。 一旦知道哪個地址可以在該端口上應答,就可以遍歷與打印機SDK本身連接的(希望是更小的)列表。 這種方法會給你更多的(和方式更優雅)的並行比產卵GCD線程的數量巨大,但是如果你不runloops工作之前可能很難得到周圍你的頭。

希望能有所幫助。

您可以通過ping廣播地址然后查看您的arp緩存來快速將列表從255減少到較小的數目。

僅適用於響應廣播ping的主機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM