2016-05-18 23 views
6

Dường như tiếp nhận đa hướng không hoạt động trên một số thiết bị Android. Tôi không thể nhận multicast với 4 trong số 13 thiết bị thử nghiệm. Trên 4 thiết bị đó có vẻ như ứng dụng không gửi yêu cầu IGMP để tham gia nhóm multicast.Tại sao tiếp nhận đa hướng không hoạt động trên một số thiết bị Android?

Mã nhận multicast trông giống như vậy:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG); 
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock(TAG); 
multicastLock.setReferenceCounted(true); 

wifiLock.acquire(); 
multicastLock.acquire(); 

try { 
    MulticastSocket socket = new MulticastSocket(32123); 

    InetAddress group = InetAddress.getByName("224.1.2.3"); 
    socket.joinGroup(group); 

    DatagramPacket packet; 
    byte[] buf = new byte[256]; 
    packet = new DatagramPacket(buf, buf.length); 

    socket.receive(packet); 

    socket.leaveGroup(group); 
    socket.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

multicastLock.release(); 
wifiLock.release(); 

Ứng dụng có các quyền sau đây:

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

Để chứng minh vấn đề tôi đã tạo một dự án thử nghiệm nhỏ bằng cách sử dụng mã ở trên vào GitHub: MulticastTest.

Có sự cố với mã của tôi không? Tôi có bỏ lỡ một sự cho phép?

CHỈNH SỬA 1: Sự cố này dường như không liên quan đến phiên bản Android cụ thể. Tôi có thể tái tạo hành vi trên Android 4.x, 5.x và 6.x.

EDIT 2: Có liên quan question.

Trả lời

3

Tin xấu: Điều này có vẻ liên quan đến các thiết bị bị ảnh hưởng. Không có /proc/net/igmp có sẵn chính xác trên các thiết bị không thể nhận lưu lượng phát đa hướng. Như đã dự kiến, điều này rất có thể dẫn đến yêu cầu tham gia nhóm bị thiếu (IP_ADD_MEMBERSHIP).

Chúng tôi đã thử với API Java Android, ổ cắm BSD và Boost.Asio. Cùng một kết quả với cả ba tùy chọn.

Chúng tôi đã xác minh sự cố với ứng dụng được gọi là Multicast Tester. Ứng dụng này có cùng một vấn đề trên cùng một thiết bị như ứng dụng của chúng tôi. Không có yêu cầu IGMP nào được gửi bởi thiết bị và tất nhiên không nhận được lưu lượng multicast.

Có một số mở và đóng (có trạng thái Lỗi thời và Sai) issues trong trình theo dõi vấn đề Android. Tôi nghĩ rằng các vấn đề đóng được đánh dấu là Obsolete/WrongForum bởi vì nó không phải là một vấn đề trong Android nhưng cụ thể cho các thiết bị bị ảnh hưởng (thiết lập).

Dường như hạt nhân trên các thiết bị bị ảnh hưởng đã được xây dựng với

CONFIG_IP_MULTICAST=n 

trong file kernel configuration. Đó cũng là lý do tại sao /proc/net/igmp không khả dụng trên các thiết bị bị ảnh hưởng. Nó rõ ràng là chỉ được tạo ra khi CONFIG_IP_MULTICAST được thiết lập như có thể được nhìn thấy trong Linux kernel code.

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