如何在Android和Linux之间设置Wifi-Direct连接

时间:2015-08-07 11:55:37

标签: android linux 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列表时,我看到“支持的接口模式:”允许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

该应用与此示例非常相似(它来自一本书)http://kurser.iha.dk/eit/itsmap/basic/MEIER/Professional%20Android%204%20All%20downloads/9781118102275%20PA4AD/Code%20Snippets/Chapter%2016/PA4AD_Ch16_WiFiDirect/src/com/paad/wifidirect/WiFiDirectActivity.java (我删除了整个“插座部分”)。

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

现在我正在尝试连接Android和Linux,但我想我真的不明白wpa_supplicant是如何工作的。 我也看到这个问题与我提出的问题非常相似,但它并没有真正回答我的怀疑...... Direct Wifi Communication between android smartphone and other devices

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

Wpa_supplicant是我的问题。我跑:

sudo wpa_supplicant -wlan0 -Dnl80211 -c/etc/wpa_supplicant.conf
sudo wpa_cli

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

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

fi.epitest.hostap.WPASupplicant.service
fi.w1.wpa_supplicant1.service

现在我可以

sudo killall wpa_supplicant

它真的死了,在没有重新连接下一秒的情况下将我与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

使用“p2p_peers”我可以看到手机MAC。

> aa:bb:cc:dd:ee:ff

我不能继续。我尝试了各种各样的可能性,但没有一种可行。我的目标是让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
在Ubuntu中我尝试

p2p_connect MAC_MINT PIN_GENERATED_BY_MINT

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

P2P-DEVICE-LOST p2p_dev_addr=MAC_UBUNTU

然后从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)?

3 个答案:

答案 0 :(得分:3)

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

我希望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();
}

N.B。要破坏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

这里服务器侦听连接,并且android客户端连接到它。我在第一个网站上使用了一个非常简单的TCP服务器,它就像一个魅力。 启动udhcpd很重要,否则你就无法获得连接" Android中的图标。 对于Android方面,我遵循了我在http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html上看到的内容并且效果很好。

  • 答案1.2从wpa_cli中,您可以获得许多不同的警告和错误。我看到,简单地调用该函数(就像我在前面的代码片段中所做的那样),尽管有警告,但一切都能正常工作。我忽略了他们。

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

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

  • 答案2.2客户"去了#34;到另一个接口,现在准备接收IP。启动DHCP和TCP服务器!

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

  • 答案2.4完成。这一直是问题

  • 答案1.4即使使用Android / linux也能正常使用。

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

答案 1 :(得分:0)

(可能不是一个完整的答案,但正确的方向)

问题出在Linux方面。我在Cyanogenmod(Android 5)和Fedora 22之间遇到了类似的问题,试图将Wifi Direct(Wifi P2P)用于英特尔的Linux操作系统无线显示软件(WDS)。

具体来说,英特尔的connman在2009年从Linux,NetworkManager的标准分歧(从头开始)。 Connman似乎是针对Linux的Wifi Direct(Wifi P2P)的唯一实现,并且是为嵌入式(移动)市场编写的。

由于RPM问题,connman在我的系统上仍未经过测试,但该软件应提供Linux所需的dbus通信。

网站:https://01.org/connman

答案 2 :(得分:0)

您是否只是尝试在Android上激活热点选项?然后连接Ubuntu设备,检查Android热点选项上连接的IP并将其提供给您的应用。 它对我来说可以远程控制我的Ubuntu系统。