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