8

現在、Wi-Fi Direct を介して互いの MAC アドレスを知っている 2 台の電話を接続しようとしていますが、次の問題に遭遇しました。

    WifiManager wifiMan = (WifiManager) this
            .getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInf = wifiMan.getConnectionInfo();
    MAC_ADDRESS = wifiInf.getMacAddress();

WifiP2pManagerピアを検出して要求するときに から受け取るものとは少し異なります。例:a0:xx:xx:...に変わりa2:xx:xx.... ます 誰でも理由を知っていますか? 「Wi-Fi Direct MACアドレス」を取得する方法が見つかりませんでした.MACアドレスは一意である必要があり、両方を処理する同じWi-Fiモジュールです(通常のWi-FiとP2P / Direct) . これは非常に奇妙です..どうすればいいですか? 私が持っている 2 つのデバイス (Galaxy Nexus) の場合、MAC アドレスが異なるのは常に最初の 2 文字だけです。単にそれらを破棄する必要がありますか? 問題 (MAC アドレスの最初の部分だけが異なる 2 つのデバイス) が発生する可能性が高すぎませんか?

ありがとう。

4

6 に答える 6

4

私はプロジェクト中にこれを探していました。私の要件は、WiFi Direct で形成されたアドホック P2p ネットワークでデバイスを一意に識別することでした。各デバイスは、次に近接したときにそのフレンド デバイスを識別する必要があります。このフレンド ゾーンを作成するためのキーを作成するには、自分の WiFi (ダイレクト) MAC とフレンドが必要でした。

私の調査:設計は、Unique Universal ID と Local ID があるような方法です。理由:ユニバーサル ID は、インフラストラクチャ モード ネットワークへの接続にのみ使用できます。ローカル ID は、「アドホック」モード ネットワーク (デバイスからデバイス) に使用できます。このアドホック モードでは、1 つのデバイスが同時に複数のアドホック グループに属する可能性があります。

  1. したがって、この同時操作をサポートするために、P2p デバイスは複数の MAC エンティティを、場合によっては異なるチャネルでサポートします。
  2. セッションごとに、永続的なグループは、セッションごとに異なるチャネルとデバイス MAC を使用する場合があります。
  3. P2P デバイスは、検出とネゴシエーション中にグローバル MAC アドレスをデバイス ID として使用し、グループ内のすべてのフレームの一時的なローカル MAC アドレスを使用します。ここからわかる

ただし、独自の WiFi P2p MAC アドレスを取得する簡単な方法はありません。問題 53437: Android .

この問題の議論では、Google のプロジェクト メンバーが、これは可能であり、文書化されていないことを示唆しています。

解決策:インテント フィルターWifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTIONとインテントのエクストラを使用するWifiP2pManager.EXTRA_WIFI_P2P_DEVICE

これが私のプロジェクトでの使用方法です。

@Override
public void onReceive(Context context, Intent intent) {
....
....
String action = intent.getAction();

if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
            .equals(action)) {

        WifiP2pDevice device = (WifiP2pDevice) intent
                .getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);

        String myMac = device.deviceAddress;

        Log.d(TAG, "Device WiFi P2p MAC Address: " + myMac);

/* Saving WiFi P2p MAC in SharedPref */

        sharedPref = context.getSharedPreferences(context.getString(R.string.sp_file_name), Context.MODE_PRIVATE);
        String MY_MAC_ADDRESS = sharedPref.getString(context.getString(R.string.sp_field_my_mac), null);

        if (MY_MAC_ADDRESS == null || MY_MAC_ADDRESS != myMac) {
            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putString(context.getString(R.string.sp_field_my_mac), myMac);
            editor.commit();
        }

これが誰かを助けることを願っています!

于 2015-03-01T17:26:27.623 に答える
4

ウィキペディアでMACアドレスについて読んでいます。

アドレスは、ユニバーサルに管理されたアドレスまたはローカルに管理されたアドレスのいずれかです。

ユニバーサル管理アドレスとローカル管理アドレスは、アドレスの最上位バイトの 2 番目の最下位ビットを設定することによって区別されます。このビットは、Universal/Local の略である U/L ビットとも呼ばれ、アドレスの管理方法を識別します。ビットが 0 の場合、アドレスは普遍的に管理されます。1 の場合、アドレスはローカルで管理されます。

MAC 48 アドレス

Wi-Fi Direct は MAC 上の別のスタックにすぎないため、そのビットが何を意味するかを確認する必要もあります。これについていくつかの光を当てるメールの議論を見つけました。以下の引用は明らかにWFA仕様からのものです。

P2P デバイスは、IEEE Std 802.11‑2007 1の 7.1.3.3.1 で説明されている形式に対応する P2P インターフェース アドレスを割り当てるものとします。これは、P2P グループ オーナーまたは P2P グループ内のクライアントと通信するために使用されます。P2P インターフェイス アドレスは、グローバルに一意である必要はなく、ローカルで管理できます。P2P インターフェース アドレスは、この条項の P2P インターフェース アドレスの要件が満たされている場合、P2P デバイス アドレスと同じにすることができます。

したがって、この質問に対する答えは、MACアドレスを取得して接続WifiManagerで使用しないでください。Wi-Fi P2P

于 2013-01-23T13:11:09.853 に答える
0

私の要件は実現可能であるという仮定に基づいて作成されていたため、代わりに WiFi Direct の MAC アドレスを取得する方法を見つけるために一晩中苦労していました。

ちょっと回り道です。単一のデバイス グループを作成し、所有者とデバイス アドレスを一緒に取得します。

これがコードです。

    final WifiP2pManager p2pManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE);
    final WifiP2pManager.Channel channel = p2pManager.initialize(this, getMainLooper(), null);

    p2pManager.createGroup(channel, new WifiP2pManager.ActionListener() {
        @Override
        public void onSuccess() {
            p2pManager.requestGroupInfo(channel, new WifiP2pManager.GroupInfoListener() {
                @Override
                public void onGroupInfoAvailable(WifiP2pGroup wifiP2pGroup) {
                    Log.i("", wifiP2pGroup.getOwner().deviceAddress);

                    // Following removal necessary to not have the manager busy for other stuff, subsequently
                    p2pManager.removeGroup(channel, new WifiP2pManager.ActionListener() {
                        @Override
                        public void onSuccess() {
                            Log.i("", "Removed");
                        }

                        @Override
                        public void onFailure(int i) {
                            Log.i("", "Failed " + i);
                        }
                    });
                }
            });
        }

        @Override
        public void onFailure(int i) {
            Log.i("", String.valueOf(i));
        }
    });
于 2014-05-01T13:18:53.807 に答える
0

iFixit によると、Galaxy Nexus は MAC、ベースバンド、および PHY に BCM4330 を使用しているため、Broadcom に友人がいる場合は、彼らに尋ねることができます。

残念ながら、データシートは公開されていません。私にできる最善のことは、ブロック図へのリンクです。

于 2012-09-24T03:12:22.747 に答える
0

Wifiマネージャーを忘れてください。Wifi ダイレクト アドレスは MAC アドレスと等しくありません。Wifi ダイレクト アドレスは、wifi ダイレクト接続に使用されます。他のものには使用できません。

2 つのデバイスを wifi ダイレクト デバイスに接続するには、いずれかのデバイスで WifiP2pGroup を作成する必要があります。別のデバイスでは、WifiP2pGroups を検索し、自分のデバイスを選択して接続する必要があります。

于 2015-03-03T14:56:34.723 に答える