Есть ли способ сбросить 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, основываясь на ответе этой ветки.)
Большое спасибо.