This article implements how to receive UDP broadcasts from a PC on your mobile phone.
Let's first complete the code implementation on the PC side., which is very simple.
private final ScheduledExecutorService askService= Executors.newSingleThreadScheduledExecutor();
public void runWaitConnectThead(){
askService.scheduleAtFixedRate(this::sendAskMessage, 0, boardCastConfig.getWAIT_MS(), TimeUnit.MILLISECONDS);
}
protected void sendAskMessage(){
byte[] message = this.hostName.getBytes();
try (DatagramSocket datagramSocket = new DatagramSocket()) {
datagramSocket.setBroadcast(true);
InetAddress boardcastAddr = InetAddress.getByName("255.255.255.255");
DatagramPacket datagramPacket = new DatagramPacket(message, message.length, boardcastAddr, 1885);
datagramSocket.send(datagramPacket);
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
In the second code block above, askService will start immediatly(the second param) and will continue to exucute function "sendAskMessage()", which boardcast UDP packet, every boardCastConfig.getWAIT_MS() milliseconds. In my code, it repeats every 5s.
Now, you have achieved 50% success.
Before writing our receiving code, we need add some permissions in AndroidMnifest.xml file or your application will not able to run.
Here are the permissions:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
Then let's create a service in MainActivity, and implement our receiving code in it. By the way, don't forget adding this service in AndroidManifest.xml file.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent waitBoardCastService=new Intent(this, WaitBoardCastService.class);
startService(waitBoardCastService);
}
}
<service android:name=".on_wait.WaitBoardCastService"/>
Then we can finish our receiving code. It contains two part.
①create a new thread(I didn't show that in my code, but that's very important, you can't start your application if you left network operation in main thread)
②acquiring multicast lock(this step is extremely important, without this, you can't receive UDP packet)
③receiving UDP packet
WifiManager wifi =(WifiManager)getSystemService(MyApplication.WIFI_SERVICE);
WifiManager.MulticastLock lock = wifi.createMulticastLock("any_tag");
lock.acquire();
try {
DatagramSocket socket = new DatagramSocket(1885);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
Log.v("hello","waiting");
socket.receive(receivePacket);
String receiveMessage = new String(receivePacket.getData(), 0,receivePacket.getLength());
Log.v("hello","received!");
socket.close();
} catch (IOException e) {
Toast.makeText(MyApplication.getContext(), "NetWork Error",Toast.LENGTH_LONG).show();
} finally {
lock.release();
}
My results:
Top comments (1)
Hey, you've worked really well on this, but still, I'd suggest not just focusing on content creation here but also emphasizing the importance of what you post, and how devs can use it!
All the best, though :)