当前位置: 首页 > 面试题库 >

通过Wi-Fi Direct广播

方飞鸣
2023-03-14
问题内容

我正在研究通过多个Android设备之间的Wi-Fi
Direct连接进行广播的可能性。我创建了一个简单的消息广播应用程序来测试它是否有效,但是到目前为止,我还无法广播消息。当我尝试发送数据包时,出现
SocketException (网络无法访问):

03-20 13:23:00.148: E/UdpBroadcaster(4180): sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180): java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:496)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.IoBridge.sendto(IoBridge.java:465)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at java.net.DatagramSocket.send(DatagramSocket.java:307)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at com.example.android.wifidirect.UdpBroadcaster.sendMessage(UdpBroadcaster.java:59)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at com.example.android.wifidirect.UdpBroadcaster.run(UdpBroadcaster.java:44)
03-20 13:23:00.148: E/UdpBroadcaster(4180): Caused by: libcore.io.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.Posix.sendtoBytes(Native Method)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.Posix.sendto(Posix.java:146)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     at libcore.io.IoBridge.sendto(IoBridge.java:463)
03-20 13:23:00.148: E/UdpBroadcaster(4180):     ... 4 more

这是我的代码的本质:

InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
int port = 8888;

DatagramSocket socket = new DatagramSocket(port);
socket.setBroadcast(true);
socket.connect(broadcastAddress, port);

String message = "Hello";
byte[] buffer = message.getBytes();

DatagramPacket packet = new DatagramPacket(
        buffer, buffer.length, broadcastAddress, port);

try {
    socket.send(packet); // <----- Causes a SocketException
} catch (IOException e) {
    Log.e(TAG, e.getMessage(), e);
}

有谁知道在 Android 设备上通过Wi-Fi Direct广播是否真的有效?如果它可以正常工作,我在做什么错?

我开始认为设备不知道将广播数据包路由到何处。在我的情况下,它需要工作而不必生根设备并手动为广播数据包添加路由。

更新资料

使用 Romain
Hippeau
getBroadcastAddress()建议的功能后,SocketException消失了,广播似乎按预期工作了。但是,我在第二台设备上接收广播时遇到问题。
__

我正在使用以下代码来接收广播:

DatagramSocket socket = null;
try {
    socket = new DatagramSocket(8888);
    socket.setBroadcast(true); // Not needed?
    socket.setSoTimeout(200);

    DatagramPacket packet = null;
    while (!mStopping) {
        byte[] buffer = new byte[1024];
        packet = new DatagramPacket(buffer, buffer.length);

        try {
            socket.receive(packet);

            if (packet.getData().length > 0) {
                String receivedString = new String(packet.getData());

                Log.i(TAG, "Received string: " + receivedString);
            }
        } catch (InterruptedIOException e) { /* Ignore */ }
    }
} catch (IOException e) {
    Log.e(TAG, e.getMessage(), e);
} finally {
    if (socket != null)
        socket.close();
}

我也曾尝试DatagramSocket通过添加InetAddress.getByName("0.0.0.0")as参数来向通配符地址添加通配符地址,但是没有运气。

有什么建议吗?


问题答案:


https://code.google.com/p/boxeeremote/wiki/AndroidUDP
无耻地被盗

尝试通过以下方式获得网络连接:

InetAddress getBroadcastAddress() throws IOException {
    WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcp = wifi.getDhcpInfo();
    // handle null somehow

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++)
      quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
    return InetAddress.getByAddress(quads);
}

然后尝试以这种方式发送数据包:

DatagramSocket socket = new DatagramSocket(PORT);
socket.setBroadcast(true);
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(),
    getBroadcastAddress(), PORT);
socket.send(packet);

// If you want to listen for a response ...
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

编辑:从同一页上阅读尝试此…

WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
MulticastLock lock = wifi.createMulticastLock("dk.aboaya.pingpong");
lock.acquire();
serverSocket = new DatagramSocket(19876);
serverSocket.setSoTimeout(15000); //15 sec wait for the client to connect
byte[] data = new byte[UDPBatPositionUpdater.secretWord.length()]; 
DatagramPacket packet = new DatagramPacket(data, data.length);
serverSocket.receive(packet);
lock.release();
String s = new String(packet.getData());
System.out.println(s);

请记住,您需要具有以下权限才能工作:
< uses-permission android:name =“android.permission.CHANGE_WIFI_MULTICAST_STATE” />



 类似资料:
  • 本章介绍 UDP 介绍 ChannelHandler, Decoder, 和 Encoder 引导基于 Netty 的应用 前面的章节都是在示例中使用 TCP 协议,这一章,我们将使用UDP。UDP是一种无连接协议,若需要很高的性能和对数据的完成性没有严格要求,那使用 UDP 是一个很好的方法。最著名的基于UDP协议的是用来域名解析的DNS。这一章将给你一个好的理解的无连接协议所以你能够做出明智的

  • 问题内容: 我是android编程和stackoverflow的新手。我想创建一个将某些信息(例如文本)发送到同一网络(Wi- fi)上的PC的应用程序,并使用Java应用程序在PC上阅读。任何想法如何开始?对不起,我的英语不好 问题答案: 您应在客户端和服务器程序中使用wi-fi管理器,并在PC和Android之间直接设置wifi。 对于权限,请使用以下命令: 在服务器中使用: 并在客户中: 然

  • 我正在尝试创建一个麦克风应用程序,在会议中用作观众的真正麦克风。我们将把Android设备连接到Wi-Fi局域网,任何人都可以从他们的应用程序中触发麦克风,向他人讲话。数据将进入局域网内的服务器Java程序,并从那里进入扬声器。 我不知道该怎么做。有人能帮我吗???提前谢谢

  • Wi-PWN ESP8266 firmware for performing deauthentication attacks, with ease. Fast & responsive Material Design UI, with optional dark mode Integrated Deauth Detector (with full customization) WiFi clie

  • HAProxy-WI 是用于管理 Haproxy,Nginx 和 Keepalived 服务器 Web 界面(用户友好的 Web GUI、警报、监视和安全)。 支持的特性: 用HAProxy-WI安装和更新HAProxy,Nginx和Keepalived 使用HAProxy-WI安装和更新Grafana,Prometheus服务器 使用HAProxy-WI安装和更新HAProxy和Nginx导出器

  • 问题内容: 我创建了一个服务器应用程序,该应用程序从客户端接收声音,然后广播此声音,该声音以字节存储,然后将字节发送回连接到服务器的客户端。现在,我目前仅使用一个客户端进行测试,客户端正在接收语音,但是声音一直在卡顿。有人可以告诉我我做错了吗? 我想我理解为什么声音播放不流畅但不了解如何解决问题的部分原因。 代码是波纹管的。 客户端: 将声音发送到服务器的部分 从服务器接收数据字节的部分 问题答案