web-dev-qa-db-ja.com

AndroidとLinuxの間のWifi-Direct接続をセットアップする方法

Wifi-Directを使用して2つのデバイスを接続します。 1つはLinux搭載のPC(テスト中はLinux Mint 17.2を使用しています)、もう1つはAndroidスマートフォン(Samsung Galaxy S3 with Android 4.3根ざしておらず、根を張りたくない)。

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

アプリはこの例に非常に似ています(本から) 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 (「ソケット部分」全体を削除しました)。

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

今、私はAndroidとLinuxを接続しようとしていますが、wpa_supplicantがどのように機能するか本当に理解していないと思います。私が尋ねたものと非常に似ているこの質問を見ましたが、 tは本当に私の疑問に答えます... 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)で?

12
Kida

私はこの問題に多くの努力をしました、そして、ここに私が見つけた答えがあります:

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クライアントがそれに接続します。最初のWebサイトで見つかった非常に簡単な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接続の全体像はまだわかりません。これが他の人の助けになることを願っています。

4
Kida

Androidでホットスポットオプションを有効にしようとしましたか?次に、Ubuntuデバイスに接続し、Android hotspotオプションで接続されたIPを確認し、アプリに渡します。Ubuntuシステムをリモート制御するために機能します。

0
GabyGab

(完全な答えではないかもしれませんが、正しい方向です)

問題はLinux側にあります。 Cyanogenmod(Android 5)とFedora 22の間で同様の問題が発生しており、IntelのLinux OS(WDS)用ワイヤレスディスプレイソフトウェアにWifi Direct(Wifi P2P)を使用しようとしています。

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

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

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

0
Anon