Archive for November, 2018

trakkcor – bluetooth gps tracking

Monday, November 26th, 2018

Mein Open-Source Projekt “trakkcor” (vormals “hikr”) ist in der ersten stabilen Version auf Sourceforge verfügbar. Um was gehts? trakkcor ist ein J2ME-Midlet, dass Positionsdaten eines externen Bluetooth GPS-Empfängers aufzeichnet und bei Bedarf via HTTP POST an einen beliebigen Server schickt. Der Server kann die empfangenen Positionsdaten weiterverarbeiten und beispielsweise den Track über Google Maps darstellen.

Mehr Details gibts unter http://www.trakkcor.ch

Screenshot

trakkcor auf einem Sony Ericsson W800i.

JABWT (JSR-82) Teil 5: Discovery Agent und DiscoveryListener

Sunday, November 11th, 2018

Ausgangspunkt für die Suche von Bluetoothgeräten ist die Klasse DiscoveryAgent. Sie erlaubt die Suche nach Geräten und Diensten. Dabei wird die Suche im Hintergrund ausgeführt und blockiert nicht die Applikation. Wird ein Gerät oder ein Dienst gefunden, dann wird dies über ein Listener, dem DiscoveryListener, mitgeteilt.

Der Entwickler implementiert diesen Listener und übergibt ihn beim Start der Suche. Die JABWT-Implementierung ruft die Methoden dieses Listeners auf und übermittelt gefundene Geräte (Klasse RemoteDevice) bzw. Dienste (Interface ServiceRecord) als Übergabeparameter. Mit Hilfe dieser Objekte erhält man den Connection String (den wir ja nicht mehr hartcodieren möchten )

;)

Im nachfolgenden Beispiel wird zunächst eine Suche nach Geräten mit der major device class “peripheral” ausgeführt. Anschliessend wird auf einem gefundenen Gerät die Suche nach dem RFCOMM-Dienst gestartet.

Beispielcode:

  1. DiscoveryListener listener= new DiscoveryListener() {
  2. public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
  3. // Ein Bluetoothgerät wurde gefunden.
  4. // Filterung nach Major Device Class “Peripheral”
  5. if ((deviceClass.getMajorDeviceClass() & 0x500) != 0) {
  6. // Speichern des remoteDevice in eine Liste
  7.     }
  8.     …
  9.   }
  10. public void servicesDiscovered(int i, ServiceRecord[] sr) {
  11. // Ein oder mehrere Dienste wurden gefunden.
  12. int reqSecurity = ServiceRecord.NOAUTHENTICATE_NOENCRYPT;
  13. boolean mustBeMaster = false;
  14. String connectionURL = sr[0].getConnectionURL(reqSecurity, mustBeMaster);
  15.     …
  16.   }
  17.  
  18. public void serviceSearchCompleted(int transactionID, int responseCode) {
  19. // Abschluss der Suche nach Diensten.
  20. if (responseCode == DiscoveryListener.SERVICE_SEARCH_ERROR) {
  21. // Suche war nicht erfolgreich -> Fehlerbehandlung
  22.         }
  23.     …
  24.     }
  25.  
  26.     public void inquiryCompleted(int discType) {
  27. // Abschluss der Suche nach Geräten.
  28. if (discType == DiscoveryListener.INQUIRY_ERROR) {
  29. // Suche war nicht erfolgreich -> Fehlerbehandlung
  30.         }
  31.         …
  32.     }
  33. }
  34.  
  35. LocalDevice local   = LocalDevice.getLocalDevice();
  36. DiscoveryAgent agent   = local.getDiscoveryAgent();
  37.  
  38. // Suche nach Geräten starten
  39. agent.startInquiry(DiscoveryAgent.GIAC, listener);
  40.  
  41. // Suche nach RFCOMM Dienst (0x0003) auf einem bereits gefundenen Gerät starten
  42. UUID[] uuidSet = new UUID[] { new UUID(0x0003) };
  43. int[] attrSet  = null; // null, weil uns nur die Default Attribute interessieren
  44. agent.searchServices(attrSet, uuidSet, remoteDevice, listener);