Jump to content
Sim Master

[ANDROID] BT Socket

Recommended Posts

Posted

Am creat o aplicatie de android care consta intr-un client si un server. Comunicarea se face prin bluetooth sockets. Totul merge bine, serverul ruleaza in background si asteapta incontinuu conexiuni de la clienti. Problema este ca se descarca bateria prea repede pe telefonul pe care este instalat serverul.

Un approach pe care l-am folosit ca sa realizez serverul si care pare sa manance repede din baterie este asta:


BluetoothSocket bt_socket = null;
BluetoothServerSocket bt_conn = null;

try {

bt_conn = bt.listenUsingRfcommWithServiceRecord("GEAR_SMS", UUID.fromString(uuid_str));

while (true) {
bt_socket = bt_conn.accept();
new Thread(new BtSocket(bt_socket)).start();
}

} catch (Exception e) {
e.printStackTrace();
}

In marea parte a timpului serverul este idle si doar asteapta conexiuni, deci consumul ridicat de baterie se poate rezuma doar la bucata asta:


while (true) {
bt_socket = bt_conn.accept();
}

Exista alta metoda de a realiza astfel de conexiuni intre client si server, dar fara a consuma bateria? Sau fac eu ceva gresit?

Posted

Daca e facut in java, dupa ce verifici pui un Thread.sleep(1000);, in felul asta in loc sa consume verifice dupa conexiuni de 10000 ori pe secunda, verifica doar 1 data pe secunda, in felul asta bateria ar trebui sa tina mult mai mult deoarece procesorul/memoria nu sunt utilizate in timpul in care threadul "doarme". In cazul in care nu este java, ci alt limbaj, incearca sa cauti sa vezi daca limbajul respectiv are o functie similara.

Posted

Ar fi o idee, dar faza e ca, la fel ca si la tcp sockets, cand ajunge la linia bt_conn.accept(); sta si asteapta pana se conecteaza un client. Asta inseamna ca in while-ul ala nu vor fi multe iteratii pe secunda, ci poate chiar o singura iteratie pe ora.

Si da, e java.

Posted (edited)

Incearca sa pui un timeout la Accept.

Aici spune ca .Accept poate sa accepte un timer pentru timeout.

Sugerez sa folosesti 100 pentru timeout, dupa care chemi Thread.Sleep(900);

Teoretic ar trebui sa nu mai consume decat 10% din puterea respectiva.

Le.

Daca ma gandesc mai bine, cred ca nu e ok cum am spus eu, pentru ca o sa dea Exceptie.


while(true)
{
try {
Thread.Sleep(900);
bt_socket = bt_conn.accept(100);
new Thread(new BtSocket(bt_socket)).start();
} catch (Exception e) {
e.printStackTrace();
}
}

Edited by nedo
Posted

Ai verificat daca se fac conexiunile cum trebuie? Verifica, eventual verifica si daca dupa ce creezi o conexiune si o inchizi, serverul raspunde la alte conexiuni. Iar despre exceptie imi faceam griji deoarece ma gandesc ca exista posibilitatea ca atunci cand e apelata exceptia aia, iti inchide serverul, nu am lucrat cu exceptii/trow prea mult si nu stiu exact cum se comporta. De asemenea sugerez sa faci un test ceva ca sa nu printeze mereu aceeasi chestie, pentru ca, daca am citit bine, ar trebui sa iti dea exceptia aia o data pe secunda.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...