正在向 Panasonic IP cam 发送 "GET" 请求以控制 PTZ 移动 - 被 CORS 阻止

Sending "GET" requests to Panasonic IP cam to control PTZ movement - blocked by CORS

请原谅我的无知,我是java、HTML和网络开发的新手。

我正在尝试构建一个网络应用程序来控制 IP 摄像机 (Panasonic AW-HE50) 的 PTZ 控件。我可以按照规范 sheet 通过浏览器向它发送基本命令: https://eww.pass.panasonic.co.jp/pro-av/support/content/guide/DEF/HE50_120_IP/HDIntegratedCamera_InterfaceSpecifications-V1.05E.pdf

例如,我可以通过在浏览器中输入 http://172.16.14.90/cgi-bin/aw_ptz?cmd=%23P99&res=1 使其开始旋转。

现在我只是想把它翻译成 Java,这样当你按下网页上的按钮时,它会发出 "GET" 请求将相机移动到某个特定位置方向.

我目前的问题代码如下所示:

$(document).ready(function(){
  $("button").click(function(){
    $.get(camURL + "T99&res=1", function(data, status){
      alert("Data: " + data + "\nStatus: " + status);
    });
  });
});

但是消息没有到达摄像头,Chrome 控制台显示:

"Access to XMLHttpRequest at 'http://172.16.14.90/cgi-bin/aw_ptz?cmd=%23T99&res=1' from origin 'http://172.16.14.12' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource."

我对此做了一些研究,但解决方案似乎与服务器更相关。据我所知,我不能允许访问域,因为它是 IP 摄像头,而不是服务器。此外,我在同一个本地网络上托管了我的 HTML 页面以解决此问题,但它没有用。我很惊讶它没有被识别为同一个域。我也不确定为什么浏览器能够发出此获取请求,但 Java 脚本却不能。

在此先感谢您的帮助,再次为我的无知感到抱歉。

安迪

这是一个典型的同源策略问题,有两种解决方法:

  • 破解 IP 摄像机并在那里托管 HTML 页面。
  • 将 HTTP-request-to-IP-camera 代码从网页移动到 Java 服务器,从而避免同源策略限制。

通常情况下,第二种方法更好,尤其是当您可以将Java服务器与网络摄像机放在同一局域网中时。以下是一些详细说明:

  1. 在 Java 服务器中托管 HTML 页面和 Java 脚本代码(我相信您已经完成了)。
  2. 当用户点击网页上的按钮时,发送Ajax请求到Java服务器,而不是网络摄像机。因此,避免同源问题。
  3. 当Java服务器收到上述HTTP请求后,解释用户操作,并向网络摄像机发送相应的HTTP请求。由于这是一个纯服务器端的 HTTP 请求,它不遵循同源策略。
  4. Java服务器收到网络摄像机的响应后,return向浏览器响应。

顺便说一句,在上面的场景中,Java 服务器充当了代理的角色。

对于您的一些问题:

"I have done some research in to this, but the solutions seem to be more relevant to servers."

-- 是的,CORS策略是一种浏览器安全保护功能。要解决此问题,您需要在服务器中执行一些操作。

"I hosted my HTML page on the same local network to get around this but it didn't work. I'm surprised that it isn't recognised as the same domain."

-- 要使 2 URL 成为同一域(从 CORS 的角度来看),以下 URL 部分应该相同:协议、主机名和端口。将 2 台机器移动到同一个本地网络不满足浏览器的同源策略。

"I am also unsure as to why the browser is able to make this get request but the Java script is not."

-- 当您在浏览器的地址栏中输入网络摄像机 URL 并按 return 时,一个简单的普通 HTTP GET 请求将发送到摄像机,不应用同源策略。但是,当您从 Java 脚本代码发送 HTTP 请求时,出于安全原因,浏览器将检查 CORS 设置。