Wi-Fi Direct和普通Wi-Fi- MAC地址不同吗?

8

我正在尝试通过Wi-Fi Direct连接两个已知彼此MAC地址的手机,但遇到了以下问题: 我从中收到的MAC地址是

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

我从WifiP2pManager接收到的MAC地址在发现和请求对等设备时与此略有不同。例如:a0:xx:xx:...变成了a2:xx:xx....。有人知道为什么吗?我没有找到获取“Wi-Fi Direct MAC地址”的方法,因为我认为MAC地址应该是唯一的,并且相同的Wi-Fi模块处理两者(普通Wi-Fi和P2P/Direct)。这很奇怪...我该怎么办?对于我拥有的两个设备(Galaxy Nexus),MAC地址始终只有前两个字符不同 - 我应该简单地将它们丢弃吗?遇到问题(两个设备的MAC地址仅在第一部分不同)的概率太高了吗?

谢谢。


1
我知道这有些过时了,但你找到答案了吗?我发现Wifi Direct规范更改了MAC地址。http://developer.samsung.com/android/samples-1 - Mgamerz
附加细节:Android AOSP 似乎将第一个值增加了2。我的Nexus 7(4.2)和Galaxy Nexus(4.1)都是如此,但我的LG Mach(4.0)没有这样做。 - Mgamerz
Mgamerz:这并不是那么容易预测的。我的Nexus 5将第一个值更改了2,但我的Moto G将最后一个值更改了1。它们都是原生Android系统,我想。 - Cypress Frankenfeld
6个回答

4

阅读关于MAC地址的维基百科页面。

MAC地址可以是全球唯一标识或本地管理标识。

通过设置地址最高字节的次要位的第二位来区分全球唯一标识和本地管理标识。这个位也被称为U / L位,代表通用/本地标识了地址如何被管理。如果该位为0,则地址是全球唯一标识。如果为1,则地址是本地管理标识。

MAC 48 Address

由于Wi-Fi Direct只是在MAC之上的另一个堆栈,因此您还应该检查它对其意味着什么。我发现了一些邮件讨论,为此提供了一些启示。显然,以下引文来自WFA规范。
“P2P设备应分配P2P接口地址,相应地对应于IEEE Std 802.11-2007 1第7.1.3.3.1节中描述的格式,该格式用于与P2P组所有者或P2P组内的客户端通信。 P2P接口地址不需要全局唯一,并且可以是本地管理的。如果满足本条款中对P2P接口地址的要求,则P2P接口地址可以与P2P设备地址相同。”
因此,我认为这个问题的答案是,您不应从WifiManager获取MAC地址并将其用于Wi-Fi P2P连接。

那么基本上只有前两个十六进制数字会改变?而且似乎只能上下移动两个位置。 - Mgamerz
我不确定。它可能意味着“不能保证地址仅用于列出的目的”,这意味着您的适配器将拥有常规的WiFi连接/MAC地址,而其他地址将用于Wi-Fi Direct。或者您可以同时拥有多个Wi-Fi Direct连接,并且它们之间可以具有不同的地址。它不是上下两个数字,也不是十六进制数字。请注意如何表达这些概念。((first_byte&0x02)!= 0)表示本地管理。 - auselen
我授予你赏金,因为它将帮助我编写针对我尚未拥有的设备的代码。谢谢! - Mgamerz
但是如果没有MAC地址,我该如何邀请别人加入我的WiFi直连组? - damian
我认为在SO上已经有过一些关于这个问题的讨论了。http://developer.android.com/training/connect-devices-wirelessly/nsd.html - auselen
@damian 请访问以下链接:http://developer.android.com/training/connect-devices-wirelessly/nsd-wifi-direct.html - auselen

4

在项目中我一直在寻找这个功能。我的需求是在WiFi Direct组成的临时P2P网络中唯一地识别设备。每个设备都应该能够在下次接近时识别其朋友设备。我需要使用自己的WiFi(Direct)MAC地址和我的朋友们的地址创建一个密钥,以创建这个朋友区域。

我的研究: 设计是这样的,有一个唯一的通用ID和本地ID。原因: 通用ID只能用于连接基础设施模式网络。本地ID可以用于“点对点”模式网络(设备到设备)。在这种adhoc模式下,有可能单个设备同时属于几个adhoc群组。

  1. 因此,为了支持这些并发操作,P2P设备支持多个MAC实体,可能位于不同的频道上。
  2. 对于每个会话,永久组可能使用不同的频道和设备MAC。
  3. P2P设备在发现和协商过程中使用全球MAC地址作为设备ID,并在组内的所有帧中使用临时本地MAC地址。从这里理解

然而,没有一个简单明了的方法来获得自己的WiFi P2p MAC地址。问题53437:Android

在这个问题的讨论中,来自谷歌的项目成员建议这是可能的,只是还没有被记录下来。

解决方案:使用意图过滤器 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();
        }

希望这能帮到有需要的人!

0

你可以使用下面的代码获取WiFi直连地址:

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;

}


0

忘记Wifi管理器。 Wifi直接地址不等于MAC地址。 Wifi直接地址用于Wifi直接连接。您不能将其用于其他任何事情。

要使用wifi直接设备连接两个设备,您必须使用其中一个设备创建WifiP2pGroup。使用另一个设备,您必须搜索WifiP2pGroups,选择您的组,并连接。


0

iFixit表示,Galaxy Nexus使用BCM4330作为其MAC、基带和PHY,因此如果你有Broadcom的朋友,你可以问问他们。

不幸的是,数据表并非公开的;我能做的最好的事情就是给你提供一个框图链接


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接