Wi-Fi Direct and “normal” Wi-Fi - Different MAC?

廉价感情. 提交于 2019-11-30 14:03:20

Reading about the MAC address on wikipedia.

Addresses can either be universally administered addresses or locally administered addresses.

Universally administered and locally administered addresses are distinguished by setting the second-least-significant bit of the most significant byte of the address. This bit is also referred to as the U/L bit, short for Universal/Local, which identifies how the address is administered. If the bit is 0, the address is universally administered. If it is 1, the address is locally administered.

Since Wi-Fi Direct is just another stack on top of MAC, you should also check what that bit can mean for it. I've found some mail discussion shedding some light on this. Apparently quote below is from a WFA spec.

The P2P Device shall assign a P2P Interface Address, corresponding to the format as described in §7.1.3.3.1 of IEEE Std 802.11‑2007 1, which is used to communicate with the P2P Group Owner or Clients within a P2P Group. A P2P Interface Address is not required to be globally unique and may be locally administered. A P2P Interface Address may be the same as the P2P Device Address provided the requirements for P2P Interface Address in this clause are satisfied.

So I believe answer to this question is, you shouldn't take MAC address from WifiManager and use it with Wi-Fi P2P connections.

I had been searching for this during my project. My requirements were to uniquely identify devices in an adhoc P2p network formed with WiFi Direct. Each device should identify its friend device the next time when it comes into proximity. I needed my own WiFi (Direct) MAC and my friends' to create a Key for this friend zone creation.

My Research: The design is in such a way that there is an Unique Universal ID and a Local ID. Reason: Universal ID can only be used to connect to Infrastructure mode Networks. Local ID could be used for "ad-hoc" mode networks(device to device). In this ad-hoc mode, there are possibilities that a single device might simultaneosly belong to several ad-hoc groups.

  1. Hence to support this concurrent operations, P2p devices support Multiple MAC entities, possibly on different channels.
  2. For each session, a persistent group MAY use a different channel and device MAC for each session.
  3. P2P devices use their global MAC address as Device ID during discovery and negotiation, and a temporary local MAC address for all frames within a group. Understood from here

However, there is NO straight forward way to obtain one's own WiFi P2p MAC address. Issue 53437: Android.

In this issue discussion, the project member from google has suggested this is possible and just that it hasn't been documented

Solution: Using intent filter WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION and the extra from the intent WifiP2pManager.EXTRA_WIFI_P2P_DEVICE

This is how I have used it in my project:

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

Hope this helps someone!

iFixit says that the Galaxy Nexus uses the BCM4330 for its MAC, Baseband, and PHY, so if you have any friends at Broadcom you could ask them.

Sadly, the datasheet is not public; the best I can do is link you to a block diagram.

I was struggling all night to figure out a way to retrieve WiFi Direct mac address instead, since my requirements were drafted around the assumption that it's feasible.

It's kind of round about, you create a single device group and get the owner and the device address along with it.

Here's the code,

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

Forget Wifi manager. Wifi direct address does not equals to MAC address. Wifi direct address uses for wifi direct connection. You can not use to anything else.

To connect two device with wifi direct device, you have to create a WifiP2pGroup with one of your device. With your another device, you have to search the WifiP2pGroups, select yours, and connect.

You can get WiFi direct address using next code:

public String getWFDMacAddress(){
try {
    List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
    for (NetworkInterface ntwInterface : interfaces) {

        if (ntwInterface.getName().equalsIgnoreCase("p2p0")) {
            byte[] byteMac = ntwInterface.getHardwareAddress();
            if (byteMac==null){
                return null;
            }
            StringBuilder strBuilder = new StringBuilder();
            for (int i=0; i<byteMac.length; i++) {
                strBuilder.append(String.format("%02X:", byteMac[i]));
            }

            if (strBuilder.length()>0){
                strBuilder.deleteCharAt(strBuilder.length()-1);
            }

            return strBuilder.toString();
        }

    }
} catch (Exception e) {
    Log.d(TAG, e.getMessage());
}
return null;

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!