DEV Community

NanYuanZhiGe
NanYuanZhiGe

Posted on

Receive UDP Broadcast from PC on Android

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();
Enter fullscreen mode Exit fullscreen mode
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());
        }
    }
Enter fullscreen mode Exit fullscreen mode

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" />
Enter fullscreen mode Exit fullscreen mode

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);
    }
}
Enter fullscreen mode Exit fullscreen mode
<service android:name=".on_wait.WaitBoardCastService"/>
Enter fullscreen mode Exit fullscreen mode

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();
}
Enter fullscreen mode Exit fullscreen mode

My results:

Image description

Top comments (1)

Collapse
 
mahak_kaurchhabra_39a895 profile image
Mahak Kaur

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 :)