我正在做的一些背景知识。我有一个家庭酿造智能恒温器连接到我的无线网络。该设备托管一个用于控制所有内容的网站。我的主要抱怨是通过主机名访问设备是多么不可靠(特别是在android中它将是主控制器)。我试图在不知道IP地址的情况下找到可靠访问设备的方法。
我想到了两个选项,但想知道是否有更好的方法可以做到这一点,或者我的想法可能会出现其他可能的挫折。
外部网站
因此,访问my.thermostat.com将重定向到内部IP。
下行:
Android / iOS应用
下行:
应用程序路线似乎是最不复杂的,但我喜欢能够使用任何设备访问恒温器的想法,所以它在计算机上仍然有点棘手。
任何想法都将不胜感激!
修改
提供有关硬件本身的更多信息,它是一个arduino yun,可以通过以太网或wifi连接。我想远离静态配置或设置静态DHCP租约。我想把它们中的几个用于给朋友和诸如此类的东西,所以用户设置越少越好。
答案 0 :(得分:0)
您能提供静态内部IP吗?
通常在您的家庭路由器中,您可以选择为给定的MAC地址提供静态IP,或者您可以设置设置静态IP的设备。
我认为你的解决方案对于简单的事情来说都是两个复杂的。
答案 1 :(得分:0)
您应该考虑设备的静态IP,在设备上禁用DHCP以及在路由器中配置引用设备MAC地址的静态IP。这应该避免更改主机名时出现问题。基本上,它允许您使用一致的IP来引用LAN中的地址。
您还没有确切地提到它是什么设备,因此我无法建议明确的配置设置,但您应该能够向Google寻求答案。你接下来要做什么取决于你需要达到的目标。
如果您需要从WAN(Internet)访问设备,则需要动态DNS服务,如https://duckdns.org/why.jsp
DDNS是一种托管服务,可将请求转发到子域,例如:thermostat.duckdns.org到您的WAN IP(您的路由器/调制解调器)。您在网络中安装了一个帮助应用程序,让DDNS每隔5分钟就知道您的WAN IP是什么,因此让它指向您。
如果您访问:thermostat.duckdns.org,它将转发您的WAN IP,然后您的路由器决定如何处理请求。您将要设置路由器以向前端口(用于Web服务器的端口80,例如apache)指向您的恒温器设备的内部静态IP。然后,您的设备将在网站上投放。
此方法允许您在可从WAN(Internet)访问的LAN中的计算机或设备上运行Web服务器。
答案 2 :(得分:0)
所以我最终使用Android应用程序扫描设备的本地子网。我在服务器上有一个名为knockknock.html的html文件,其中只有文本" HELLO"。对于任何有兴趣的人来说,这是我使用的代码的第一次演绎:
/*
* Get the IP and subnet info and start scanning the local subnet
*/
void findServer() {
WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
if (dhcp == null) {
Log.d(TAG, "No DHCPInfo on WiFi side.");
}
//Get the string verison of the IP/subnet from the int given by WifiManager
final String ip = intToIp(dhcp.ipAddress);
final String mask = intToIp(dhcp.netmask);
//Start the scanner on a separate thread from the UI
Thread thread = new Thread() {
@Override
public void run() {
serverScanner(ip, mask);
}
};
thread.start();
}
/*
* Convert an integer to a human readable format
*/
String intToIp(int i) {
return ( i & 0xFF) + "." +
((i >> 8 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
((i >> 24 ) & 0xFF ) ;
}
/*
* Scan the given subnet for the server
*/
void serverScanner(String ip, String netmask) {
//Get the first part of the IP
//TODO: Add support for various subnet masks
String iIPv4 = ip.substring(0, ip.lastIndexOf("."));
iIPv4 += ".";
Log.v(TAG, "Current IP Structure: " + iIPv4);
// Loop to scan each address on the local subnet
for (int i = 1; i < 255; i++) {
//Check to see if the server exists
if (checkServer(iIPv4 + i)) {
//It does exist, so let's set the variable and preferences
mServerIP = iIPv4 + i;
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("LastServerIP", mServerIP);
editor.commit();
return; //And we're done here
}
}
}
/*
* Send a request to the server and see if it's alive and what we're looking for
*/
boolean checkServer(String ip) {
BufferedReader inputStream = null;
try {
HttpGet httpget = new HttpGet("http://" + ip + "/knockknock.html");
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 100);
HttpConnectionParams.setSoTimeout(httpParameters, 100);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpResponse response;
response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
String result = convertStreamToString(instream);
instream.close();
if (result.equals("HELLO\n")) {
return true;
}
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
//No response or not the response we're looking for, so return false
return false;
}