我正在尝试通过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模块(正常的Wi-Fi和P2P / Direct) 。这很奇怪..
我该怎么办?对于我所拥有的两个设备(Galaxy Nexus),它总是只有前两个字符在MAC地址上有所不同 - 我应该简单地丢弃它们吗?遇到问题的可能性(两个仅在MAC地址的第一部分不同的设备)是否过高?
感谢。
答案 0 :(得分:4)
阅读维基百科上的MAC address。
地址可以是普遍管理的地址,也可以是本地管理的地址。
通过设置地址的最高有效字节的第二最低有效位来区分通用管理和本地管理的地址。该位也称为U / L位,是Universal / Local的缩写,用于标识地址的管理方式。如果该位为0,则通用地管理该地址。如果为1,则在本地管理地址。
由于Wi-Fi Direct只是MAC上的另一个堆栈,因此您还应该检查该位对它的意义。我发现有些mail discussion对此有所了解。显然,下面的报价来自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
个连接。
答案 1 :(得分:4)
我在项目期间一直在寻找这个。我的要求是在使用WiFi Direct形成的adhoc P2p网络中唯一识别设备。每个设备在下次接近时都应该识别其朋友设备。我需要自己的WiFi(直接)MAC和我的朋友们为这个朋友区域创建创建一个密钥。
我的研究:设计的方式是具有唯一通用ID和本地ID。 原因:通用ID只能用于连接到基础架构模式网络。本地ID可用于“ad-hoc”模式网络(设备到设备)。在这种ad-hoc模式中,单个设备可能同时属于几个ad-hoc组。
然而,没有直接的方法来获得自己的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();
}
希望这有助于某人!
答案 2 :(得分:0)
iFixit says Galaxy Nexus使用BCM4330作为MAC,Baseband和PHY,所以如果你在Broadcom有任何朋友,你可以问他们。
可悲的是,数据表不公开;我能做的最好的事情是将你链接到block diagram。
答案 3 :(得分: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));
}
});
答案 4 :(得分:0)
忘记Wifi经理。 Wifi直接地址不等于MAC地址。 Wifi直接地址用于wifi直接连接。你无法使用其他任何东西。
要使用wifi直连设备连接两台设备,您必须使用其中一台设备创建WifiP2pGroup。使用您的其他设备,您必须搜索WifiP2pGroups,选择您的,并连接。
答案 5 :(得分: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;
}