私はSonosスピーカーを制御するWebクライアントを作成しようとしています。スピーカーはWi-Fiに接続し、さまざまなストリーミングサービスのメディアサーバーとして機能します。
UPnPアクションに対するSOAPポストリクエストによって動作します。私はどのSOAP要求が何をするのかを理解しましたが、Webブラウザから制御するためのスクリプトを作成するのに問題があります。サーバーからHTMLとJavascriptをホストすることはできますが、ローカルネットワーク経由でSOAPリクエストを送信することはできますか?
私の学校のWebサーバは、Apacheを使用し、私は無駄に、私のスクリプト/ Webページが置かれているディレクトリの.htaccess
ファイルに次の行を追加しようとしました:
Header set Access-Control-Allow-Origin "*"
方法はありますユーザーはWebサイトにアクセスして(サードパーティのサーバーによってホストされているにもかかわらず)、ターゲットデバイスのIPアドレスを入力し、ユーザーのIPからターゲットデバイスに要求を送信することができますか?
もしそうでなければ、サードパーティのサーバーが関与しないように、このスクリプトをブラウザ上でローカルに実行できますか?それが効くだろうか?もしそうなら、これらのことをどうやってやっていくのですか?
<html>
<head>
<title>SOAP JavaScript Client Test</title>
<script type="text/javascript">
function play() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('POST', 'http://192.168.1.197:1400/', true);
// build SOAP play request
var play =
'POST /MediaRenderer/AVTransport/Control HTTP/1.1' +
'ORIGIN: '
'HOST: 192.168.1.197:1400' +
'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Play"' +
'CONTENT-TYPE: text/xml ; charset="utf-8"' +
'Content-Length: 356' +
'<?xml version="1.0" encoding="utf-8"?>' +
'<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
'<s:Body>' +
'<u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">' +
'<InstanceID>0</InstanceID>' +
'<Speed>1</Speed>' +
'</u:Play>' +
'</s:Body>' +
'</s:Envelope>';
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
alert('done. use firebug/console to see network response');
}
}
}
// Send the POST request
xmlhttp.setRequestHeader('Content-Type', 'text/xml');
xmlhttp.send(play);
// send request
// ...
}
</script>
</head>
<body>
<form name="Demo" action="" method="post">
<div>
<input type="button" value="Play" onclick="play();" />
</div>
</form>
</body>
</html>
私はそれを実行しようとすると、私は、コンソールから次のエラーを取得する:
XMLHttpRequestがhttp://192.168.1.197:1400/をロードすることはできません
は、ここで私がこれまで持っているコードです。 プリフライト要求に応答してアクセス制御チェックを通過しません。いいえ 要求された リソースに 'Access-Control-Allow-Origin'ヘッダーが存在します。 Origin 'http://cs12students.dce.harvard.edu'は、アクセスが許可されていないため、 です。
私の考えは、ユーザーが自分の「デバイスのIP:ポート」を入力することです(つまり、どちらかの可能性だ場合、それはセキュリティ侵害のいくつかの種類の可能性のようなわからない、と思われる)、または何らかの形で彼らのネットワーク上でそれを発見し、割り当てますその変数を変数に追加してから、別のアクションのために各スクリプトにプラグインします。