在没有bonjour的wifi网络iOS sdk上列出所有设备的IP地址?

时间:2012-02-03 08:13:53

标签: objective-c ios

我正在尝试获取LAN网络上所有IP的列表。原因是我正在编写一个使用STAR TSP100LAN收据打印机的应用程序。

获取打印机IP地址的过程对最终用户来说非常麻烦。它涉及关闭打印机,按住进纸按钮,重新打开打印机,等待15秒钟让打印机通过DHCP获取IP地址,然后最终用这些信息随便吐出收据。

看到打印机未启用Bonjour,是否可以通过其他方法获取IP地址?

非常感谢任何帮助!我希望这不是一个重复的问题,但通过我的搜索我似乎无法找到解决方案!

UPDATE :经过一番思考后,我想出了一个伪解决方案:

  1. 通过NSHost确定iPad当前的IPAddress。

  2. 从IPAddress

  3. 中删除最后一个象限
  4. 使用剥离的字符串作为前缀,为最后一个象限迭代1-255

  5. 每次迭代,尝试使用打印机的sdk打开指向给定地址的端口 如果我得到有效的回复,我知道IP是打印机 如果不是,我从可用的打印机列表中排除IP。
  6. 到目前为止,这一直在工作,我为每个端口打开尝试设置了5毫秒的超时。但是已经发现这可以返回一些空结果,尽管网络上实际上有一台分配了IP地址的打印机。

    也许如果我得到一个空结果,我第一次将超时时间增加到15毫秒,以便第二次尝试搜索。

2 个答案:

答案 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的主机。