我正在为封闭的商业环境编写Android Kiosk应用程序。我的设备通过以太网连接到本地Web服务器以显示网页
现在问题是,在夜晚,服务器将被关闭,如果发生这种情况,我的DHCP服务器也会关闭。如果我的Android在这种情况下启动,它将无法获得IP地址。我的Kiosk应用程序尝试一直连接到服务器(此时我不关心它是否存在,当它处于省电模式时)。
为了使它更复杂,它不仅仅是一个站点,我的应用程序将继续运行,因此使用服务器的静态IP地址将无法正常工作。我设法得到一个DHCP和DNS服务器,我可以在其中定义我的服务器主机名,这在所有站点都是相同的。
但是,Android有一个错误解决不完全限定的域名(Link),所以我的应用程序不能直接连接到主机名(例如http://hostname/index.html
),但必须解析的IP地址手动命名主机名,然后连接到该IP地址。作为我能找到的唯一解决方案是dnsjava(Link),我用它来解析IP。
import org.xbill.DNS.*;
InetAddress addr = Address.getByName("hostname");
ipAddress = addr.getHostAddress();
这实际上有效,但这是事情:
如果Android和我启动没有IP,它当然无法解析主机名。但是,如果我的DHCP / DNS服务器启动,设备将无法获得IP地址,除非我告诉他这样做:
runShellCommand("killall dhcpcd");
runShellCommand("ifconfig eth0 192.168.99.99");
runShellCommand("ifconfig eth0 0.0.0.0");
runShellCommand("dhcpcd eth0");
runShellCommand将...运行一个shell命令并且实际上运行良好。
无论如何,这将从DHCP获得一个新的IP地址(由DHCP服务器的日志文件证明),但主机名将无法解析。
重新启动应用程序将无法正常工作,即使使用其他应用程序进行测试(Ping & DNS)也无效。
唯一可行的方法是在设置 - >以太网中我取消点击DHCP并再次点击它。这会以某种方式刷新DNS缓存?!但是如何以编程方式做到这一点?
BTW:当DHCP / DNS服务器在线时,我测试启动我的App和Android,它将连接并工作,当我关闭服务器时,我的Android总是使用这个IP地址回答DNS查询,即使我不知道t了本地知识产权。答案 0 :(得分:0)
你需要踢解析器:
runShellCommand("ndc resolver setifdns eth0 \"\" 8.8.8.8 8.8.4.4");
runShellCommand("ndc resolver setdefaultif eth0");