Tasterwert lesen und senden

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

Stellenmarkt
  1. Informationssicherheitsbeauf- tragte:r (m/w/d)
    Kommunales Rechenzentrum Minden-Ravensberg/Lippe, Lemgo
  2. Informatiker (w/m/d) mit Bachelor oder Fachhochschul-Diplom im Dezernat "IT-Betrieb" (Z3C)
    Bundeskartellamt, Bonn
Detailsuche

  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.

Golem Karrierewelt
  1. Hands-on C# Programmierung: virtueller Zwei-Tage-Workshop
    13./14.09.2022, virtuell
  2. IT-Grundschutz-Praktiker mit Zertifikat: Drei-Tage-Workshop
    04.-06.07.2022, Virtuell
Weitere IT-Trainings

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. }

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Das Peripheral-ModulLED an- und ausschalten 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13.  


ronda-melmag 01. Nov 2019

Und noch heute 4 jahre danach ist das bei Bluez "experimental" das steigert bei mir...

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...



Aktuell auf der Startseite von Golem.de
Layouten mit LaTex
Setzt du noch oder gestaltest du schon?

LaTex bietet viele Möglichkeiten, Briefe durch Schriftarten, Buchstabenbreiten und spezielle Kopf- und Fußzeilen besonders aussehen zu lassen.
Eine Anleitung von Uwe Ziegenhagen

Layouten mit LaTex: Setzt du noch oder gestaltest du schon?
Artikel
  1. Saudi Aramco legt zu: Apple nicht mehr wertvollstes Unternehmen
    Saudi Aramco legt zu
    Apple nicht mehr wertvollstes Unternehmen

    Der iPhone-Konzern verliert seine Spitzenposition bei der Marktkapitalisierung, Europa fehlt in den Top 10 und SAP fällt aus den Top 100.

  2. Wissenschaft: LHC hat drei neue exotische Teilchen entdeckt
    Wissenschaft
    LHC hat drei neue exotische Teilchen entdeckt

    Der sogenannte Teilchenzoo der Physik ist noch größer geworden. Die Wissenschaft hofft auf Bestätigung der Modelle zu deren internen Aufbau.

  3. Superior Continuous Torque: E-Motor von Mahle für Dauerbetrieb unter Stress
    Superior Continuous Torque
    E-Motor von Mahle für Dauerbetrieb unter Stress

    Mahle hat einen neuen Auto-Elektromotor entwickelt, der unbegrenzt lange unter hoher Last betrieben werden kann. Dies wird durch ein neues Kühlkonzept im Motor erreicht.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • PS5 bestellbar • EVGA RTX 3090 24G günstig wie nie: 1.649€ • MindStar (MSI RTX 3060 429€, MSI Optix 31,5“ WQHD 165Hz 369€) • Samsung QLED 85" günstig wie nie: 1.732,72€ • Alternate (Tower-Gehäuse & CPU-Kühler v. Raijintek) • Der beste 2.000€-Gaming-PC • LG TV 65" 120Hz -56% [Werbung]
    •  /