如何在Android和Linux之间建立Wifi-Direct连接

Kid*_*ida 13 linux android wifi-direct wpa-supplicant

我想使用Wifi-Direct连接两台设备.一个是带Linux的电脑(在我的测试中我使用的是Linux Mint 17.2),另一个是Android智能手机(带有Android 4.3的三星Galaxy S3.没有root,也不想root).

在互联网上阅读了许多指南,我决定在Linux中使用wpa_supplicant并为Android创建一个应用程序.这是我为wpa_supplicant找到的最佳指南之一:http: //processors.wiki.ti.com/index.php/OMAP_Wireless_Connectivity_NLCP_WiFi_Direct_Configuration_Scripts#p2p_group_add

当我运行iw list时,我看到"支持的接口模式:"允许P2P_client和P2P_GO.我的wpa_supplicant.conf包含:

ctrl_interface=/var/run/wpa_supplicant
update_config=1 

ap_scan=1
device_name=My-pc
device_type=1-0050F204-1
driver_param=use_p2p_group_interface=1

p2p_go_intent=15
p2p_go_ht40=1
Run Code Online (Sandbox Code Playgroud)

该应用程序非常类似于此示例(它来自一本书)http://kurser.iha.dk/eit/itsmap/basic/MEIER/Professional%20Android%204%20All%20downloads/9781118102275%20PA4AD/Code%20Snippets/章%2016/PA4AD_Ch16_WiFiDirect/src/com/paad/wifidirect/WiFiDirectActivity.java (我删除了整个"套接字部分").

它按预期工作.当我尝试使用两个Android设备时,他们可以看到对方并连接(它显示为Wifi-Direct图标).

现在我正在尝试连接Android和Linux,但我想我真的不明白wpa_supplicant是如何工作的.我也看到了这个与我问的问题非常相似的问题,但它并没有真正回答我的怀疑... Android智能手机和其他设备之间的直接Wifi通信

我的问题是我无法理解如何在两个设备之间进行握手以及如何设置网络.

Wpa_supplicant是我的问题.我跑:

sudo wpa_supplicant -wlan0 -Dnl80211 -c/etc/wpa_supplicant.conf
sudo wpa_cli
Run Code Online (Sandbox Code Playgroud)

但是我遇到了很多问题: - 设备名称(和其他参数)没有像我在.conf文件中指定的那样设置 - wpa_supplicant继续尝试连接到所有网络 - p2p_find真的很慢......

所以我进入/ usr/share/dbus-1/system-services并移走了两个文件

fi.epitest.hostap.WPASupplicant.service
fi.w1.wpa_supplicant1.service
Run Code Online (Sandbox Code Playgroud)

现在我能

sudo killall wpa_supplicant
Run Code Online (Sandbox Code Playgroud)

它真的死了,在没有重新连接下面的第二个的情况下将我与Wifi断开连接.现在我可以启动wpa_supplicant并解决了三个问题.

我进入wpa_cli,启动"p2p_find",同时,我在应用程序中启用搜索.

Android和Linux现在可以看到对方了.

P2P-DEVICE-FOUND 00:11:22:44:88:ff p2p_dev_addr=00:11:22:44:88:ff
pri_dev_type=10-0050F204-5 name='GT-I9300' config_methods=0x188
dev_capab=0x24 group_capab=0x0 vendor_elems=1 new=0
Run Code Online (Sandbox Code Playgroud)

使用"p2p_peers",我可以看到手机MAC.

> aa:bb:cc:dd:ee:ff
Run Code Online (Sandbox Code Playgroud)

在这里,我不能继续.我尝试了各种各样的可能性,但没有一种可行.我的目标是让Linux成为集团所有者.

  • 问题1.1:握手这两个设备的正确方法是什么?
  • 问题1.2:当我尝试p2p_connect时,我经常会在结果之间发现"Michael MIC failure failed",这在本次比赛中意味着什么?
  • 问题1.3:Android目前尝试与PBC连接.有一种方法可以连接PIN吗?

看到我无法连接Android/Linux,我尝试使用Linux/Linux(Linux Mint作为GO,Ubuntu作为客户端)进行一些练习,遵循来自互联网的示例,如第一个链接中的示例.我甚至在这里遇到了很多问题.

在Mint我尝试

