我从https://github.com/googlecast/cast-chrome-sender-helloworld获取了cast-chrome-sender-helloworld示例应用并插入了我的APP ID。 APP ID与指向http://<server>/<path>/chromecast
的URL相关联,请注意缺少结尾的“/”或“.html”,这是我故意做的,因为它基本上是一个处理接收器的servlet。
我的发件人应用程序将请求发送到chromecast棒。在Chrome中使用调试器我可以看到启动了与我的APP ID相关联的特定应用程序的请求,并且该棒试图从上述URL加载接收应用程序。但是,我看到HTTP GET请求已执行,但它的状态是“待定”一段时间(我猜)它超时。
加载接收器应用程序的失败是否归因于列入白名单的URL没有“.html”?
** 9月27日编辑
我仍然看到Chromecast浏览器发出了正确的请求网址,但它“挂起”网络状态消息“待定”。没有请求命中我的apache服务器。如果我使用笔记本电脑在同一个wifi网络上发出相同的请求,那么我得到以下正确答案(使用CURL):
curl -vvv http://server.domain.com/path/device/chromecast
* About to connect() to server.domain.com port 80 (#0)
* Trying 192.168.1.42...
* connected
* Connected to server.domain.com (192.168.1.42) port 80 (#0)
> GET /path/device/chromecast HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.5
> Host: server.domain.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 27 Sep 2013 06:46:23 GMT
< Server: Apache-Coyote/1.1
< Content-Type: text/html;charset=ISO-8859-1
< Content-Length: 1850
< Set-Cookie: JSESSIONID=81A3A6184F014A7FBEC60C0B6375E8B0; Path=/client-portal/; HttpOnly
<
<!DOCTYPE html>
<html>
<head>
<script src="https://www.gstatic.com/cast/js/receiver/1.0/cast_receiver.js">
</script>
<script type="text/javascript">
cast.receiver.logger.setLevelValue(0);
// Initialize and start the media playing receiver
var receiver = new cast.receiver.Receiver(
'REPLACED_WITH_MY_APPID',
[cast.receiver.RemoteMedia.NAMESPACE],
"",
5);
var remoteMedia = new cast.receiver.RemoteMedia();
remoteMedia.addChannelFactory(
receiver.createChannelFactory(cast.receiver.RemoteMedia.NAMESPACE));
receiver.start();
window.addEventListener('load', function() {
var elem = document.getElementById('vid');
remoteMedia.setMediaElement(elem);
var checkStatus = function() {
var status = document.getElementById('status');
var st = remoteMedia.getStatus()['state'];
if( st == 0 || remoteMedia.getStatus()['current_time'] == 0 ) {
status.style.display = 'block';
}
else {
if( st == 1 && remoteMedia.getStatus()['current_time'] > 0 ) {
status.innerHTML = 'Paused...';
status.style.display = 'block';
}
else {
status.innerHTML = remoteMedia.getStatus()['current_time'];
status.style.display = 'none';
elem.style.display = 'block';
}
}
}
setInterval(checkStatus, 1000);
});
</script>
<title>Media Player App</title>
</head>
<body>
<video id="vid"
style="position:absolute;top:0;left:0;height:100%;width:100%"></video>
<div id="status" style="display:none; font-size:300%; position:absolute;top:40%;left:40%;">
<img src="/images/chrome_loading.gif" width="60%">
</div>
</body>
* Connection #0 to host server.domain.com left intact
</html>* Closing connection #0f
在重新加载“脑冻结”屏幕之前,调试器只显示以下内容:
答案 0 :(得分:2)
原来Chromecast棒不使用本地wifi路由器DNS,而是依赖外部路由器。我的问题是我联系的主机在我的本地局域网上有一个不同的IP地址。 (感谢Google提供调试帮助。)
关于https://developers.google.com/cast/whitelisting的文档声明可以将NAT地址列入白名单,但我不知道这是如何工作的,因为外部DNS通常不知道这一点:
服务器上接收器应用程序位置的两(2)个URL,通常一个用于QA,一个用于生产。 Receiver是一个HTML5网页,用于在Chromecast设备上托管您的内容。良好的接收者URL通常看起来像https://website.com/rcvr/myreceiver.html或https://website.com/qarcvr/myreceiver.html(您的接收者可以使用内部(NAT)IP地址,但不能使用本地主机。它们很少是顶级域名。< / p>
我通过使用pagekite.net解决了这个问题,这使我可以通过外部DNS访问公共地址,并仍然可以访问我的本地开发计算机Web服务器。