8

我目前正在尝试通过 Wi-Fi Direct 连接两部知道对方 MAC 地址的手机,但偶然发现了以下问题:我收到的 MAC 地址

    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 和 P2P/Direct)的同一个 Wi-Fi 模块. 这很奇怪..我该怎么办?对于我拥有的两台设备(Galaxy Nexus),始终只有前两个字符的 MAC 地址不同——我应该简单地丢弃它们吗?遇到问题(仅 MAC 地址第一部分不同的两个设备)的概率是否太高?

谢谢。

4

6 回答 6

4

在我的项目中,我一直在寻找这个。我的要求是在使用 WiFi Direct 形成的 adhoc P2p 网络中唯一标识设备。每个设备下次靠近时应识别其朋友设备。我需要我自己的 WiFi(直接)MAC 和我朋友的来创建这个朋友区创建的密钥。

我的研究:设计的方式是有一个唯一的通用 ID 和一个本地 ID。原因:通用 ID 只能用于连接到基础架构模式网络。本地 ID 可用于“ad-hoc”模式网络(设备到设备)。在这种 ad-hoc 模式下,单个设备可能同时属于多个 ad-hoc 组。

  1. 因此,为了支持这种并发操作,P2p 设备支持多个 MAC 实体,可能在不同的通道上。
  2. 对于每个会话,持久组可以为每个会话使用不同的通道和设备 MAC。
  3. P2P 设备在发现和协商期间使用其全局 MAC 地址作为设备 ID,并为组内的所有帧使用临时本地 MAC 地址。从这里了解

但是,没有直接的方法来获取自己的 WiFi P2p MAC 地址。问题 53437:安卓

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

解决方案:使用意图过滤器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 地址

地址可以是普遍管理的地址,也可以是本地管理的地址。

通过设置地址最高有效字节的第二低位来区分通用管理地址和本地管理地址。该位也称为 U/L 位,是 Universal/Local 的缩写,用于标识地址的管理方式。如果该位为 0,则该地址是通用管理的。如果为 1,则地址是本地管理的。

MAC 48 地址

由于 Wi-Fi Direct 只是 MAC 之上的另一个堆栈,因此您还应该检查该位对它的含义。我发现一些邮件讨论对此有所了解。显然下面的引用来自 WFA 规范。

P2P 设备应分配一个 P2P 接口地址,对应于 IEEE Std 802.11-2007 1 §7.1.3.3.1 中描述的格式,用于与 P2P 组所有者或 P2P 组内的客户端通信。P2P 接口地址不需要是全球唯一的,可以在本地管理。P2P 接口地址可以与 P2P 设备地址相同,前提是满足本节中对 P2P 接口地址的要求。

所以我相信这个问题的答案是,你不应该从中获取 MAC 地址WifiManager并将其用于Wi-Fi P2P连接。

于 2013-01-23T13:11:09.853 回答
0

iFixit 说Galaxy Nexus 使用 BCM4330 作为其 MAC、基带和 PHY,所以如果你在 Broadcom 有任何朋友,你可以问他们。

可悲的是,数据表不公开。我能做的最好的就是把你链接到一个框图

于 2012-09-24T03:12:22.747 回答
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

忘记 Wifi 管理器。Wifi 直接地址不等于 MAC 地址。Wifi 直接地址用于 wifi 直接连接。你不能使用其他任何东西。

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

于 2015-03-03T14:56:34.723 回答
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;

}

于 2015-04-16T16:48:22.340 回答