據本人實驗結果,Android 4.2 JellyBean Wi-Fi Direct無法送UDP broadcast到遠端Android設備,也沒收到遠端設備發過來的udp broadcast封包。
測試位址
測試封包量大小
測試WifiManager class的MulticastLock
測試有無設定DatagramSocket的receiveBuffer size
有設定
無設定
測試流程是排列組合這四大項環境條件,都是收不到對方設備發過來的聲音資料。
我找了很多stackoverflow.com的資料和網路上其他地方的資料(包括Android在code.google.com的issue論壇),發現舊版本的有些 Android 設備(Android 4.x以前版本)是可以用 WiFi 發送和接收udp broadcast或multicastSocket資料,這也僅是舊版本的有些設備,其他的設備依然是不能收送udp broadcast或multicastSocket資料。我照著他們的解決方法改寫程式碼,在測試機器上依然是不能做到跟他們一樣。所以我懷疑,Android系統本身可能延續2.x版本的Bug,且Android 4.0之後的 Wi-Fi Direct 網路介面,根本非常陽春,只能支援TCP的Socket,也就是Java的Socket和ServerSocket class。
//Send data
DatagramSocket send_socket = new DatagramSocket(8988)
send_socket.setBroadcast(true)
byte[] buffer = new byte[SIZE]
// fill data...skip
// fill data...skip
SocketAddress groupAddress = new SocketAddress(InetAddress.getByName("0.0.0.0"), 8989)
DatagramPacket send_datagram = new DatagramPacket(buffer, buffer.length, groupAddress)
send_socket.send(send_datagram)
//Receive data
DatagramSocket recv_socket = new DatagramSocket(8989)
recv_socket.setBroadcast(true)
byte[] recv_buffer = new byte[SIZE]
DatagramPacket recv_datagram = new Datagram(recv_buffer, recv_buffer.length)
recv_socket.receive(recv_datagram)
// get received data ... skip