按下按钮时如何从 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);
}
概览
我正在使用 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);
}