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. Jobware Online-Service GmbH, Paderborn (Home-Office möglich)
  2. Dataport, Hamburg
  3. Ford-Werke GmbH, Köln, Aachen
  4. Zurich Gruppe Deutschland, Bonn


Anzeige
Spiele-Angebote
  1. 28,99€
  2. 13,99€
  3. 69,99€ (Vorbesteller-Preisgarantie)

Folgen Sie uns
       


  1. Elektronischer Personalausweis

    Das tote Pferd soll auferstehen

  2. Siege M04 im Test

    Creatives erste Sound-Blaster-Maus überzeugt

  3. Netgear GS510TLP

    Lüfterloser PoE+-Switch mit 75 Watt Power Budget

  4. Daimler

    Stromspeicher mit Mercedes-Stern für Sonnenenergie

  5. Spielentwickler

    Männlich, 34 Jahre alt und unterbezahlt

  6. Kontrollzentrum

    Drei Finger und das iPhone stürzt ab

  7. Supercharger

    Tesla will Supercharger-Netzwerk verdoppeln

  8. Internet of Things

    Bricker Bot soll 2 Millionen IoT-Geräte zerstört haben

  9. HP, Philips, Fujitsu

    Bloatware auf Millionen Notebooks ermöglicht Codeausführung

  10. Mali-C71

    ARM bringt seinen ersten ISP für Automotive



Haben wir etwas übersehen?

E-Mail an news@golem.de


Anzeige
In eigener Sache: Die Quanten kommen!
In eigener Sache
Die Quanten kommen!
  1. In eigener Sache Golem.de führt kostenpflichtige Links ein
  2. In eigener Sache Golem.de sucht Marketing Manager (w/m)
  3. In eigener Sache Golem.de geht auf Jobmessen

Elektromobilität: Wie kommt der Strom in die Tiefgarage?
Elektromobilität
Wie kommt der Strom in die Tiefgarage?
  1. Elektroauto Opel Ampera-E kostet inklusive Prämie ab 34.950 Euro
  2. Elektroauto Volkswagen I.D. Crozz soll als Crossover autonom fahren
  3. Sportback Concept Audis zweiter E-tron ist ein Sportwagen

DLR-Projekt Eden ISS: Das Paradies ist ein Container
DLR-Projekt Eden ISS
Das Paradies ist ein Container
  1. Weltraumschrott "Der neue Aspekt sind die Megakonstellationen"
  2. Transport Der Güterzug der Zukunft ist ein schneller Roboter
  3. "Die Astronautin" Ich habe heute leider keinen Flug ins All für dich

  1. Re: Noch zu teuer...

    Riemen | 09:52

  2. Und die deutschen Hersteller schauen weiter zu...

    karuso | 09:52

  3. Re: Das geht zu weit!

    forenuser | 09:52

  4. Re: Wenn es um Wumms geht,

    0xDEADC0DE | 09:51

  5. Re: Sinn?

    wasabi | 09:51


  1. 10:05

  2. 09:20

  3. 08:52

  4. 08:04

  5. 07:55

  6. 07:37

  7. 07:28

  8. 07:00


  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