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. Deichmann SE, Essen
  2. über Ratbacher GmbH, München
  3. Alfred Kärcher GmbH & Co. KG, Winnenden bei Stuttgart
  4. Robert Bosch GmbH, Leonberg


Anzeige
Blu-ray-Angebote
  1. 12,99€
  2. 17,97€
  3. (u. a. Apollo 13, Insidious, Horns, King Kong, E.T. The Untouchables, Der Sternwanderer)

Folgen Sie uns
       


  1. Apple

    Aktivierungssperre des iPads lässt sich umgehen

  2. Amazon

    Downloader-App aus dem Fire-TV-Store entfernt

  3. Autonomes Fahren

    Apple zeigt Interesse an selbstfahrenden Autos

  4. Sicherheit

    Geheimdienst warnt vor Cyberattacke auf russische Banken

  5. Super Mario Bros. (1985)

    Fahrt ab auf den Bruder!

  6. Canon EOS 5D Mark IV im Test

    Grundsolides Arbeitstier mit einer Portion Extravaganz

  7. PSX 2016

    Sony hat The Last of Us 2 angekündigt

  8. Raspberry Pi

    Schutz gegen Übernahme durch Hacker und Botnetze verbessert

  9. UHD-Blu-ray

    PowerDVD spielt 4K-Discs

  10. Raumfahrt

    Europa bleibt im All



Haben wir etwas übersehen?

E-Mail an news@golem.de


Anzeige
Nach Angriff auf Telekom: Mit dem Strafrecht Router ins Terrorcamp schicken oder so
Nach Angriff auf Telekom
Mit dem Strafrecht Router ins Terrorcamp schicken oder so
  1. 0-Day Tor und Firefox patchen ausgenutzten Javascript-Exploit
  2. Pornoseite Xhamster spricht von Fake-Leak
  3. Mitfahrgelegenheit.de 640.000 Ibans von Mitfahrzentrale-Nutzern kopiert

Digitalcharta: Operation am offenen Herzen der europäischen Demokratie
Digitalcharta
Operation am offenen Herzen der europäischen Demokratie
  1. EU-Kommission Mehrwertsteuer für digitale Medien soll sinken
  2. Vernetzte Geräte Verbraucherminister fordern Datenschutz im Haushalt
  3. Neue Richtlinie EU plant Netzsperren und Staatstrojaner

Garamantis: Vorsicht Vitrine, anfassen erwünscht!
Garamantis
Vorsicht Vitrine, anfassen erwünscht!
  1. Gentechnik Mediziner setzen einem Menschen Crispr-veränderte Zellen ein
  2. Zarm Zehn Sekunden schwerelos
  3. Mikroelektronik Wie eine Vakuumröhre - nur klein, stromsparend und schnell

  1. Re: Es sind immer die Ausländer

    Alf Edel | 19:17

  2. Re: mich hat keiner gefragt

    Faksimile | 19:04

  3. Re: 4000¤ - WTF?

    körner | 19:03

  4. Re: tatsächlich eigentlich eine gute Entwicklung.

    Bujin | 19:02

  5. Re: Bulls....

    Trott | 18:49


  1. 12:54

  2. 11:56

  3. 10:54

  4. 10:07

  5. 08:59

  6. 08:00

  7. 00:03

  8. 15:33


  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