按下按钮时如何从 Android APP 向 Node-Red 中的 UDP 侦听器发送硬编码字符串?

How to send hard coded string from Android APP when button is pressed to a UDP listener in Node-Red?

概览

我正在使用 Android Studio 制作一个应用程序,在按下按钮时将字符串发送到笔记本电脑上 Node-Red 运行 中的 UDP 侦听器,Node-Red 会过滤任何进来,功能节点做他们的事情。此应用程序将在 LAN 内运行,而不是在 Internet 上运行。

到目前为止,我已经创建了一个空 activity 的新项目,而我的 activity_main.xml 有按钮。用户无需输入 string/text,因此按钮按下代码将硬编码 "string" 和 Node-Red 侦听器 IP 和端口。

也不需要收到来自 laptop/node-red 方的回复,因此按下按钮应该是一次触发并忘记硬编码消息,因此是 UDP 而不是 TCP 套接字。

问题

MainActivity 在按下按钮时将字符串发送到 Node-Red 中的 UDP 侦听器需要什么代码?

我花了很长时间在互联网上搜索答案并尝试了很多代码示例,但它们都没有用。我看到的很多研究都是 UDP 接收问题的人,但是我无法理解他们发送 UDP 的代码。

我经过大量的反复试验终于解决了这个问题...如果其他人遇到同样的问题,请查看下面的代码:

//On button press the message is sent via UDP
    findViewById(R.id.btSendMessage).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int txnumber = Integer.parseInt(((TextView) findViewById(R.id.transmitnumber)).getText().toString());
            String data = ((TextView) findViewById(R.id.texttosend)).getText().toString();
            int port = Integer.valueOf(((TextView) findViewById(R.id.serverport)).getText().toString());
            String address = ((TextView) findViewById(R.id.serverip)).getText().toString();
            SendData(txnumber, data, port, address);

        }
    });



private DatagramSocket UDPSocket;
private InetAddress address;
private int port;

public void Theaddress(InetAddress address) {
    try {
        this.UDPSocket = new DatagramSocket();
        this.address = address;
    } catch (SocketException e) {
        e.printStackTrace();
    }
}

public void SendInstruction(final byte[] data, final int port) {
    new Thread() {
        @Override
        public void run() {
            try {
                DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
                UDPSocket.send(packet);
                DatagramPacket packetreponse = null;
                UDPSocket.receive(packetreponse);
                DisplayData(packetreponse);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
}

public void SendData(final int nbRepet, final String Sdata , final int port, final String address) {
    new Thread() {
        @Override
        public void run() {
            try {
                Theaddress(InetAddress.getByName(address));
                for (int i = 0; i < nbRepet; i++) {
                    byte[] data = Sdata.getBytes();
                    SendInstruction(data,port);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
}

public void ReceiveData(final int portNum) {
    new Thread() {
        @Override
        public void run() {
            try {
                final int tally = 1024;
                final byte[] buffer = new byte[tally];
                DatagramSocket socketReceive = new DatagramSocket(portNum);
                while (true) {
                    DatagramPacket data = new DatagramPacket(buffer, buffer.length);
                    socketReceive.receive(data);
                    DisplayData(data);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
}

public void DisplayData(DatagramPacket data) {
    System.out.println(data);
}