Android: как сбросить идентификатор транзакции сервиса (mServiceTransactionId) для Wifi P2P? - PullRequest
0 голосов
/ 08 декабря 2018

Есть ли способ сбросить mServiceTransactionId, определенный в WifiP2pServiceImpl.java ?(Похоже, я не могу получить несколько экземпляров WifiP2pManager)

Справочная информация о моем вопросе: по какой-то причине мне пришлось вызывать WifiP2PManager.removeServiceRequest () и WifiP2pManager.addServiceRequest () снова и снова в моем приложении.Но добивайтесь некоторого надежного результата при выполнении WifiP2pManager.addServiceRequest ()

Из журнала cat правильное обнаружение службы выглядит следующим образом:

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;

Здесь 4c из 3100014c - это идентификатор транзакции WifiP2pServiceRequest

Неверное обнаружение службы выглядит следующим образом:

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, который выглядит неправильно.

С 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 () идентификатор транзакции увеличивается на 1 через mServiceTransactionId, определенный в WifiP2pServiceImpl.java

    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;

Отключение всего соединения Wi-Fi и последующее его включение сбросит этот mServiceTransactionId на основе моего эксперимента, но я хочу знать,есть ли способ сделать это?(Существует ветка, рассказывающая о том, как отключить WifiP2P , но я не могу отключить только Wifi P2P, основываясь на ответе этой ветки.)

Большое спасибо.

...