通过UDP发送数据从android到外部传感器
问题描述:
我想从我的android发送一些数据通过WiFi连接到外部传感器。虽然我能够通过UDP连接将数据从传感器发送到android,但我无法做到相反。其中数据被发送的代码下面的一个:通过UDP发送数据从android到外部传感器
public void onClick(View v) {
Thread t = new Thread(){
@Override
public void run(){
while(true){
int server_port = 12345;
byte[] message = "1".getBytes();
System.out.println(message.toString());
try {
InetAddress local = InetAddress.getByName("255.255.255.255");
DatagramPacket p = new DatagramPacket(message,message.length,local,server_port);
DatagramSocket s = new DatagramSocket();
s.send(p);
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.start();
}
正如你可以在上面看到,一个按钮的OnClick,我希望应用程序通过UDP发送数据。问题是,当我尝试这样做时,发生此错误:
11-24 16:10:13.335: W/System.err(8077): java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
11-24 16:10:13.335: W/System.err(8077): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
11-24 16:10:13.335: W/System.err(8077):at libcore.io.IoBridge.sendto(IoBridge.java:475)
11-24 16:10:13.335: W/System.err(8077):at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
11-24 16:10:13.335: W/System.err(8077): at java.net.DatagramSocket.send(DatagramSocket.java:284)
11-24 16:10:13.343: W/System.err(8077): at com.example.waspmoteagriculture.MainActivity$3$1.run(MainActivity.java:97)
11-24 16:10:13.343: W/System.err(8077): Caused by: libcore.io.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable)
11-24 16:10:13.343: W/System.err(8077): at libcore.io.Posix.sendtoBytes(Native Method)
11-24 16:10:13.343: W/System.err(8077): at libcore.io.Posix.sendto(Posix.java:151)
11-24 16:10:13.343: W/System.err(8077): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
11-24 16:10:13.343: W/System.err(8077): at libcore.io.IoBridge.sendto(IoBridge.java:473)
11-24 16:10:13.343: W/System.err(8077): ... 3 more
我已经包含网络权限。另外我应该提到,传感器连接到android的wifi热点,以便将信息发送到手机。我不知道这样接收数据是否有问题。
是否有任何问题的代码或是这个错误有关的不同?先谢谢你。
答
我以某种方式解决了这个问题。看起来广播地址255.255.255.255无效,因此无法找到当前连接的网络(这也解释了网络不可达问题)。为了发送数据,我使用了传感器的IP地址(通过收到的包使用System.out.println(packet.getAddress().toString());
发现它。所以,为了发送数据广播,我想(还没有测试过)广播地址当前网络应该被使用
答
可能您需要设置访问网络的权限。将以下行添加到AndroidManifest.xml中
<uses-permission android:name="android.permission.INTERNET"/>
如果它不起作用,那么您需要对代码进行一些更改。 Read more here: https://code.google.com/p/boxeeremote/wiki/AndroidUDP
我已经包含了访问网络的权限,即使在链接中使用代码后,我仍然得到相同的错误,可能是传感器(客户端)接收数据包还是连接已正确建立? – 2014-11-25 08:17:42
我还应该提到传感器已连接到android的wifi热点。不知道是否有问题... – 2014-11-25 08:50:08