Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将网站重定向到未知的内部地址_Javascript_Php_Android_Ios_Redirect - Fatal编程技术网

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

Javascript 将网站重定向到未知的内部地址,javascript,php,android,ios,redirect,Javascript,Php,Android,Ios,Redirect,我正在做的一点背景知识。我有一个连接到wifi的自制智能恒温器。该设备拥有一个用于控制一切的网站。我的主要抱怨是,通过主机名访问设备是多么不可靠(特别是在将成为主控制器的android系统中)。我试图找到一种在不知道IP地址的情况下可靠访问设备的方法 我正在考虑两种选择,但是我想知道是否有更好的方法,或者我的想法可能会失败 外部网站 wifi配置完成后,设备打开并将其内部IP发送到外部服务器 外部服务器获取请求并记录外部IP和关联的内部IP 用户访问外部网站:my.automator.com 网

我正在做的一点背景知识。我有一个连接到wifi的自制智能恒温器。该设备拥有一个用于控制一切的网站。我的主要抱怨是,通过主机名访问设备是多么不可靠(特别是在将成为主控制器的android系统中)。我试图找到一种在不知道IP地址的情况下可靠访问设备的方法

我正在考虑两种选择,但是我想知道是否有更好的方法,或者我的想法可能会失败

外部网站

  • wifi配置完成后,设备打开并将其内部IP发送到外部服务器
  • 外部服务器获取请求并记录外部IP和关联的内部IP
  • 用户访问外部网站:my.automator.com
  • 网站根据请求查找外部IP,确定内部IP
  • 网站将页面重定向到内部IP
  • 因此,转到my.automator.com将重定向到内部IP

    缺点:

    • 需要上网
    • 具有相同外部ip的多个设备
    Android/iOS应用程序

  • 发布应用程序
  • 应用程序扫描设备的当前子网
  • 向每个IP发送请求:
  • 收到预期响应后,启动浏览器至该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;//我们到此结束
    }
    }
    }
    /*
    *向服务器发送请求,查看它是否处于活动状态以及我们正在查找的内容