我可以通过编程方式检测当前WiFi网络上是否有任何Chromecast设备?

时间:2014-04-22 13:24:06

标签: java android chromecast

是否可以检测当前WiFi网络上是否有任何Chromecast设备。我已经看到有一个Cast SDK,但我找不到有关搜索设备的任何信息。之前从未使用过这个SDK,我可能忽略了它。

5 个答案:

答案 0 :(得分:5)

使用类型为_googlecast._tcp

的avahi可以发现Chromecast设备
$ avahi-browse -r _googlecast._tcp
+   eth0 IPv4 Living Room                                   _googlecast._tcp     local
=   eth0 IPv4 Living Room                                   _googlecast._tcp     local
   hostname = [Living\032Room.local]
   address = [192.168.1.100]
   port = [8009]
   txt = ["st=0" "fn=Living Room" "ca=5" "ic=/setup/icon.png" "md=Chromecast" "ve=02" "id=c832a30b81ab84a706c82745438fcd64"]

答案 1 :(得分:3)

您可以在不使用强制转换按钮的情况下执行发现;你需要使用来自v7支持库的媒体路由器(它也需要v7 appcompat支持),然后从你的代码中获取媒体路由器的实例,定义一个选择器(这基本上是一个过滤器,可能缩小你的设备范围)感兴趣)然后添加一个回调来开始发现。在发现设备(异步)时,将调用您的回调。请看一下这个示例project,特别是这个class,它可以完全满足您的需求。

答案 2 :(得分:2)

您可以在本地网络中使用SSDP(简单服务发现协议),其ST(服务类型)为:

urn:dial-multiscreen-org:service:dial:1

您的SSDP查询应如下所示:

M-SEARCH * HTTP/1.1\r\n
Host: 239.255.255.250:1900\r\n
MAN: "ssdp:discover"\r\n
MX: 3\r\n
ST: urn:dial-multiscreen-org:service:dial:1\r\n\r\n

您将获得支持这些服务类型的所有设备(IP和端口)的列表(如Chromecast一样)。然后你可以从这个IP:8008中提取一个xml文件来检查它是否真的是一个Chromecast设备:

http://IP:8008/ssdp/device-desc.xml

响应将如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <specVersion>
      <major>1</major>
      <minor>0</minor>
   </specVersion>
   <URLBase>http://192.168.0.0:8008</URLBase>
   <device>
      <deviceType>urn:dial-multiscreen-org:device:dial:1</deviceType>
      <friendlyName>Chromecast</friendlyName>
      <manufacturer>Google Inc.</manufacturer>
      <modelName>Eureka Dongle</modelName>
      <UDN>uuid:3c7f2a1e-dbd2-f94d-b456-816555a9d1f9</UDN>
      <iconList>
         <icon>
            <mimetype>image/png</mimetype>
            <width>98</width>
            <height>55</height>
            <depth>32</depth>
            <url>/setup/icon.png</url>
         </icon>
      </iconList>
      <serviceList>
         <service>
            <serviceType>urn:dial-multiscreen-org:service:dial:1</serviceType>
            <serviceId>urn:dial-multiscreen-org:serviceId:dial</serviceId>
            <controlURL>/ssdp/notfound</controlURL>
            <eventSubURL>/ssdp/notfound</eventSubURL>
            <SCPDURL>/ssdp/notfound</SCPDURL>
         </service>
      </serviceList>
   </device>
</root>

有关它的更多信息: http://wolfpaulus.com/jounal/mac/chromecasting/

如果您想要将内容流式传输到Chromecast,可以致电:

获取有关ChromeCast应用的信息。

http://IP:8008/apps/ChromeCast

答案 3 :(得分:0)

recommended way of Google之后,您无需扫描Chromecast设备即可提供Android应用内容。您可以通过Activity扩展投标按钮,然后在 onCreateOptionsMenu()中添加ActionBarActivity选项,并使用

添加投放按钮
ActionBar

作为行动。

Here您可以找到有关如何发送到app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider" 棒的完整示例。如果您因任何原因需要手动扫描,可以使用Chromecast Android API,引用文档:

  

可以使用Android MediaRouter执行演员表设备发现   Android支持库中的API,兼容性   Android 2.1。

答案 4 :(得分:0)

一个非常简单的解决方案是使用class FeatureField(serializers.CharField): """ Accepts text in the writes and looks up the correct feature for the reads. """ def get_attribute(self, obj): # We pass the object instance onto `to_representation`, not just the field attribute. return obj def to_representation(self, obj): # If the root is a ListSerializer, retrieve the right Result instance using the `_instance` attribute. try: if isinstance(self.root, serializers.ListSerializer): search_result = self.root.child._instance else: search_result = self.root.instance feature = Feature.objects.get(route=obj.id, search_result=search_result) feature = feature.pickup_instructions except Feature.DoesNotExist: feature = None return feature 。在这里我的实施:

com.youview.tinydnssd.DiscoverResolver

DiscoverResolver resolver = new DiscoverResolver(ctx, "_googlecast._tcp.", new DiscoverResolverHandler()); 中,您可以处理结果。