2011-07-01 21 views
13

Tôi có một ứng dụng Android nguyên mẫu đang lắng nghe các gói đa phương tiện để khách hàng 'khám phá' liên lạc với. Ổ cắm được thiết lập tương tự như sau:Hỗ trợ đa phương tiện trên Android ở chế độ Hotspot/Tethering

InetAddress group = InetAddress.getByName("228.1.2.3"); 
MulticastSocket s = new MulticastSocket(4000); 
s.joinGroup(group); 

Điều này hoạt động rất tốt khi tất cả các thiết bị được kết nối qua WiFi. Tôi muốn hỗ trợ điều này với điện thoại hoạt động như một điểm phát sóng di động. Tuy nhiên, trong khi tất cả các thiết bị của tôi xuất hiện để kết nối với điểm phát sóng chính xác thì tôi không còn nhận được dữ liệu multicast nữa. Tôi tự hỏi nếu có những hạn chế không cho phép loại truyền thông này trong chế độ hotspot, hoặc nếu có bất kỳ cấu hình mạng bổ sung cần thiết để kích hoạt tính năng này? Tôi đã thử điều này trên một vài thiết bị khác nhau chạy Gingerbread và Froyo không có may mắn.

+1

Tôi rất muốn nghe nếu bạn đã cố gắng giải quyết vấn đề này. Cách tôi hiểu nó là bạn cần một multicastlock để có được multicast hoạt động. Và cách duy nhất để thu hút một là mặc dù wifimanager.Thật không may với thiết bị được thiết lập như một điểm phát sóng, có vẻ như khóa multicast được tạo trên giao diện eth0, trong khi giao tiếp thực tế đang diễn ra tại wl0.1. m đi đúng hướng. – Petrus

+0

Tương tự ở đây ....... – zaf

+0

Khá nhiều điều tương tự ở đây. Cả hai thiết bị đều đang phát sóng, nhưng chúng không thể "nhìn thấy" được. –

Trả lời

3

Như chương trình bài viết này: https://plus.google.com/+Chainfire/posts/9NMemrKYnCd

MulticastSocket: : setNetworkInterface()

sẽ là câu trả lời

bạn có thể tìm ETH wlan0 bởi:

public static NetworkInterface getWlanEth() { 
    Enumeration<NetworkInterface> enumeration = null; 
    try { 
     enumeration = NetworkInterface.getNetworkInterfaces(); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 
    NetworkInterface wlan0 = null; 
    StringBuilder sb = new StringBuilder(); 
    while (enumeration.hasMoreElements()) { 
     wlan0 = enumeration.nextElement(); 
     sb.append(wlan0.getName() + " "); 
     if (wlan0.getName().equals("wlan0")) { 
      //there is probably a better way to find ethernet interface 
      Log.i(TAG, "wlan0 found"); 
      return wlan0; 
     } 
    } 

    return null; 
} 

Có một thử và lemme biết nếu nó hoạt động hay không ở chế độ Hotspot ...

0

Tôi đã có cùng một vấn đề và đưa ra một giải pháp do sự kết hợp của @braden, @ user707606 và chủ yếu là bài đăng của Chainfire trong số Link này.

Đăng trong liên kết đẹp nhưng không thực sự cung cấp bất kỳ mẫu mã nào nhưng ở đây là mẫu. Trước tiên, bạn cần phải có được Multicast Lock, điều này là cần thiết cho một số thiết bị Android, đã không cố gắng trong hầu hết trong số họ, nhưng nó đã được đề cập trong một số bài viết khác, vì vậy tôi đã bao gồm nó trong mã của tôi.

Quyền là bắt buộc, vì vậy trước tiên, hãy thêm quyền vào tệp Tệp kê khai của bạn.

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

Sau đó, bước thứ hai là mua khóa đa phương tiện theo phương pháp của bạn.

/* Acquire MultiCast Lock */ 
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); 
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

Và sau đó, tìm Wifi Network Interface của bạn

/** 
* Finds Network Interface of Wifi Ethernet. 
* 
* @return 
*/ 
public static NetworkInterface findWifiNetworkInterface() { 

    Enumeration<NetworkInterface> enumeration = null; 

    try { 
     enumeration = NetworkInterface.getNetworkInterfaces(); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 

    NetworkInterface wlan0 = null; 

    while (enumeration.hasMoreElements()) { 

     wlan0 = enumeration.nextElement(); 

     if (wlan0.getName().equals("wlan0")) { 
      return wlan0; 
     } 
    } 

    return null; 
} 

Sau đó, tạo ra một ổ cắm Multicast với một cổng có sẵn và thiết lập Wifi networkinterface của bạn.

MulticastSocket multicastSocket = new MulticastSocket(); 

/* Set NetworkInterface of MultiCast Socket */ 
NetworkInterface wifiNetworkInterface = findWifiNetworkInterface(); 
if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface); 

Sau đó, phần còn lại của quá trình triển khai của bạn vẫn giữ nguyên. Và một khi bạn đã làm xong với Multicast Lock, bạn nên phát hành nó.

Các vấn đề liên quan