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