Javascript 将网站重定向到未知的内部地址
我正在做的一点背景知识。我有一个连接到wifi的自制智能恒温器。该设备拥有一个用于控制一切的网站。我的主要抱怨是,通过主机名访问设备是多么不可靠(特别是在将成为主控制器的android系统中)。我试图找到一种在不知道IP地址的情况下可靠访问设备的方法 我正在考虑两种选择,但是我想知道是否有更好的方法,或者我的想法可能会失败 外部网站Javascript 将网站重定向到未知的内部地址,javascript,php,android,ios,redirect,Javascript,Php,Android,Ios,Redirect,我正在做的一点背景知识。我有一个连接到wifi的自制智能恒温器。该设备拥有一个用于控制一切的网站。我的主要抱怨是,通过主机名访问设备是多么不可靠(特别是在将成为主控制器的android系统中)。我试图找到一种在不知道IP地址的情况下可靠访问设备的方法 我正在考虑两种选择,但是我想知道是否有更好的方法,或者我的想法可能会失败 外部网站 wifi配置完成后,设备打开并将其内部IP发送到外部服务器 外部服务器获取请求并记录外部IP和关联的内部IP 用户访问外部网站:my.automator.com 网
- 需要上网
- 具有相同外部ip的多个设备
- 需要应用程序访问控制面板
- 如果您想通过计算机访问,该怎么办?依赖主机名
这是一款arduino云,可以通过以太网或wifi连接,提供更多关于硬件本身的信息。我希望远离静态配置或设置静态DHCP租约。我想制作两个这样的东西送给朋友什么的,这样用户设置越少越好。你能提供一个静态的内部IP吗 通常,在家庭路由器中,您可以选择为给定的MAC地址提供静态IP,或者您可以选择设备的定义来设置静态IP
我认为两个解决方案都是简单的两个复杂的。
< P>你应该考虑设备的静态IP,禁用设备上的DHCP,并在路由器中配置一个静态IP,指的是设备的MAC硬件地址。这样可以避免更改主机名时出现问题。基本上,它将允许您使用一致的IP引用LAN内的地址 你还没有提到它到底是什么设备,所以我不能建议一个明确的配置设置,但你应该能够谷歌的答案。你下一步做什么取决于你需要实现什么 如果需要从WAN(Internet)访问设备,则需要动态DNS服务,如 DDNS是一种托管服务,它将请求转发到子域,如:automator.duckdns.org到您的WAN IP(路由器/调制解调器)。您在网络中安装了一个助手应用程序,让DDN每隔5分钟就知道您的WAN IP是什么,从而使它始终指向您 如果您访问:automator.duckdns.org,它将把您转发到您的WAN IP,然后您的路由器将从该点决定如何处理请求。您需要将路由器设置为端口转发(对于apache之类的web服务器,端口80),该端口指向恒温器设备的内部静态IP。然后,您的设备为网站服务此方法允许您在可从WAN(Internet)访问的LAN内的计算机或设备上运行web服务器。因此,我最终使用了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;
}
/*
*获取IP和子网信息并开始扫描本地子网
*/
void findServer(){
WifiManager wifi=(WifiManager)this.getSystemService(Context.wifi\u SERVICE);
DhcpInfo dhcp=wifi.getDhcpInfo();
如果(dhcp==null){
Log.d(标签“WiFi端无DHCPInfo”);
}
//从WifiManager给出的int中获取IP/子网的字符串verison
最后一个字符串ip=intToIp(dhcp.ipAddress);
最终字符串掩码=intToIp(dhcp.netmask);
//在UI的单独线程上启动扫描仪
线程线程=新线程(){
@凌驾
公开募捐{
服务器扫描程序(ip、掩码);
}
};
thread.start();
}
/*
*将整数转换为人类可读的格式
*/
字符串intToIp(inti){
返回(i&0xFF)+“+
((i>>8)和0xFF)+”+
((i>>16)和0xFF)+”+
((i>>24)和0xFF);
}
/*
*扫描服务器的给定子网
*/
无效服务器扫描程序(字符串ip、字符串网络掩码){
//获取IP的第一部分
//TODO:添加对各种子网掩码的支持
字符串iIPv4=ip.substring(0,ip.lastIndexOf(“.”);
iIPv4+=”;
Log.v(标签,“当前IP结构:”+iIPv4);
//循环以扫描本地子网上的每个地址
对于(int i=1;i<255;i++){
//检查服务器是否存在
if(检查服务器(iIPv4+i)){
//它确实存在,所以让我们设置变量和首选项
mServerIP=iIPv4+i;
SharedReferences设置=GetSharedReferences(首选项名称,0);
SharedReferences.Editor=settings.edit();
putString(“LastServerIP”,mServerIP);
commit();
return;//我们到此结束
}
}
}
/*
*向服务器发送请求,查看它是否处于活动状态以及我们正在查找的内容