2014-01-21 77 views
2

我正在爲封閉的業務環境編寫Android Kiosk應用程序。我的設備通過以太網連接到本地Web服務器以顯示網頁。
現在我的問題是,在晚上,服務器將被關閉,如果發生這種情況,我的DHCP服務器也關閉。如果我的Android在這種情況下啓動,它將不會獲得IP地址。我的Kiosk應用程序一直嘗試連接到服務器(此時,我不關心它是否處於節電模式或不處於節能模式)。
爲了使它更復雜,它不只是一個網站,我的應用程序將運行,所以使用服務器的靜態IP地址將無法正常工作。我設法得到一個DHCP和DNS服務器,在那裏我可以定義我的服務器主機名,這在所有站點都是一樣的。 但是,Android有一個解決不完全限定的域名(Link)的錯誤,所以我的應用程序不能直接連接到主機名(例如http://hostname/index.html),但必須手動解析主機名的IP地址,然後連接到IP地址。作爲我能找到的唯一解決方案是dnsjava(Link),我用它來解析IP。
Android DNS查找和更改DHCP

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緩存?!但如何以編程方式做到這一點?

順便說一句:我測試啓動我的應用程序和Android時,DHCP/DNS服務器聯機,它將連接和工作,當我關掉服務器,我的Android總是回答這個IP地址的DNS查詢,即使我不再也沒有本地IP了。
對我來說,似乎Android將「設置DHCP」更改爲固定IP並返回時會執行刷新操作。
我希望有人能幫助!

回答

0

你需要踢解析:

runShellCommand("ndc resolver setifdns eth0 \"\" 8.8.8.8 8.8.4.4"); 
runShellCommand("ndc resolver setdefaultif eth0");