Android和C++;通过WiFi直接进行套接字通信

Android和C++;通过WiFi直接进行套接字通信,android,c++,sockets,raspberry-pi,wifi-direct,Android,C++,Sockets,Raspberry Pi,Wifi Direct,概述:我目前正在开发一款Android应用程序,该应用程序通过WiFi Direct连接到Linux系统,最终目的是通过这个已建立的连接流式传输视频 在这种情况下,raspi将充当服务器,Android将作为客户端。我将从连接到pi的摄像头上进行流媒体传输,并在Android端接收此视频,使用ExoPlayer显示在我的应用程序中。pi无法在没有客户端ip地址的情况下开始通过数据报套接字发送此视频。Android设备还需要向Pi发送其他数据包,Pi会告诉它该做什么,因此两个设备都需要有彼此的ip

概述:我目前正在开发一款Android应用程序,该应用程序通过WiFi Direct连接到Linux系统,最终目的是通过这个已建立的连接流式传输视频

在这种情况下,raspi将充当服务器,Android将作为客户端。我将从连接到pi的摄像头上进行流媒体传输,并在Android端接收此视频,使用ExoPlayer显示在我的应用程序中。pi无法在没有客户端ip地址的情况下开始通过数据报套接字发送此视频。Android设备还需要向Pi发送其他数据包,Pi会告诉它该做什么,因此两个设备都需要有彼此的ip地址

目前我正在研究的Linux系统是RasBuri PI运行RasPIAN,开发在C++中进行。Android运行时环境是三星Galaxy Tab a

问题:我能够成功地在这两个设备之间建立连接,我已经设置好了连接,以便Raspberry Pi始终是组所有者。由于Pi是组所有者,它不能立即访问Android的IP地址;因此,必须在两者之间建立临时TCP套接字连接,以便Raspberry Pi能够记录Android的IP地址

在WiFi连接建立后,该C++代码在PI上运行,以从Android:/< P>打开并接受TCP套接字连接。

#include<cstddef>
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<unistd.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define BACKLOG 2 //Allowed connection count.

#define PORT 8988 //The port we will be listening on.

//The static IP of p2p-dev-wlan0
const std::string MY_IP = "192.168.4.1";

bool listen_for_ip() {

    //Buffer for receiving messages.
    char buffer[256];

    //Create Server Socket:
    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (sock_fd < 0)
        return false;
    else
        std::cout << "Created Server" << std::endl;

    struct sockaddr_in my_addr, peer_addr;

    //Recieve messages from IPv4 addresses.
    my_addr.sin_family = AF_INET;

    //Set our IP address of the socket to the value in "MY_IP"
    my_addr.sin_addr.s_addr = inet_addr(MY_IP.c_str());
    //my_addr.sin_addr.s_addr = INADDR_ANY; // Also tested with this, no luck.

    //Set our in port to the value in "PORT"
    my_addr.sin_port = htons(PORT);

    //Attempt to bind to IP and port.
    if (bind(sock_fd, (struct sockaddr*) &my_addr, sizeof(my_addr)) == 0)
        std::cout << "Binded successfully" << std::endl;
    else
        return false;

    //Listen on the socket
    if (listen(sock_fd, BACKLOG) < 0)
        return false;

    //Accept a connection.
    socklen_t peer_addr_size = sizeof(peer_addr);
    std::cout << "Accepting connection ..." << std::endl;
    int new_fd = accept(sock_fd, (struct sockaddr*) &peer_addr, &peer_addr_size);
    if (new_fd == -1) {
        std::cout << "Error accepting connect" << std::endl;
        close(sock_fd);
        return false;
    }
    else
        std::cout << "Connection accept completed status = " << new_fd << std::endl;

    //
    char ip[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &(peer_addr.sin_addr), ip, INET_ADDRSTRLEN);
    if (recv(new_fd, buffer, 256, 0) < 0) {
        close(new_fd);
        close(sock_fd);
        return false;
    }

    std::cout << "Client says " << buffer << std::endl;

    //Do other stuff with connection ...

    close(new_fd);
    close(sock_fd);
    return true;
}
价值
String host=mGroupInfo.groupOwnerAddress.getHostAddress()
将始终是树莓pi的IP地址。我已将其配置为使用静态IP作为DHCP服务器运行,使用:

cat > /etc/systemd/network/12-p2p-wlan0.network <<EOF 
[Match] 
Name=p2p-wlan0-* 
[Network] 
Address=192.168.4.1/24 
DHCPServer=yes 

EOF

我已经尝试了多个不同的套接字,确保pi实际上处于启动和侦听状态,并且在这一点上我真的很困惑。任何帮助都将不胜感激

由于Pi是组所有者,它不能立即访问Android的IP地址;因此,必须在两者之间建立临时TCP套接字连接,以便Raspberry Pi可以记录Android的IP地址。
为什么raspi必须知道Android设备的IP?你能告诉我们在哪里需要它吗?哪个设备将成为服务器?客户端将在哪里运行?
我能够成功地在两台设备之间建立连接,
是的,wifi直接连接是两台设备操作系统的问题。但在此之后,客户端应用程序应该尝试连接到侦听服务器应用程序。您从未谈论过客户机或服务器。而且只有客户端需要知道ip。
String host=mGroupInfo.groupOwnerAddress.getHostAddress()
请告诉主机的值。@blackapps很抱歉没有早点建立这个。在这种情况下,raspi将充当服务器,Android将作为客户端。我将从连接到pi的摄像头上进行流媒体传输,并在Android端接收此视频,使用ExoPlayer显示在我的应用程序中。pi无法在没有客户端ip地址的情况下开始通过数据报套接字发送此视频。Android设备还需要向Pi发送其他数据包,这些数据包将告诉它该做什么,因此两个设备都需要有彼此的ip地址。@blackapps
String host=mGroupInfo.groupOwnerAddress.getHostAddress()
的值将始终是raspberry Pi的ip地址。我已将其配置为使用静态IP作为DHCP服务器运行:
cat>/etc/systemd/network/12-p2p-wlan0.network
java.net.SocketTimeoutException: failed to connect to /192.168.4.1 (port 8988) from /192.168.4.163 (port 33122) after 10000ms
        at libcore.io.IoBridge.connectErrno(IoBridge.java:191)
        at libcore.io.IoBridge.connect(IoBridge.java:135)
        at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
        at java.net.Socket.connect(Socket.java:621)
        at com.nlos.networking.P2pClientSocket.lambda$exchangeIP$0$P2pClientSocket(P2pClientSocket.java:54)
        at com.nlos.networking.-$$Lambda$P2pClientSocket$fxU2Z0Zg0gRF1Fyl1fNnqgO2m8I.run(Unknown Source:4)
        at java.lang.Thread.run(Thread.java:919)