Android:如何为Wifi P2P重置服务交易ID(mServiceTransactionId)?

时间:2018-12-08 02:29:47

标签: android wifip2p

反正有没有重置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。)

非常感谢。

0 个答案:

没有答案