我正在尝试获取LAN网络上所有IP的列表。原因是我正在编写一个使用STAR TSP100LAN收据打印机的应用程序。
获取打印机IP地址的过程对最终用户来说非常麻烦。它涉及关闭打印机,按住进纸按钮,重新打开打印机,等待15秒钟让打印机通过DHCP获取IP地址,然后最终用这些信息随便吐出收据。
看到打印机未启用Bonjour,是否可以通过其他方法获取IP地址?
非常感谢任何帮助!我希望这不是一个重复的问题,但通过我的搜索我似乎无法找到解决方案!
UPDATE :经过一番思考后,我想出了一个伪解决方案:
通过NSHost确定iPad当前的IPAddress。
从IPAddress
使用剥离的字符串作为前缀,为最后一个象限迭代1-255
到目前为止,这一直在工作,我为每个端口打开尝试设置了5毫秒的超时。但是已经发现这可以返回一些空结果,尽管网络上实际上有一台分配了IP地址的打印机。
也许如果我得到一个空结果,我第一次将超时时间增加到15毫秒,以便第二次尝试搜索。
答案 0 :(得分:2)
您轮询本地/ 8子网的方法可能是您可以做的最好的方法。我找不到任何API来获取有关iOS中网络接口(即子网掩码)的更多详细信息。 (尽管使用子网掩码是确定迭代范围的更正确的方法,如果可以的话。)
正如您所见,5毫秒是一个相当紧凑的间隔;根据我的经验,对于通过WiFi的TCP连接,15ms仍然非常紧张。作为下一步,我建议并行化范围的轮询,从而使您能够延长您愿意等待的间隔。最简单的方法可能是使用GCD。您还可以在用户明确需要打印机之前在后台启动此轮询过程,这可能会提高用户感知应用程序的响应能力。
或者,您可以使用CFSocket API打开所有这些连接(CFSocketCreate,CFSocketConnectToAddress和friends),并通过使用回调/ runloop在主线程上为所有连接提供服务来获得并行性。然后,当这些回调进入时,请记下给定端口上的哪些地址应答。除非打印机由于某种原因没有使用TCP,否则这应该是可行的。一旦你知道哪个地址在该端口上应答,你就可以迭代连接打印机SDK本身的那个(希望小得多)列表。这种方法比产生大量的GCD线程更能提供(并且方式更优雅)的并行性,但是如果你以前没有使用过runloops,那么很难解决这个问题。 / p>
希望有所帮助。
答案 1 :(得分:0)
您可以通过ping广播地址然后查看您的arp缓存,快速将列表从255减少到较小的数字。
仅适用于响应广播ping的主机。