将网站重定向到未知的内部地址

时间:2015-02-19 14:52:16

标签: javascript php android ios redirect

我正在做的一些背景知识。我有一个家庭酿造智能恒温器连接到我的无线网络。该设备托管一个用于控制所有内容的网站。我的主要抱怨是通过主机名访问设备是多么不可靠(特别是在android中它将是主控制器)。我试图在不知道IP地址的情况下找到可靠访问设备的方法。

我想到了两个选项,但想知道是否有更好的方法可以做到这一点,或者我的想法可能会出现其他可能的挫折。

外部网站

  1. 配置wifi后,设备开启并将其内部IP发送到外部服务器
  2. 外部服务器获取请求并记录外部IP和关联的内部IP
  3. 用户访问外部网站:my.thermostat.com
  4. 网站从请求中查找外部IP,确定内部IP
  5. 网站将页面重定向到内部IP
  6. 因此,访问my.thermostat.com将重定向到内部IP。

    下行:

    • 需要互联网访问
    • 具有相同外部IP的多个设备?

    Android / iOS应用

    1. 启动应用
    2. App扫描设备的当前子网
    3. 向每个IP发送请求:http://x.x.x.x/isThermostat.html
    4. 收到预期响应时,启动浏览器到该IP
    5. 下行:

      • 需要应用访问控制面板
      • 如果您想通过计算机访问该怎么办?依靠主机名?

      应用程序路线似乎是最不复杂的,但我喜欢能够使用任何设备访问恒温器的想法,所以它在计算机上仍然有点棘手。

      任何想法都将不胜感激!

      修改

      提供有关硬件本身的更多信息,它是一个arduino yun,可以通过以太网或wifi连接。我想远离静态配置或设置静态DHCP租约。我想把它们中的几个用于给朋友和诸如此类的东西,所以用户设置越少越好。

3 个答案:

答案 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;
}