Android Wi-Fi Direct P2P 连接到多个设备
Android Wi-Fi Direct P2P connect to multiple devices
我在尝试连接到多个设备时遇到问题 运行 同一个应用程序。我的应用程序的工作流程是:
- 一个设备调用发现对等点(参见代码 A)
- 一旦发现对等节点,我就会显示一个 AlertDialog,允许用户select他们想连接到哪些对等节点(参见代码 B)
- 一旦用户 select 有了他们想要连接的设备,我就会尝试遍历 WifiP2pDeviceList 并在每个传入的设备上调用连接方法(我总是设置当前设备的意图作为群组所有者)(参见代码 C)
- 建立连接后,我会传输一些数据....
问题:在第3步中,当我调用connect方法时,代码连接到第一个设备没有任何问题,但是当它进行到第二个循环迭代时连接对于 selected 的第二个或第三个设备,我遇到了故障,原因代码为 2(忙碌)。为什么会这样?当我只连接到一台设备时一切正常,只有当我尝试连接到多个设备时才会出现问题?我究竟做错了什么?我找不到任何有关如何连接到多个设备的示例...非常感谢任何帮助。
代码 A:(发现同行)
private WifiP2pManager mManager;
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
onInitiateDiscovery();
}
@Override
public void onFailure(int reasonCode) {
Toast.makeText(getActivity(), "Discovery Failed: " + getReascodeText(reasonCode), Toast.LENGTH_SHORT).show();
}
});
代码 B:(select 个您要连接的节点)
public void onPeersAvailable(WifiP2pDeviceList peers) {
final ArrayList<Integer> itemsSelected = new ArrayList<>();
// Out with the old, in with the new.
mPeers.clear();
mPeers.addAll(peers.getDeviceList());
CharSequence[] cs = StringUtils.getDeviceNames(mPeers);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Who do you want to share with?");
builder.setMultiChoiceItems(cs, null, new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int selectedItemId, boolean isChecked) {
if (isChecked) {
itemsSelected.add(selectedItemId);
} else if (itemsSelected.contains(selectedItemId)) {
itemsSelected.remove(Integer.valueOf(selectedItemId));
}
}
}).setPositiveButton("Done!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
WifiP2pDevice wifiP2pDevice = mPeers.get(itemsSelected.get(0));
List<WifiP2pDevice> devices = extractSelectedDevices(itemsSelected,mPeers);
numConnections = devices.size();
connect(devices);
}
});
mPeerSelectionDialog = builder.create();
mPeerSelectionDialog.show();
}
代码 C:(连接到 selected 设备)
public void connect(List<WifiP2pDevice> devices) {
for(WifiP2pDevice device: devices) {
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
config.groupOwnerIntent = 15;
mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// WiFiDirectBroadcastReceiver will notify us. Ignore for now.
System.out.println("successfully connected!!");
Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Successfully Connected!<<<<<<<<<<<");
}
@Override
public void onFailure(int reason) {
Toast.makeText(getActivity(), "Connect failed. Retry.", Toast.LENGTH_SHORT).show();
Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Failed connection, rasoncode:"+reason+" !<<<<<<<<<<<");
}
});
}
没错,在连接到第一台设备后,它将无法连接并显示繁忙错误代码。原因是您设备上的WiFiP2P还没有完成第一次设备连接过程(即使您已经接受连接并建立连接,但创建组和释放资源仍然需要一些时间)。
为了解决这个问题,您可以启动另一个线程,延迟一些(根据我的测试至少 10-15 秒)以尝试连接到第二个设备。
祝你好运。
我在尝试连接到多个设备时遇到问题 运行 同一个应用程序。我的应用程序的工作流程是:
- 一个设备调用发现对等点(参见代码 A)
- 一旦发现对等节点,我就会显示一个 AlertDialog,允许用户select他们想连接到哪些对等节点(参见代码 B)
- 一旦用户 select 有了他们想要连接的设备,我就会尝试遍历 WifiP2pDeviceList 并在每个传入的设备上调用连接方法(我总是设置当前设备的意图作为群组所有者)(参见代码 C)
- 建立连接后,我会传输一些数据....
问题:在第3步中,当我调用connect方法时,代码连接到第一个设备没有任何问题,但是当它进行到第二个循环迭代时连接对于 selected 的第二个或第三个设备,我遇到了故障,原因代码为 2(忙碌)。为什么会这样?当我只连接到一台设备时一切正常,只有当我尝试连接到多个设备时才会出现问题?我究竟做错了什么?我找不到任何有关如何连接到多个设备的示例...非常感谢任何帮助。
代码 A:(发现同行)
private WifiP2pManager mManager;
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
onInitiateDiscovery();
}
@Override
public void onFailure(int reasonCode) {
Toast.makeText(getActivity(), "Discovery Failed: " + getReascodeText(reasonCode), Toast.LENGTH_SHORT).show();
}
});
代码 B:(select 个您要连接的节点)
public void onPeersAvailable(WifiP2pDeviceList peers) {
final ArrayList<Integer> itemsSelected = new ArrayList<>();
// Out with the old, in with the new.
mPeers.clear();
mPeers.addAll(peers.getDeviceList());
CharSequence[] cs = StringUtils.getDeviceNames(mPeers);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Who do you want to share with?");
builder.setMultiChoiceItems(cs, null, new DialogInterface.OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int selectedItemId, boolean isChecked) {
if (isChecked) {
itemsSelected.add(selectedItemId);
} else if (itemsSelected.contains(selectedItemId)) {
itemsSelected.remove(Integer.valueOf(selectedItemId));
}
}
}).setPositiveButton("Done!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
WifiP2pDevice wifiP2pDevice = mPeers.get(itemsSelected.get(0));
List<WifiP2pDevice> devices = extractSelectedDevices(itemsSelected,mPeers);
numConnections = devices.size();
connect(devices);
}
});
mPeerSelectionDialog = builder.create();
mPeerSelectionDialog.show();
}
代码 C:(连接到 selected 设备)
public void connect(List<WifiP2pDevice> devices) {
for(WifiP2pDevice device: devices) {
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
config.groupOwnerIntent = 15;
mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
// WiFiDirectBroadcastReceiver will notify us. Ignore for now.
System.out.println("successfully connected!!");
Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Successfully Connected!<<<<<<<<<<<");
}
@Override
public void onFailure(int reason) {
Toast.makeText(getActivity(), "Connect failed. Retry.", Toast.LENGTH_SHORT).show();
Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Failed connection, rasoncode:"+reason+" !<<<<<<<<<<<");
}
});
}
没错,在连接到第一台设备后,它将无法连接并显示繁忙错误代码。原因是您设备上的WiFiP2P还没有完成第一次设备连接过程(即使您已经接受连接并建立连接,但创建组和释放资源仍然需要一些时间)。
为了解决这个问题,您可以启动另一个线程,延迟一些(根据我的测试至少 10-15 秒)以尝试连接到第二个设备。
祝你好运。