反正有没有重置WifiP2pServiceImpl.java中定义的mServiceTransactionId? (好像我无法获得WifiP2pManager的多个实例)
我的问题的背景: 由于某些原因,我不得不在我的应用程序中一遍又一遍地调用WifiP2PManager.removeServiceRequest()和WifiP2pManager.addServiceRequest()。 但是在执行WifiP2pManager.addServiceRequest()时达到了一些可靠的结果
从日志目录中正确的服务发现如下所示:
12-02 10:45:32.437 1037-1105/? E/WifiHW: wifi_send_command enter;cmd:P2P_SERV_DISC_REQ 00:00:00:00:00:00 3100014c13776966696469726563746772656574696e677315776966696469726563747365727669636574797065c011001001;reply:b8c5c330;reply_len:8;
此处3100014c中的4c是WifiP2pServiceRequest的交易ID
错误的服务发现如下:
12-02 10:58:32.457 1037-1105/? E/WifiHW: wifi_send_command enter;cmd:P2P_SERV_DISC_REQ 00:00:00:00:00:00 310001ffffff8d13776966696469726563746772656574696e677315776966696469726563747365727669636574797065c011001001;reply:b8c7e770;reply_len:8;
此处ff(来自310001ff)是WifiP2pServiceRequest的事务ID,看起来不正确。
来自WifiP2pServiceRequest.java 我们可以看到wifip2p请求的生成方式:
public String getSupplicantQuery() {
StringBuffer sb = new StringBuffer();
// length is retained as little endian format.
sb.append(String.format(Locale.US, "%02x", (mLength) & 0xff));
sb.append(String.format(Locale.US, "%02x", (mLength >> 8) & 0xff));
sb.append(String.format(Locale.US, "%02x", mProtocolType));
sb.append(String.format(Locale.US, "%02x", mTransId));
if (mQuery != null) {
sb.append(mQuery);
}
return sb.toString();
}
调用WifiP2pManager.addServiceRequest()时,通过WifiP2pServiceImpl.java中定义的mServiceTransactionId将事务ID加1。
private boolean addServiceRequest(Messenger m, WifiP2pServiceRequest req) {
clearClientDeadChannels();
ClientInfo clientInfo = getClientInfo(m, true);
if (clientInfo == null) {
return false;
}
++mServiceTransactionId;
//The Wi-Fi p2p spec says transaction id should be non-zero
if (mServiceTransactionId == 0) ++mServiceTransactionId;
req.setTransactionId(mServiceTransactionId);
clientInfo.mReqList.put(mServiceTransactionId, req);
if (mServiceDiscReqId == null) {
return true;
}
return updateSupplicantServiceRequest();
}
此mServiceTransactionId定义为WifiP2pServiceImpl.java中的一个字节,它将溢出并引起我遇到的那种错误。这就是为什么我想暂时重置此变量以避免任何溢出的原因。
private byte mServiceTransactionId = 0;
关闭整个Wifi连接,然后再打开它会根据我的实验重置此mServiceTransactionId,但我想知道有没有办法吗? (有一个线程在讨论如何disable WifiP2P,但我无法根据该线程的答案仅关闭Wifi P2P。)
非常感谢。