23

Wifi-Direct を使用して 2 台のデバイスを接続したいと考えています。1つはLinuxを搭載したPC(テスト中はLinux Mint 17.2を使用しています)、もう1つはAndroidスマートフォン(Android 4.3を搭載したSamsung Galaxy S3。ルート化されておらず、ルート化したくない)です。

インターネットでいくつかのガイドを読んで、Linux で wpa_supplicant を使用し、Android 用のアプリを作成することにしました。これは、wpa_supplicant について私が見つけた最高のガイドの 1 つです: 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

アプリはこの例と非常によく似ています (本からのものです) myapplication/WiFiDirectActivity.java

期待どおりに動作します。2 台の Android デバイスで試してみると、お互いを認識して接続できます (Wifi-Direct アイコンが表示されます)。

今、Android と Linux を接続しようとしていますが、wpa_supplicant がどのように機能するのかよくわかっていないようです。私が尋ねたものと非常によく似たこの質問も見ましたが、私の疑問に実際には答えていません... Androidスマートフォンと他のデバイス間の直接Wifi通信

私の問題は、2 つのデバイス間でハンドシェイクを行う方法と、ネットワークをセットアップする方法を理解できないことです。

Wpa_supplicant は私の問題です。走る:

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

しかし、私は多くの問題を抱えていました:

  • device_name (およびその他のパラメーター) が、.conf ファイルで指定したとおりに設定されていませんでした
  • wpa_supplicant は引き続きすべてのネットワークへの接続を試みます
  • p2p_find は本当に遅かった...

/usr/share/dbus-1/system-services に移動し、2 つのファイルを移動しました

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

今ならできる

sudo killall wpa_supplicant

そして、それは本当に死んで、次の秒に再接続せずにWifiから切断します. これで wpa_supplicant を起動できるようになり、3 つの問題は解決されました。

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: 2 つのデバイスをハンドシェイクする正しい方法はどれですか?
  • 質問 1.2: p2p_connect を試すと、結果の間に "Michael MIC failure detected" が表示されることがよくありますが、このコンテストではどういう意味ですか?
  • 質問 1.3: 現在、Android は PBC に接続しようとしています。PINで接続する方法はありますか?

Android/Linux に接続できないことがわかったので、最初のリンクのようなインターネットの例に従って、Linux/Linux (GO として Linux Mint、クライアントとして 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 この変更を処理する正しい方法は何ですか? 変更後、Ubuntu を p2p_find できなくなりました (しばらく待つか、すべてを再起動する必要があります)。

  • 質問 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 クライアントがそれに接続します。最初の Web サイトで見つけた非常に簡単な 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 によるものではありませんでした。

  • 回答 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 の間で同様の問題が発生し、Intel の Linux OS (WDS) 用ワイヤレス ディスプレイ ソフトウェアに Wifi Direct (Wifi P2P) を使用しようとしています。

具体的には、Intel の connman は、Linux の標準であった NetworkManager から 2009 年に分岐 (ゼロから作成) されました。Connman は、Linux 用の Wifi Direct (Wifi P2P) の唯一の実装のようであり、組み込み (モバイル) 市場向けに作成されました。

RPM の問題により、connman は私のシステムではテストされていませんが、ソフトウェアは Linux が必要とする dbus 通信を提供するはずです。

ウェブサイト: https://01.org/connman

于 2015-12-27T14:45:42.223 に答える