AndroidとLinux間でWifi-Direct接続を設定する方法 質問する

AndroidとLinux間でWifi-Direct接続を設定する方法 質問する

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

このアプリはこの例と非常によく似ています(本からの抜粋です)https://github.com/retomeier/Wrox-ProfessionalAndroid-4E/blob/9741a8b62005d49519b1decfea21e7213fdd94a3/Snippets_ch18/app/src/main/java/com/professionalandroid/apps/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

そして本当に死んでしまい、次の瞬間には再接続されずに Wi-Fi から切断されてしまいます。これで 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 障害が検出されました」というメッセージが表示されることがよくありますが、このコンテストではこれは何を意味するのでしょうか?
  • 質問 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)ではどうですか?

ベストアンサー1

私はこの問題に多くの時間を費やし、次のような答えを見つけました。

私は 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-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 クライアントは他のインターフェースに「移動」し、IP を受信する準備が整いました。DHCP サーバーと TCP サーバーを起動してください。

  • 回答 2.3 静的 IP は使用しないでください。サーバーのみでは問題ありませんが、クライアントは DHCP IP を使用する必要があります。静的 IP を処理する方法があるかもしれませんが、私の目的には役立ちませんでした。

  • 回答2.4 完了。それがずっと問題だった

  • 回答 1.4 Android/Linux でも問題なく動作します。

回答に間違いがあったら申し訳ありません。まだ WiFi-Direct 接続の全体像を把握できていません。これが他の誰かの役に立つことを願っています。

おすすめ記事