2012-11-04 45 views
8

Tôi đang phát triển một ứng dụng trò chuyện trong đó khách hàng Android sẽ trao đổi IP của họ bằng cách sử dụng tính năng phát đa hướng (UDP).Thiết bị Android không nhận gói đa phương tiện

Mọi thiết bị sẽ gửi ip của nó cho nhiều khách hàng (tất cả các thiết bị chạy ứng dụng này) trong một Chủ đề riêng biệt. Sẽ có một luồng thu khác sẽ nghe các gói multicast này. Đây là mã của tôi.

// Mã đa phương tiện.

DatagramSocket socket = new DatagramSocket(9898); 
      byte buff[] = ip.getBytes(); 
      DatagramPacket packet = new DatagramPacket(buff, buff.length, InetAddress.getByName("224.0.0.1"),9999); 
      socket.send(packet); 
      socket.close(); 

// Receiver đang

MulticastSocket socket = new MulticastSocket(9999); 
     InetAddress group = InetAddress.getByName("224.0.0.1"); 
     socket.joinGroup(group); 

     DatagramPacket packet; 

      byte[] buf = new byte[256]; 
      byte b = 'x'; //just a separator for time being 
      Arrays.fill(buf,b); 
      packet = new DatagramPacket(buf, buf.length); 
      String received= ""; 
      while(received!=null) 
      { 
       socket.receive(packet); 
       received = new String(packet.getData()); 
       received = received.substring(0,received.indexOf('x')); 
       this.setIp(received); 
       System.out.println("Address: " + received); 
      } 

     socket.leaveGroup(group); 
     socket.close(); 

Vấn đề là mọi thiết bị in địa chỉ riêng của mình. Có vẻ như nó không bao giờ lắng nghe các gói multicast khác (tôi có nghĩa là nó cũng nên in các ip khác). Tôi cũng nhận được một đăng nhập dưới đây, không chắc chắn nếu đó là liên quan.

11-04 23:56:17.985: I/OSNetworkSystem(603): mcastAddDropMembership interfaceIndex=0 

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

9

Bạn cần mua MulticastLock trong ứng dụng của mình, ứng dụng này sẽ cho phép ứng dụng của bạn nhận các gói không được giải quyết rõ ràng cho thiết bị này trên mạng.

Yêu cầu cấp phép: Mã

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

mẫu:

// Acquire multicast lock 
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

//Do some mutlicast job here 
... ... 

// Once your finish using it, release multicast lock 
if (multicastLock != null) { 
    multicastLock.release(); 
    multicastLock = null; 
} 
+0

Dường như đây chỉ dành cho các gói phát đa hướng wifi. Tôi đang phát đa hướng qua internet (sử dụng APN bình thường, không có WIFI). Nó vẫn hoạt động? –

+0

Tôi không nghĩ rằng nó có thể trên Android, xem nếu câu trả lời [ở đây] (http://stackoverflow.com/questions/3068497/udp-multicast-over-the-internet) giúp. – yorkw

+0

Cảm ơn tôi sẽ xem xét. –

1

IPv4 hỗ trợ multicast trong android được thực hiện poorely. Có lỗi từ thời đại cupcake vẫn còn hiện diện.

Tôi đã gặp sự cố tương tự Tôi đã thực hiện một dự án dựa trên mDNS/multicast để khám phá dịch vụ. Ứng dụng Android của tôi sẽ không đăng ký vào nhóm phát đa hướng. Tôi đã xác minh điều này bằng cách tạo một điểm truy cập di động trên máy tính Ubuntu 14.04 và chạy tcpdump trên đó. Các thiết bị Android được kết nối với nó chỉ đơn giản là không phát ra các thông điệp IGMP cần thiết để tham gia một nhóm. Tôi có thể gửi các gói nhưng không nhận được chúng.

Điều tôi nhận thấy rằng tôi đã nhận được thông báo nhóm tham gia IPv6 vào tất cả các hệ thống bất cứ khi nào tôi tham gia vào mạng. Điều này nhắc tôi thử địa chỉ multicast IPv6 và đã hoạt động.

Thiết bị Android mới hơn hỗ trợ IPv6, có hỗ trợ đa phương tiện tích hợp và bắt buộc. Vì vậy, thay vì sử dụng địa chỉ multicast lớp 4 IPv4, hãy sửa đổi mã của bạn để sử dụng địa chỉ IPv6. Điều này sẽ làm cho mã của bạn hoạt động trên ít nhất là cấp địa phương.

http://developer.android.com/reference/java/net/Inet6Address.html

Trang này có rất nhiều thông tin về những IP để sử dụng theo nhu cầu của bạn.

Một số người nói rằng nó hoạt động mà không có WiFiManager.crrateMulticastLock() nhưng tôi đã không thử điều đó.

Đa truyền thông với mạng toàn cầu chắc chắn là có thể về mặt lý thuyết. Nhưng tôi chưa bao giờ thấy một thực hiện thành công thực tế của một. Với các bộ định tuyến bí mật và tường lửa tồn tại xung quanh.

Câu hỏi SO này cho thấy cách nó được thực hiện trên máy tính để bàn. Mã tương tự cũng hoạt động với Android.

IPv6 Multicast example

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