CommunicationThread.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package de.tudarmstadt.informatik.hostage.sync.bluetooth;
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import de.tudarmstadt.informatik.hostage.logging.NetworkRecord;
  10. import de.tudarmstadt.informatik.hostage.logging.SyncData;
  11. import de.tudarmstadt.informatik.hostage.logging.SyncInfo;
  12. import de.tudarmstadt.informatik.hostage.logging.SyncInfoRecord;
  13. import de.tudarmstadt.informatik.hostage.persistence.HostageDBOpenHelper;
  14. import de.tudarmstadt.informatik.hostage.sync.SyncMessage;
  15. import de.tudarmstadt.informatik.hostage.sync.Synchronizer;
  16. import de.tudarmstadt.informatik.hostage.sync.tracing.TracingSyncService;
  17. import android.bluetooth.BluetoothSocket;
  18. import android.content.Context;
  19. import android.os.Handler;
  20. import android.util.Log;
  21. /**
  22. * CommunicationThread is responsible for the exchange of synchronization messages between devices.
  23. * @author Lars Pandikow
  24. */
  25. public class CommunicationThread extends Thread {
  26. private final Context context;
  27. private final BluetoothSocket mmSocket;
  28. private final ObjectInputStream objectInput;
  29. private final ObjectOutputStream objectOuput;
  30. private final Handler mHandler;
  31. private final HostageDBOpenHelper mdbh;
  32. private Synchronizer synchronizer;
  33. public CommunicationThread(Context con, BluetoothSocket socket, Handler handler) {
  34. mmSocket = socket;
  35. mHandler = handler;
  36. context = con;
  37. mdbh = new HostageDBOpenHelper(context);
  38. synchronizer = new Synchronizer(mdbh);
  39. ObjectInputStream tmpIn = null;
  40. ObjectOutputStream tmpOut = null;
  41. // Get the input and output streams, using temp objects because
  42. // member streams are final
  43. try {
  44. tmpOut = new ObjectOutputStream(socket.getOutputStream());
  45. tmpIn = new ObjectInputStream(socket.getInputStream());
  46. } catch (IOException e) {
  47. mHandler.obtainMessage(BluetoothSyncActivity.CONNECTION_FAILED).sendToTarget();
  48. e.printStackTrace();
  49. }
  50. objectInput = tmpIn;
  51. objectOuput = tmpOut;
  52. }
  53. /* Call this from the main activity to shutdown the connection */
  54. public void cancel() {
  55. try {
  56. objectInput.close();
  57. objectOuput.close();
  58. mmSocket.close();
  59. } catch (IOException e) {
  60. }
  61. }
  62. @Override
  63. public void run() {
  64. HashMap<String, Long> devices = mdbh.getSyncDeviceHashMap();
  65. write(new SyncMessage(SyncMessage.SYNC_REQUEST, devices));
  66. // Keep listening to the InputStream until an exception occurs
  67. while (true) {
  68. try {
  69. Object inputObject = objectInput.readObject();
  70. if(inputObject instanceof SyncMessage){
  71. handleMessage((SyncMessage) inputObject);
  72. }
  73. } catch (ClassNotFoundException e) {
  74. e.printStackTrace();
  75. } catch (IOException e) {
  76. cancel();
  77. e.printStackTrace();
  78. break;
  79. }
  80. }
  81. }
  82. /**
  83. * Handles a received synchronization message.
  84. * @param message The received message.
  85. */
  86. private void handleMessage(SyncMessage message){
  87. Log.i("CommunicationThread", "Recieved: " + message.getMessage_code());
  88. switch(message.getMessage_code()){
  89. case SyncMessage.SYNC_REQUEST:
  90. mHandler.obtainMessage(BluetoothSyncActivity.SYNC_START).sendToTarget();
  91. SyncInfo thisSyncInfo = synchronizer.getSyncInfo();
  92. System.out.println("----------------------- Sent: " + Arrays.toString(thisSyncInfo.bssids.toArray()));
  93. write(new SyncMessage(SyncMessage.SYNC_RESPONSE_INFO, thisSyncInfo));
  94. break;
  95. case SyncMessage.SYNC_RESPONSE_INFO:
  96. SyncInfo otherSyncInfo = (SyncInfo) message.getPayload();
  97. System.out.println("----------------------- Received: " + Arrays.toString(otherSyncInfo.bssids.toArray()));
  98. System.out.println("----------------------- Received: " + otherSyncInfo.deviceMap.toString());
  99. SyncData thisSyncData = synchronizer.getSyncData(otherSyncInfo);
  100. write(new SyncMessage(SyncMessage.SYNC_RESPONSE_DATA, thisSyncData));
  101. System.out.println("----------------------- Sent: " + thisSyncData.syncRecords.toString());
  102. System.out.println("----------------------- Sent: " + thisSyncData.networkRecords.toString());
  103. break;
  104. case SyncMessage.SYNC_RESPONSE_DATA:
  105. SyncData otherData = (SyncData) message.getPayload();
  106. System.out.println("----------------------- Received: " + otherData.syncRecords.toString());
  107. System.out.println("----------------------- Received: " + otherData.networkRecords.toString());
  108. synchronizer.updateFromSyncData(otherData);
  109. mHandler.obtainMessage(BluetoothSyncActivity.SYNC_SUCCESSFUL).sendToTarget();
  110. break;
  111. }
  112. }
  113. /**
  114. * Send a message to the remote device.
  115. * @param message The message to send.
  116. */
  117. public void write(SyncMessage message) {
  118. try {
  119. objectOuput.writeObject(message);
  120. } catch (IOException e) {
  121. mHandler.obtainMessage(BluetoothSyncActivity.CONNECTION_FAILED).sendToTarget();
  122. e.printStackTrace();
  123. }
  124. }
  125. }