p2p_connect MAC_UBUNTU pin auth
Run Code Online (Sandbox Code Playgroud)

在Ubuntu我试试

p2p_connect MAC_MINT PIN_GENERATED_BY_MINT
Run Code Online (Sandbox Code Playgroud)

当我在Mint中编写psp_connect时,它会创建一个新的接口p2p_wlan0 _0,并返回

P2P-DEVICE-LOST p2p_dev_addr=MAC_UBUNTU
Run Code Online (Sandbox Code Playgroud)

然后从Ubuntu启动的p2p_connect失败.

  • 问题2.1为什么在创建组时切换界面?
  • 问题2.2处理此更改的正确方法是什么?改变之后我再也不能p2p_find Ubuntu了(我要等一段时间或重启一切)
  • 问题2.3 Ubuntu应该改变它的界面吗?
  • 问题2.3在新界面中,我应该为Ubuntu和Mint设置IP ...我应该如何使用静态IP?
  • 问题2.4如果我想设置DHCP服务器和客户端?

  • 问题1.4和Android(客户端)/ Linux(GO)?

Kid*_*ida 9

我在这个问题上做了很多工作,这里是我找到的答案:

我想要 Linux 作为 GO 和 Android 作为客户端,所以在 Linux 中对我有用的是:

// Kill current supplicant and avoid its automatic recreation
system("mv /usr/share/dbus-1/system-services/fi.* .");
system("killall udhcpd");
system("wpa_cli -i wlan0 terminate -B");
usleep(300000);

// Start new supplicant
system("wpa_supplicant -Dnl80211 -iwlan0 -c /etc/p2p_supplicant.conf -B");
system("wpa_cli -iwlan0 p2p_group_add");
system("ifconfig p2p-wlan0-0 192.168.1.2");

// Connect with a peer
for (;;) {
  system("wpa_cli -ip2p-wlan0-0 wps_pbc");
  system("udhcpd /etc/udhcpd.conf");
  // Here start your TCP server on a port
  Server server([port]);
  server.startServer();
}
Run Code Online (Sandbox Code Playgroud)

注意要破坏 P2P 连接并重新启动正常的连接,我使用以下脚本:

#!/bin/bash
wpa_cli -i wlan0 terminate -B
wpa_cli -i p2p-wlan0-0 terminate -B
cp ./fi.* /usr/share/dbus-1/system-services/
service network-manager restart
Run Code Online (Sandbox Code Playgroud)

在这里,服务器侦听连接,而 android 客户端连接到它。我使用了在第一个网站上找到的一个非常简单的 TCP 服务器,它的工作非常吸引人。启动 udhcpd 很重要,否则您将无法在 Android 中获得“已连接”图标。对于 Android 方面,我按照我在http://developer.android.com/training/connect-devices-wireless/wifi-direct.html 上看到的内容进行操作,并且效果很好。

  • 回答 1.2 从 wpa_cli 您可以得到很多不同的警告和错误。我看到,尽管有警告,只要调用函数(就像我在前面的代码片段中所做的那样)就可以使一切正常。我忽略了他们。

  • 回答 1.3 使用 PIN 的连接有效,当我尝试它时,我没有启动 udhcpd 并且每次都使我的连接崩溃。这不是由于 PIN 或 PBC。

  • Answer 2.1 服务端和客户端都是交换接口。这与您通常使用套接字所做的行为非常相似。您创建一个侦听套接字,有人连接,您创建一个新套接字以在单独的线程中处理该客户端,同时侦听套接字仍在那里等待其他用户。你对接口做同样的事情。启动一个监控 wlan0 接口的 wpa_cli 和一个监控 p2p-wlan0-0 接口的 wpa_cli 可以很好地了解更改期间发生的情况。

  • 答案 2.2 客户端“转到”另一个接口,现在准备接收 IP。启动 DHCP 和 TCP 服务器!

  • 答案 2.3 不要使用静态 IP。只有服务器才可以,客户端应该使用DHCP IP。也许有一种方法可以处理静态 IP,但它对我的目标没有用。

  • 回答 2.4 完成。这是一直以来的问题

  • 答案 1.4 即使在 Android/linux 上也能完美运行。

抱歉,如果我在回答中犯了一些错误,我仍然没有了解 WiFi-Direct 连接的全貌,我只是希望这可以帮助其他人。