你如何检索WiFi直接MAC地址?

时间:2012-05-18 09:48:46

标签: android wifi-direct

我正在尝试检索Android设备的MAC地址。如果启用了WiFi,通常可以通过WiFiManager API实现。

如果WiFi已关闭且WiFi Direct已开启,有没有办法获取MAC地址? WiFi和WiFi Direct无法在手机上同时开启。

由于

4 个答案:

答案 0 :(得分:10)

我在项目期间一直在寻找这个。我的要求是在使用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地址。 Understood from here
  4. 然而,没有直接的方法来获得自己的WiFi P2p MAC地址。 Issue 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();
            }
    

    希望这有助于某人!

答案 1 :(得分:2)

WiFi的mac地址与WiFi Direct的mac地址不同。通常前两个字母可能不同。小心一点。

答案 2 :(得分:2)

WiFi的mac地址与WiFi Direct的mac地址不同。

您可以使用下一代码获取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;
}

答案 3 :(得分:0)

WiFi Direct mac地址会有所不同。这是@auselen在https://stackoverflow.com/a/14480530/3167704精心解释的。

我刚刚想出了一种检索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));
        }
    });