Abo
  • Services:
Anzeige
Raspberry Pi mit Bluetooth-Dongle und Breadboard
Raspberry Pi mit Bluetooth-Dongle und Breadboard (Bild: Golem.de)

Tasterwert lesen und senden

Anzeige

Das erste Characteristic LedReadCharacteristic liefert den Zustand des Tasters zurück. Diese Klasse wird von bleno.Characteristic abgeleitet.

  1. function LedReadCharacteristic() {
  2. LedReadCharacteristic.super_.call(this, {
  3. uuid: '6ee494e0bb8711e3891a0002a5d5c51b',
  4. properties: ['read', 'notify'],
  5. descriptors: [
  6. new BlenoDescriptor({
  7. uuid: '792e3fa0bb8711e390640002a5d5c51b',
  8. value: 'Led read'
  9. })
  10. ]
  11. });
  12. }
  13. util.inherits(LedReadCharacteristic, bleno.Characteristic);

Auch hier vergeben wir wieder eine UUID, diese kann sich von der UUID des Services ableiten, muss das aber nicht. Der Descriptor-Eintrag ist eine optionale Textbeschreibung des Characteristic. Entscheidend für ein Characteristic sind aber dessen Eigenschaften, sie werden im properties-Eintrag angegeben. Die Eigenschaft "read" drückt aus, dass ein Central-Modul einen Wert vom Characteristic lesen kann.

Nun kann aber der Taster jederzeit gedrückt werden, ein Central-Modul müsste also ständig unser Peripheral abfragen. Um das zu vermeiden, setzen wir auch die Eigenschaft "notify". Ein Central-Modul kann dann dieses Characteristic abonnieren. Das bedeutet: Das Peripheral schickt von sich aus einen Wert an das Central-Modul - in unserem Fall, wenn sich der Zustand des Tasters ändert.

Für beide Eigenschaften müssen wir je eine Methode definieren, deren Logik sich allerdings deutlich unterscheidet.

  1. LedReadCharacteristic.prototype.onReadRequest = function(offset, callback)
  2. {
  3. if (offset) {
  4. callback(BlenoCharacteristic.RESULT_ATTR_NOT_LONG, null);
  5. } else {
  6. if(null != buttonValue) {
  7. callback(BlenoCharacteristic.RESULT_SUCCESS, buttonValue);
  8. };
  9. }
  10. };

Die Methode onReadRequest wird von Bleno aufgerufen, wenn ein Central-Modul einen Wert lesen will - und muss demzufolge einen Wert zurückliefern. Der Wert wird über eine Callback-Methode übermittelt, die unserer Methode als zweiter Parameter übergeben wird.

Diese Callback-Methode wird mit zwei Argumenten aufgerufen: dem Status der Antwort und dem eigentlichen zu übermittelnden Wert, Letzterer in Form eines Buffer-Objektes von Node.js. Zu der Frage, woher dieser Wert in der globalen Variable buttonValue kommt, und zur Aufgabe des Objekts kommen wir weiter unten.

Die offset-Variable hat für unsere Aufgabe keine weitere Bedeutung. Zum Verständnis: Bluetooth überträgt die Daten paketweise, wobei diese Pakete sehr klein sind. Um größere Datenmengen zu übertragen, müssen diese aufgeteilt werden. Deswegen kann die onReadMethode mit aufsteigenden Offsets aufgerufen werden, um die Portionen eines einzelnen Wertes - zum Beispiel bei einer langen Zeichenkette - stückweise zu übertragen. Da wir aber hier grundsätzlich nur einen einzelnen Wert von 8 Bit Länge übertragen, signalisieren wir bei Offsets größer 0, dass keine weiteren Datenstücke mehr vorhanden sind.

Für die Notify-Eigenschaft müssen wir erst einmal recht wenig tun:

  1. LedReadCharacteristic.prototype.onSubscribe
  2. = function(maxValueSize, updateValueCallback) {
  3. onButtonStateCallback = updateValueCallback;
  4. };

Die Variable updateValueCallback verweist auf eine Callback-Funktion, die wir aufrufen müssen, wenn es gilt, ein Central-Modul über einen neuen Wert zu informieren. Wir speichern diese Funkion in einer globalen Variable.

Den Zustand des Tasters erfragt alle 200 Millisekunden eine Funktion des Peripheral-Skriptes. Dazu nutzt es normale Dateioperationen und das dateibasierte Interface für die GPIO-Pin unter /sys/class/gpio. Der Artikel Hardware, die sich freut geht darauf intensiv ein, hier verwenden wir ein ähnliches Konzept, aber eben unter Node.js und Javascript statt Python.

Im Kern lesen wir den Wert der Datei /sys/class/gpio/gpio21/value ein, an Pin 21 ist der Taster angeschlossen. Ist der Taster gedrückt, erhalten wir "1", ansonsten "0". Diesen Zahlwert in einer Zeichenkette wandeln wir um in einen Integerwert, den wir wiederum einem Buffer-Objekt übergeben:

  1. var sc = fs.readFileSync('/sys/class/gpio/gpio21/value', 'utf-8');
  2. var buffer = new Buffer(1);
  3. buffer.writeUInt8(parseInt(sc),0);
  4. buttonValue = buffer;

