我目前正试图连接两部手机哪知道通过Wi-Fi直连对方的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直连MAC地址”,和我想象的MAC地址应该是唯一的,这是相同的Wi-Fi模块可以同时处理(正常Wi-Fi和P2P /直) 。 这是很奇怪..我该怎么办? 对于两个设备(Galaxy Nexus的)我有,它总是只有在MAC地址不同的前两个字符 - 我应该简单地将它们丢弃? 是遇到的问题(两个设备仅在MAC的第一部分地址不同)过高的概率是多少?
谢谢。
阅读有关的MAC地址在维基百科。
地址可以被普遍施用地址或局部施用的地址。
普遍施用和局部施用的地址被通过设置地址的最高显著字节的第二最低位显著区分。 该位也被称为U / L位,短通用/本地,它标识地址是如何给药。 如果该位为0时,地址被普遍施用。 如果是1,该地址是本地管理。
由于Wi-Fi直仅仅是对MAC的顶部的另一个堆栈,你也应该检查什么该位可能意味着它。 我已经发现了一些邮件讨论脱落在这一些轻。 显然,下面的报价是从WFA规范。
P2P装置应分配一个P2P接口地址,作为IEEE标准802.11-2007中§7.1.3.3.1描述对应于格式1 ,它是用来与P2P组内的P2P组所有者或客户端进行通信。 P2P接口地址是不要求是全球唯一的,并且可以被局部施用。 P2P接口地址可能是一样的P2P设备地址提供本条款中对于P2P接口地址的要求得到满足。
所以,我认为这个问题的答案是,你不应该采取MAC地址WifiManager
,并使用它Wi-Fi P2P
连接。
我的项目中,我一直在寻找这一点。 我的要求是唯一标识与wifi直连形成自组织P2P网络设备。 每个设备都应当它进入接近下一次识别其朋友设备。 我需要我自己的WiFi(直接)MAC和我的朋友,以创建这个朋友创建安全区的关键。
我的研究:设计是这样的方式,有一个通用唯一ID和本地ID。 原因:通用ID只能用于连接到基础架构模式的网络。 本地ID可以用于“自组织”网络模式(设备装置)。 在这种ad-hoc模式,有一个单一的设备可能simultaneosly属于多个ad-hoc群组的可能性。
- 因此,为了支持这一并发操作,P2P设备支持多个MAC实体,可能在不同的信道。
- 对于每个会话,持久组可以使用为每个会话不同的信道和设备MAC。
- P2P设备发现和协商,暂时的本地MAC地址组内的所有帧中使用他们的全球MAC地址作为设备ID。 从这里了解
但是,获得了自己的无线网络连接的p2p MAC地址NO直接的方式。 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();
}
希望这可以帮助别人!
iFixit的说的是,Galaxy Nexus的用于其MAC,基带和PHY的BCM4330,所以如果您有任何Broadcom的朋友,你可以问他们。
可悲的是,数据表是不公开的; 我能做的最好的是您链接到一个框图 。
我挣扎了一夜想出一个方法来检索wifi直连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));
}
});
忘记WiFi管理。 wifi直连地址不等于MAC地址。 wifi直连地址用来WIFI直接连接。 您不能使用其他任何事情。
要连接带wifi直设备中的两个设备,你必须创建一个WifiP2pGroup与您的设备之一。 有了您的另一台设备,你要搜索的WifiP2pGroups,选择你的,并连接。
您可以使用下面的代码获得直接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;
}