23

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

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

当我运行 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

该应用程序与此示例非常相似(来自一本书)https://github.com/retomeier/Wrox-ProfessionalAndroid-4E/blob/9741a8b62005d49519b1decfea21e7213fdd94a3/Snippets_ch18/app/src/main/java/com/professionalandroid/apps/我的应用程序/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

但是我遇到了很多问题:

  • 未按照我在 .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 故障”,这在本次比赛中意味着什么?
  • 问题 1.3:Android 目前正在尝试与 PBC 连接。有没有办法用 PIN 连接?

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

在薄荷我尝试

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)?

4

3 回答 3

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

注意要破坏 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-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 连接,我只是希望这可以帮助其他人。

于 2015-11-05T15:40:01.407 回答
2

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

问题出在 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

于 2015-12-27T14:45:42.223 回答
-2

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

于 2017-02-10T13:05:35.873 回答