Der Grund für diese anscheinend umständliche Logik liegt in Node.js. Das kann zwar wunderbar mit UTF-8 umgehen, benötigt aber Hilfe bei binären Daten und Strömen. Dafür gibt es die Buffer-Klasse. Da der Bluetooth-Treiber mit binären Datenströmen arbeitet und bei einer schwachtypisierten Sprache wie Javascript der Datentyp im Skript nicht unbedingt eindeutig ist, müssen wir die Daten entsprechend über Buffer-Objekte kapseln.

Jedes Mal, wenn der Status des Tasters ermittelt wurde, wird verglichen, ob es eine Änderung zum vorherigen Status gab. Ist das der Fall, wird die Callback-Funktion des Notify aufgerufen. Dieser Methode muss lediglich der zu liefernde Wert als Buffer-Objekt übergeben werden.

  1. function buttonStateChanged() {
  2. if(null != onButtonStateCallback) {
  3. onButtonStateCallback(buttonValue);
  4. }
  5. }

 Das Peripheral-ModulLED an- und ausschalten 

eye home zur Startseite
Panzergerd 25. Sep 2015

Inzwischen gibt es bei BlueZ auch GATT-Support via D-Bus. Mit den Beispielprogrammen...

pUiE 10. Jun 2014

Um eine Verbindung von Android Smartphone zu µC herzustellen (zu testzwecken...

Tylon 25. Apr 2014

Sehr schön! An den Threadersteller: wer benötigt auch dB als Angabe bei den...

MarioWario 24. Apr 2014

Ja, im Bereich der Kraft-/Leistungsmesser ist ANT+ noch wichtig (momentan; http://www...



Anzeige

Stellenmarkt
  1. Broetje-Automation, Rastede
  2. transact Elektronische Zahlungssysteme GmbH dba. epay, Planegg/Martinsried bei München
  3. LEW Verteilnetz GmbH, Augsburg
  4. Gundlach Bau und Immobilien GmbH & Co. KG, Hannover


Anzeige
Spiele-Angebote
  1. 69,99€
  2. 6,99€
  3. 15,99€

Folgen Sie uns
       


  1. Samsung zum Galaxy Note 7

    Schuld waren die Akkus

  2. Automute

    Stummschalten beim Ausstöpseln der Kopfhörer

  3. Neue Hardwaregeneration

    Tesla-Autopilot 2.0 nur bis 72 km/h aktiv

  4. Digitale Assistenten

    LG hat für das G6 mit Google und Amazon verhandelt

  5. Instant Tethering

    Googles automatischer WLAN-Hotspot

  6. 5G-Mobilfunk

    Netzbetreiber erhalten Hilfe bei Suche nach Funkmastplätzen

  7. Tinker-Board

    Asus bringt Raspberry-Pi-Klon

  8. Privatsphäre

    Verschlüsselter E-Mail-Dienst Lavabit kommt wieder

  9. Potus

    Donald Trump übernimmt präsidiales Twitter-Konto

  10. Funkchips

    Apple klagt gegen Qualcomm



Haben wir etwas übersehen?

E-Mail an news@golem.de


Anzeige
Reverse Engineering: Mehr Spaß mit Amazons Dash-Button
Reverse Engineering
Mehr Spaß mit Amazons Dash-Button
  1. Online-Einkauf Amazon startet virtuelle Dash-Buttons

Glasfaser: Nun hängt die Kabel doch endlich auf!
Glasfaser
Nun hängt die Kabel doch endlich auf!
  1. US-Präsident Zuck it, Trump!
  2. Fake News Für Facebook wird es hässlich
  3. Nach Angriff auf Telekom Mit dem Strafrecht Router ins Terrorcamp schicken oder so

Western Digital Pidrive im Test: Festplatte am Raspberry Pi leicht gemacht
Western Digital Pidrive im Test
Festplatte am Raspberry Pi leicht gemacht
  1. DACBerry One Soundkarte für Raspberry Pi liefert Töne digital und analog
  2. Sopine A64 Weiterer Bastelrechner im Speicherriegel-Format erscheint
  3. Bootcode Freie Firmware für Raspberry Pi startet Linux-Kernel

  1. Re: Manipulative Bildauswahl

    der_wahre_hannes | 09:35

  2. Re: Na und?

    Moe479 | 09:34

  3. Re: Nach Zelda, was mit der Switch machen?

    PiranhA | 09:31

  4. Re: Was für ein Fusch

    bofhl | 09:29

  5. Re: Warum berichten alle über diese kleine App?

    My1 | 09:27


  1. 08:36

  2. 07:26

  3. 07:14

  4. 11:29

  5. 10:37

  6. 10:04

  7. 16:49

  8. 14:09


  1. Themen
  2. A
  3. B
  4. C
  5. D
  6. E
  7. F
  8. G
  9. H
  10. I
  11. J
  12. K
  13. L
  14. M
  15. N
  16. O
  17. P
  18. Q
  19. R
  20. S
  21. T
  22. U
  23. V
  24. W
  25. X
  26. Y
  27. Z
  28. #
 
    •  / 
    Zum Artikel