{"id":135872,"date":"2018-09-21T10:01:00","date_gmt":"2018-09-21T07:01:00","guid":{"rendered":"https:\/\/ruuvi.com\/ruuvi-firmware-part-9-bluetooth-broadcasting\/"},"modified":"2026-06-11T08:48:56","modified_gmt":"2026-06-11T05:48:56","slug":"ruuvi-firmware-part-9-bluetooth-broadcasting","status":"publish","type":"post","link":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/","title":{"rendered":"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9-1024x536.jpeg\" alt=\"Einf&#xFC;hrungsbild der Ruuvi Firmware-Serie Teil 9\" class=\"wp-image-3698\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9-1024x536.jpeg 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9-450x236.jpeg 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9-768x402.jpeg 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9-600x314.jpeg 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9.jpeg 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">In diesem Teil des Tutorials f\u00fcgen wir die Bluetooth-Broadcast-Funktionalit\u00e4t hinzu. Wir beginnen auch damit, Schnittstellen f\u00fcr Kommunikationsschnittstellen zu definieren, die so unabh\u00e4ngig wie m\u00f6glich von der Daten\u00fcbertragungsmethode, wie Bluetooth oder NFC, sind. Der finale Code dieses Blogbeitrags kann auf <a href=\"https:\/\/github.com\/ruuvi\/ruuvi.firmware.c\">Ruuvi GitHub<\/a> im <em>ruuviblog<\/em>-Branch, Tag <em>3.9.0-alpha<\/em>, heruntergeladen werden.  <\/p>\n\n<p class=\"wp-block-paragraph\">Bitte folge <a href=\"https:\/\/ruuvi.com\/ruuvi-firmware-part-1-sleep\/\">Teil 1 der Serie<\/a> f\u00fcr Details zum Klonen des Repositories und Kompilieren des Codes. Die finale Hex-Datei dieses Tutorials kann vom <a href=\"http:\/\/jenkins.ruuvi.com\/job\/ruuvi.firmware.c\/29\/\">Ruuvi Jenkins<\/a> heruntergeladen werden. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"821\" height=\"681\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-9-0.png\" alt=\"ruuvi.firmware.c Architektur 3.9.0\" class=\"wp-image-3699\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-9-0.png 821w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-9-0-450x373.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-9-0-768x637.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-9-0-600x498.png 600w\" sizes=\"auto, (max-width: 821px) 100vw, 821px\" \/><\/figure><\/div>\n\n<h2 class=\"wp-block-heading\">Kommunikationsschnittstelle<\/h2>\n\n<p class=\"wp-block-paragraph\">In Zukunft werden wir viele verschiedene Wege haben, mit der Au\u00dfenwelt zu kommunizieren. Dazu k\u00f6nnten <a href=\"https:\/\/learn.adafruit.com\/introduction-to-bluetooth-low-energy\/gatt\"><em>Bluetooth Low-Energy Generic ATTributes <\/em><\/a>(<strong>BLE GATT<\/strong>), eine Art Mesh-Netzwerk, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Universal_asynchronous_receiver-transmitter\"><em>Universal Asynchronous Receiver-Transmitter<\/em><\/a> (<strong>UART<\/strong>), <a href=\"https:\/\/www.segger.com\/products\/debug-probes\/j-link\/technology\/about-real-time-transfer\/\"><em>Real-Time Transfer<\/em><\/a> (<strong>RTT<\/strong>) und <a href=\"https:\/\/en.wikipedia.org\/wiki\/Near-field_communication\"><em>Near-Field Communication<\/em><\/a> (<strong>NFC<\/strong>) geh\u00f6ren. Wir m\u00f6chten, dass unsere Anwendung jedes Kommunikations-Backend so transparent wie m\u00f6glich nutzt, daher definieren wir eine Kommunikations-<em>Schnittstelle<\/em>, so wie wir eine Sensor-<em>Schnittstelle<\/em> definiert haben.  <\/p>\n\n<p class=\"wp-block-paragraph\">Jede Schnittstelle, die wir implementieren, wird eine gemeinsame Funktionalit\u00e4t haben. Wir werden haben: <\/p>\n\n<ul class=\"wp-block-list\"><li><em>Initialisierung<\/em><\/li><li><em>Deinitialisierung<\/em><\/li><li><em>Daten senden<\/em><\/li><li><em>Daten lesen<\/em><\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">Einige Daten\u00fcbertragungsmethoden, wie die Kommunikation \u00fcber Bluetooth, sind von Natur aus <a href=\"https:\/\/en.wikipedia.org\/wiki\/Asynchrony_(computer_programming)\">asynchron<\/a>. Wir m\u00fcssen warten, bis ein Slot f\u00fcr Funkaktivit\u00e4t verf\u00fcgbar ist, und erst dann k\u00f6nnen wir \u00fcbertragen. Daher bedeutet unser <em>Senden<\/em> nur, dass Daten im Treiber gepuffert wurden. Ebenso ist unser Empfangen ein Ereignis, das vom Treiber behandelt werden muss, und unser Programm wird die Daten aus dem Empfangspuffer <em>lesen<\/em>, wenn die Anwendung Zeit hat.   <\/p>\n\n<p class=\"wp-block-paragraph\">Manchmal m\u00f6chten wir die Daten immer wieder wiederholen, zum Beispiel bei <a href=\"https:\/\/en.wikipedia.org\/wiki\/IBeacon\">iBeacon<\/a>-\u00dcbertragungen. In anderen F\u00e4llen, wie bei Sensordaten, kann es sinnvoll sein, sie nur einmal zu senden. Wir werden Platz f\u00fcr ein \u201eWiederholen\u201c-Attribut in unserem Nachrichtenformat reservieren, es aber noch nicht implementieren.  <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"412\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-h-1024x412.png\" alt=\"ruuvi_interface_communication.h\" class=\"wp-image-3700\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-h-1024x412.png 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-h-450x181.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-h-768x309.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-h-1536x618.png 1536w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-h-600x241.png 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-h.png 1556w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>ruuvi_interface_communication.h<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Andere Parameter, wie \u00dcbertragungsintervalle oder Baudraten, k\u00f6nnen als implementierungsspezifisch betrachtet werden und werden nicht in die Kommunikations-<em>Schnittstelle<\/em> aufgenommen, sondern sind f\u00fcr jeden Kommunikations-<em>Kanal<\/em> einzigartig.<\/p>\n\n<p class=\"wp-block-paragraph\">Die Chunk-Gr\u00f6\u00dfe ist f\u00fcr jeden <em>Kanal<\/em> unterschiedlich. Bei einem <strong>BLE<\/strong>-Broadcast k\u00f6nnen wir 24 Bytes als herstellerspezifische Nutzlast senden, bei der <strong>BLE GATT<\/strong>-\u00dcbertragung k\u00f6nnen wir 20 Bytes senden, es sei denn, wir passen die <a href=\"https:\/\/en.wikipedia.org\/wiki\/Maximum_transmission_unit\"><em>Maximum Transmission Unit<\/em><\/a> (<strong>MTU<\/strong>)-Einstellungen an, und bei <strong>BLE<\/strong> Mesh sind wir auf 3 Byte Opcode + 8 Byte Nutzlast pro einzelnem unsegmentierten Paket beschr\u00e4nkt. Die <em>Sendefunktion<\/em> wird die Nachricht ablehnen, wenn die Nachricht zu gro\u00df ist, um in die Puffer des <em>Kanals<\/em> zu passen. In Zukunft k\u00f6nnten wir die Segmentierung der Nachrichten entweder auf Treiber- oder auf Anwendungsebene implementieren.   <\/p>\n\n<p class=\"wp-block-paragraph\">Wir werden einige Standard-Nachrichtenformate definieren, damit jede Anwendung die Nachrichten verstehen kann, auch wenn sie \u00fcber mehrere Chunks aufgeteilt sind. Dies f\u00fchrt uns zu den Endpunkten. <\/p>\n\n<h3 class=\"wp-block-heading\">Ruuvi Endpunkte<\/h3>\n\n<p class=\"wp-block-paragraph\">Die Ruuvi-Endpunkte sind seit etwas \u00fcber einem Jahr in Arbeit. Die Grundidee ist einfach: Wir definieren Datentypen und verwenden diese festen Typen \u00fcber alle Anwendungen und Kommunikationsmethoden hinweg. <\/p>\n\n<p class=\"wp-block-paragraph\">In diesem Teil des Tutorials ben\u00f6tigen wir nur die Broadcast-Typen. Wir verwenden das erste Byte als Header, und die restlichen Bytes werden durch den Header definiert. Wir werden vorerst nur herstellerspezifische Daten-Advertisements implementieren, was bedeutet, dass das Eddystone-URL-Format noch nicht implementiert werden kann. Wir werden die Header-Werte <strong>00<\/strong> bis <strong>0F<\/strong> f\u00fcr die Broadcasts festlegen, um die Kompatibilit\u00e4t mit der bestehenden Ruuvi Firmware zu gew\u00e4hrleisten.   <\/p>\n\n<p class=\"wp-block-paragraph\">W\u00e4hrend wir Spezifikationen schreiben, einigen wir uns auf ein allgemeines 11-Byte-Format f\u00fcr die Daten.<\/p>\n\n<ul class=\"wp-block-list\"><li>Ruuvi-Daten sind 11 Byte lang, sofern nicht anders angegeben<\/li><li>Ruuvi-Daten sind in 3 Bytes Header und 8 Bytes Nutzlast aufgeteilt<\/li><li>Der Header hat ein Ziel, eine Quelle und einen Typ bei 11 Byte Daten<\/li><li>Die Nutzlast wird durch den Typ bei 11 Byte Daten definiert<\/li><li>Endpunkte <strong>00<\/strong> .. <strong>0F<\/strong> sind f\u00fcr Broadcasts reserviert, einschlie\u00dflich der aktuellen Formate. Jedes Format ist \u201espeziell\u201c und hat nur das erste Byte als Header. <\/li><li>Endpunkte <strong>10<\/strong> .. <strong>7F<\/strong> sind f\u00fcr Standarddaten reserviert und m\u00fcssen der obigen 11-Byte-Definition folgen.<\/li><li>Endpunkte <strong>C0<\/strong> .. <strong>FF<\/strong> sind f\u00fcr kommunikations-<em>kanal<\/em>spezifische \u00dcbertragungen reserviert und m\u00fcssen nicht interoperabel sein.<\/li><li>Endpunkte <strong>80<\/strong> .. <strong>BF<\/strong> sind anwendungsspezifisch und k\u00f6nnen jedes Format haben, solange das erste Byte im richtigen Bereich liegt.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">Die Begr\u00fcndung f\u00fcr die Reservierung von <strong>C0<\/strong> \u2026 <strong>FF<\/strong> liegt in BLE Mesh: Das unsegmentierte Paket hat einen 3-Byte-Opcode, der die <strong>BLE SIG<\/strong> Vendor ID in Byte 1 und 2 enth\u00e4lt, und die Werte 0b11xx xxxx von Byte 0 sind f\u00fcr den eigentlichen Opcode reserviert.<\/p>\n\n<p class=\"wp-block-paragraph\">F\u00fcr den Umfang dieses Tutorials m\u00fcssen wir nur Endpunkt 3 implementieren \u2013 auch bekannt als <em>RAWv1<\/em>. Dies ist das herstellerspezifische Datenformat, das von RuuviTags beim Booten nach der Auslieferung aus der Fabrik gesendet wird. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"755\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-endpoint-3-h-1024x755.png\" alt=\"ruuvi_endpoint_3.h\" class=\"wp-image-3701\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-endpoint-3-h-1024x755.png 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-endpoint-3-h-450x332.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-endpoint-3-h-768x566.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-endpoint-3-h-1536x1132.png 1536w, https:\/\/ruuvi.com\/i\/u\/ruuvi-endpoint-3-h-600x442.png 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-endpoint-3-h.png 1604w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>ruuvi_endpoint_3.h<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Unsere Endpunkt-Datei hat nur eine Funktion, die einen Puffer zum Schreiben der Daten, die f\u00fcr das Format ben\u00f6tigten Daten und eine Konstante entgegennimmt, die von den Treibern als ung\u00fcltige Daten markiert wird. Da Datenformat 3 keinen spezifischen Wert f\u00fcr \u201eung\u00fcltig\u201c definiert hat, werden wir nur alle Werte auf Null setzen, die nicht von den Sensoren gelesen werden k\u00f6nnen. <\/p>\n\n<h2 class=\"wp-block-heading\">Bluetooth<\/h2>\n\n<h3 class=\"wp-block-heading\">Bluetooth-Schnittstelle<\/h3>\n\n<p class=\"wp-block-paragraph\">Zus\u00e4tzlich zu den oben beschriebenen <em>Sende-<\/em> und <em>Lesefunktionen<\/em> haben wir einige <strong>BLE<\/strong>-spezifische \u00dcberlegungen, wie \u00dcbertragungsintervall, Sendeleistung, ob die Advertisement scannbar oder verbindbar ist und so weiter. Vorerst unterst\u00fctzen wir nur nicht-verbindbare, nicht-scannbare herstellerspezifische Daten\u00fcbertragungen, d.h. Eddystone wird nicht unterst\u00fctzt. <\/p>\n\n<p class=\"wp-block-paragraph\">Um die Dinge noch komplexer zu machen, verwenden das Scannen von Advertisements \u00fcber <strong>BLE<\/strong> oder die Verwendung von <strong>GATT<\/strong> dasselbe Funkperipherieger\u00e4t. Eines unserer Leitprinzipien war es, die Dinge so einfach wie m\u00f6glich zu halten, daher erlauben wir nur einen Funkbetriebsmodus gleichzeitig. Vorerst m\u00fcssen wir uns nicht um die Interoperabilit\u00e4t mit anderen Funknutzungen k\u00fcmmern, wir m\u00fcssen nur die Daten senden. Wir werden eine Reservierung f\u00fcr das <strong>BLE<\/strong>-Advertisement-Scanning vornehmen, damit wir die <em>Lesefunktion<\/em> in Zukunft implementieren k\u00f6nnen. Die oben genannte Kommunikations-<em>Schnittstelle<\/em> wird schlie\u00dflich in unserem Bluetooth-Advertising-Treiber implementiert.    <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"364\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-radio-h-1024x364.png\" alt=\"ruuvi_interface_communication_radio.h\" class=\"wp-image-3702\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-radio-h-1024x364.png 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-radio-h-450x160.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-radio-h-768x273.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-radio-h-1536x547.png 1536w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-radio-h-600x214.png 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-radio-h.png 1798w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>ruuvi_interface_communication_radio.h<\/figcaption><\/figure><\/div>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"816\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-ble4-advertising-h-1024x816.png\" alt=\"ruuvi_interface_communication_ble4_advertising.h\" class=\"wp-image-3703\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-ble4-advertising-h-1024x816.png 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-ble4-advertising-h-450x359.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-ble4-advertising-h-768x612.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-ble4-advertising-h-1536x1224.png 1536w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-ble4-advertising-h-600x478.png 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-interface-communication-ble4-advertising-h.png 1574w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>ruuvi_interface_communication_ble4_advertising.h<\/figcaption><\/figure><\/div>\n\n<h3 class=\"wp-block-heading\">Bluetooth-Treiber<\/h3>\n\n<p class=\"wp-block-paragraph\">Unser Treiber verf\u00fcgt \u00fcber einige Funktionen, die f\u00fcr die gesamte Bluetooth-Kommunikation gemeinsam sein werden. Wir werden dies in <em>ruuvi_platform_communication_radio<\/em> aufteilen. Idealerweise muss die Anwendung nichts \u00fcber die zugrunde liegenden Details wissen, wie z.B. welche Takte und Timer initialisiert werden. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-radio-c-1024x601.png\" alt=\"ruuvi_platform_communication_radio.c\" class=\"wp-image-3704\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-radio-c-1024x601.png 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-radio-c-450x264.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-radio-c-768x451.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-radio-c-1536x902.png 1536w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-radio-c-600x352.png 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-radio-c.png 1574w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>ruuvi_platform_communication_radio.c<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Unser <em>Nordic Software Development Kit 15<\/em> (<strong>SDK<\/strong>)-spezifischer Funkcode aktiviert das Softdevice f\u00fcr ein Modul und kann den Funk deaktivieren, falls der Betriebsmodus ge\u00e4ndert werden sollte. Theoretisch k\u00f6nnte das Softdevice <strong>GATT<\/strong>-Verbindung und Advertising gleichzeitig unterst\u00fctzen, aber wir erlauben nur einen Modus gleichzeitig. <\/p>\n\n<p class=\"wp-block-paragraph\">Das Advertising selbst profitiert von einer etwas komplexen Interaktion mit dem <strong>SDK<\/strong>: Wir richten Advertisement-Datenstrukturen ein, lassen das <strong>SDK<\/strong> die Daten in einen Rohpuffer kodieren und \u00fcbergeben den Puffer schlie\u00dflich an das <strong>SDK<\/strong>. Sp\u00e4ter k\u00f6nnten wir einen ordnungsgem\u00e4\u00dfen Ringspeicher implementieren, der Daten nach dem <em>First-In-First-Out<\/em>-Prinzip sendet und alle Nachrichten mit der Einstellung \u201eWiederholen\u201c wieder in die Warteschlange legt. Vielleicht unterst\u00fctzen wir sogar eine anpassbare \u00dcbertragungsrate, indem wir Nachrichten schneller senden, wenn der Sendepuffer gef\u00fcllt ist, und anhalten, wenn der Sendepuffer leer ist.  <\/p>\n\n<p class=\"wp-block-paragraph\">Vorerst sind wir mit einer minimalistischen Implementierung von <em>init<\/em>, <em>uninit<\/em> und <em>send<\/em> zufrieden. <em>Read<\/em> gibt vorerst RUUVI_DRIVER_ERROR_NOT_IMPLEMENTED zur\u00fcck.<\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"710\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-ble4-advertising-c-initialization-1024x710.png\" alt=\"ruuvi_platform_communication_ble4_advertising.c &#x2013; Initialisierung\" class=\"wp-image-3705\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-ble4-advertising-c-initialization-1024x710.png 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-ble4-advertising-c-initialization-450x312.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-ble4-advertising-c-initialization-768x533.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-ble4-advertising-c-initialization-600x416.png 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-platform-communication-ble4-advertising-c-initialization.png 1522w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>ruuvi_platform_communication_ble4_advertising.c \u2013 Initialisierung<\/figcaption><\/figure><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"af31\">Integration in die Anwendung<\/h2>\n\n<p class=\"wp-block-paragraph\" id=\"8e66\">Wie zuvor ist der Button unser einziger Input f\u00fcr die Anwendung. Wir \u00e4ndern die Button-Aufgabe, um die Sensorabtastung auszul\u00f6sen und die Daten \u00fcber <em>task_advertisement<\/em> zu senden. <\/p>\n\n<pre class=\"wp-block-code\"><code>ruuvi_driver_status_t task_button_on_press(void)\n{\n  static uint64_t last_press = 0;\n  \/\/ returns UINT64_MAX if RTC is not running.\n  uint64_t now = ruuvi_platform_rtc_millis();\n  ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;\n\n  \/\/ Debounce button\n  if((now - last_press) &gt; RUUVI_BOARD_BUTTON_DEBOUNCE_PERIOD_MS)\n  {\n\n    err_code |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_ON);\n    \/*err_code |= task_acceleration_on_button();\n    err_code |= task_environmental_on_button();\n    err_code |= task_adc_on_button();*\/\n    err_code |= task_advertisement_send_3();\n    err_code |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_OFF);\n    RUUVI_DRIVER_ERROR_CHECK(err_code, ~RUUVI_DRIVER_ERROR_FATAL);\n  }\n\n  \/\/ store time of press for debouncing if possible\n  if(RUUVI_DRIVER_UINT64_INVALID != now) { last_press = now; }\n  return err_code;\n}<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/9fb4a498a7a89a42d97b0aa2d3f02832\/raw\/2a845becd3a1a6fe8de43a316816f793b9d369c8\/ruuviblog_9_task_button\">Rohdaten anzeigen<\/a><\/p>\n\n<p class=\"has-text-align-center wp-block-paragraph\"><em>Knopfdruck ruft task_advertisement_send_3() auf<\/em><\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"856\" src=\"https:\/\/ruuvi.com\/i\/u\/task-advertisement-c-1024x856.png\" alt=\"task_advertisement.c\" class=\"wp-image-3706\" srcset=\"https:\/\/ruuvi.com\/i\/u\/task-advertisement-c-1024x856.png 1024w, https:\/\/ruuvi.com\/i\/u\/task-advertisement-c-450x376.png 450w, https:\/\/ruuvi.com\/i\/u\/task-advertisement-c-768x642.png 768w, https:\/\/ruuvi.com\/i\/u\/task-advertisement-c-600x501.png 600w, https:\/\/ruuvi.com\/i\/u\/task-advertisement-c.png 1436w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>task_advertisement.c<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Wir haben die \u201eWiederholen\u201c-Funktionalit\u00e4t in unserem Nachrichtenformat noch nicht implementiert, aber das Softdevice sendet die zuletzt gegebenen Daten fr\u00f6hlich weiter, bis etwas anderes befohlen wird. Die Aktualisierung der Daten erfolgt jedoch nur bei Knopfdruck. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"1024\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-data-parsed-by-the-ruuvi-station-576x1024.jpeg\" alt=\"In der Ruuvi Station App dargestellte Daten\" class=\"wp-image-3707\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-data-parsed-by-the-ruuvi-station-576x1024.jpeg 576w, https:\/\/ruuvi.com\/i\/u\/ruuvi-data-parsed-by-the-ruuvi-station-253x450.jpeg 253w, https:\/\/ruuvi.com\/i\/u\/ruuvi-data-parsed-by-the-ruuvi-station-600x1067.jpeg 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-data-parsed-by-the-ruuvi-station.jpeg 720w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><figcaption>Unser Tag sendet im g\u00fcltigen Ruuvi-Datenformat, das von der Ruuvi Station geparst wird<\/figcaption><\/figure><\/div>\n\n<h2 class=\"wp-block-heading\">Leistungsprofil<\/h2>\n\n<p class=\"wp-block-paragraph\">Wie immer ist der Stromverbrauch der treibende Faktor in unserem Code. Da wir uns den Funktionen der offiziellen Ruuvi Firmware, die auf <strong>SDK12<\/strong> basiert, n\u00e4hern, k\u00f6nnen wir unseren Fortschritt mit der offiziellen Ruuvi Firmware vergleichen, die bei Raumtemperatur etwa 24 <em>\u03bcA<\/em> bei 3 <em>V<\/em> verbraucht. Wir sind noch nicht auf Funktionsgleichheit, da die <strong>NFC<\/strong> offline ist und Sensoren nur bei Knopfdruck abgetastet werden. Mal sehen, wie wir uns jetzt schlagen.   <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"714\" src=\"https:\/\/ruuvi.com\/i\/u\/consumption-while-broadcasting-1024x714.png\" alt=\"Verbrauch w&#xE4;hrend des Broadcastings\" class=\"wp-image-3708\" srcset=\"https:\/\/ruuvi.com\/i\/u\/consumption-while-broadcasting-1024x714.png 1024w, https:\/\/ruuvi.com\/i\/u\/consumption-while-broadcasting-450x314.png 450w, https:\/\/ruuvi.com\/i\/u\/consumption-while-broadcasting-768x536.png 768w, https:\/\/ruuvi.com\/i\/u\/consumption-while-broadcasting-1536x1071.png 1536w, https:\/\/ruuvi.com\/i\/u\/consumption-while-broadcasting-600x418.png 600w, https:\/\/ruuvi.com\/i\/u\/consumption-while-broadcasting.png 2042w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Verbrauch w\u00e4hrend des Broadcastings<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Eine Sache, die uns ins Auge f\u00e4llt, ist der Spitzenstromverbrauch. Unsere <strong>BLE<\/strong>-Broadcasts verbrauchen 20 <em>mA<\/em>. Das liegt daran, dass wir den internen <a href=\"https:\/\/en.wikipedia.org\/wiki\/DC-to-DC_converter\"><em>Direct Current to Direct Current Converter<\/em><\/a> (<strong>DC\/DC<\/strong>) nicht aktiviert haben. Wir werden im n\u00e4chsten Teil der Blogbeitr\u00e4ge eine Schnittstelle f\u00fcr die Stromversorgung von Peripherieger\u00e4ten hinzuf\u00fcgen, um den Stromverbrauch zu senken. Insgesamt liegen wir jetzt bei etwa 27 <em>\u03bcA<\/em>, was ziemlich nahe an den 24 <em>\u03bcA<\/em> liegt, die wir in der finalen Firmware erwarten k\u00f6nnten. \u00dcberpr\u00fcfen wir den Basiswert:     <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"729\" src=\"https:\/\/ruuvi.com\/i\/u\/consumption-between-broadcasts-1024x729.png\" alt=\"Verbrauch zwischen den Broadcasts\" class=\"wp-image-3709\" srcset=\"https:\/\/ruuvi.com\/i\/u\/consumption-between-broadcasts-1024x729.png 1024w, https:\/\/ruuvi.com\/i\/u\/consumption-between-broadcasts-450x320.png 450w, https:\/\/ruuvi.com\/i\/u\/consumption-between-broadcasts-768x547.png 768w, https:\/\/ruuvi.com\/i\/u\/consumption-between-broadcasts-1536x1093.png 1536w, https:\/\/ruuvi.com\/i\/u\/consumption-between-broadcasts-600x427.png 600w, https:\/\/ruuvi.com\/i\/u\/consumption-between-broadcasts.png 2032w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Verbrauch zwischen den Broadcasts<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Unser Leerlaufverbrauch betr\u00e4gt jetzt 6,6 <em>\u03bcA<\/em>, was 0,2 <em>\u03bcA<\/em> mehr ist als die 6,4 <em>\u03bcA<\/em> in unserem vorherigen Beitrag. Vielleicht hat das Softdevice den Grundverbrauch irgendwie leicht erh\u00f6ht, oder wir sehen jetzt nur eine Varianz in der Messung. <\/p>\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n<p class=\"wp-block-paragraph\">In diesem Teil haben wir Bluetooth-Broadcasts und die Unterst\u00fctzung f\u00fcr das Ruuvi-Datenformat 3 hinzugef\u00fcgt. Wir haben auch ein Datenformat f\u00fcr die Fernkonfiguration und das Auslesen der Sensoren \u00fcber jede Kommunikationsmethode, einschlie\u00dflich Bluetooth Mesh, skizziert. Es gibt noch viel Feintuning und Erweiterungen an der Firmware vorzunehmen, aber wir n\u00e4hern uns auch der Funktionalit\u00e4t der urspr\u00fcnglichen Ruuvi Firmware.  <\/p>\n\n<p class=\"wp-block-paragraph\"><strong>Bleib dran und folge <\/strong><a href=\"https:\/\/twitter.com\/ojousima\"><strong>@ojousima<\/strong><\/a><strong> und <\/strong><a href=\"https:\/\/twitter.com\/ruuvicom\"><strong>@ruuvicom<\/strong><\/a><strong> auf Twitter f\u00fcr #FirmwareFriday-Beitr\u00e4ge!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Teil des Tutorials f\u00fcgen wir die Bluetooth-Broadcast-Funktionalit\u00e4t hinzu. Wir beginnen auch damit, Schnittstellen f\u00fcr Kommunikationsschnittstellen zu definieren, die so unabh\u00e4ngig wie m\u00f6glich von der Daten\u00fcbertragungsmethode, wie Bluetooth oder NFC, sind. Der finale Code dieses Blogbeitrags kann auf Ruuvi GitHub im ruuviblog-Branch, Tag 3.9.0-alpha, heruntergeladen werden. Bitte folge Teil 1 der Serie f\u00fcr Details [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":135873,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[324],"tags":[],"class_list":["post-135872","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruuvi-software-artikel"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting \u2013 Ruuvi<\/title>\n<meta name=\"description\" content=\"Anleitung zum Hinzuf\u00fcgen der Bluetooth-Vorhersagefunktion zum Firmware-Code des RuuviTag als eine der m\u00f6glichen Kommunikationswege mit der Au\u00dfenwelt.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting \u2013 Ruuvi\" \/>\n<meta property=\"og:description\" content=\"Anleitung zum Hinzuf\u00fcgen der Bluetooth-Vorhersagefunktion zum Firmware-Code des RuuviTag als eine der m\u00f6glichen Kommunikationswege mit der Au\u00dfenwelt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruuvi\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ruuvi.cc\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-21T07:01:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-11T05:48:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1400\" \/>\n\t<meta property=\"og:image:height\" content=\"733\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Otso Jousimaa\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ruuvicom\" \/>\n<meta name=\"twitter:site\" content=\"@ruuvicom\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Otso Jousimaa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\u00a0Minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/\"},\"author\":{\"name\":\"Otso Jousimaa\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\"},\"headline\":\"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting\",\"datePublished\":\"2018-09-21T07:01:00+00:00\",\"dateModified\":\"2026-06-11T05:48:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/\"},\"wordCount\":1552,\"image\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-9.jpeg\",\"articleSection\":[\"Ruuvi-Software-Artikel\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/\",\"name\":\"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting \u2013 Ruuvi\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-9.jpeg\",\"datePublished\":\"2018-09-21T07:01:00+00:00\",\"dateModified\":\"2026-06-11T05:48:56+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\"},\"description\":\"Anleitung zum Hinzuf\u00fcgen der Bluetooth-Vorhersagefunktion zum Firmware-Code des RuuviTag als eine der m\u00f6glichen Kommunikationswege mit der Au\u00dfenwelt.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-9.jpeg\",\"contentUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-9.jpeg\",\"width\":1400,\"height\":733,\"caption\":\"Einf\u00fchrungsbild der Ruuvi Firmware-Serie Teil 9\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-part-9-bluetooth-broadcasting\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/front\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/\",\"name\":\"Ruuvi\",\"description\":\"Measure Your World\",\"potentialAction\":[],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\",\"name\":\"Otso Jousimaa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g\",\"caption\":\"Otso Jousimaa\"},\"url\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/author\\\/ojousima\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting \u2013 Ruuvi","description":"Anleitung zum Hinzuf\u00fcgen der Bluetooth-Vorhersagefunktion zum Firmware-Code des RuuviTag als eine der m\u00f6glichen Kommunikationswege mit der Au\u00dfenwelt.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/","og_locale":"de_DE","og_type":"article","og_title":"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting \u2013 Ruuvi","og_description":"Anleitung zum Hinzuf\u00fcgen der Bluetooth-Vorhersagefunktion zum Firmware-Code des RuuviTag als eine der m\u00f6glichen Kommunikationswege mit der Au\u00dfenwelt.","og_url":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/","og_site_name":"Ruuvi","article_publisher":"https:\/\/www.facebook.com\/ruuvi.cc","article_published_time":"2018-09-21T07:01:00+00:00","article_modified_time":"2026-06-11T05:48:56+00:00","og_image":[{"width":1400,"height":733,"url":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9.jpeg","type":"image\/jpeg"}],"author":"Otso Jousimaa","twitter_card":"summary_large_image","twitter_creator":"@ruuvicom","twitter_site":"@ruuvicom","twitter_misc":{"Verfasst von":"Otso Jousimaa","Gesch\u00e4tzte Lesezeit":"8\u00a0Minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/#article","isPartOf":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/"},"author":{"name":"Otso Jousimaa","@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00"},"headline":"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting","datePublished":"2018-09-21T07:01:00+00:00","dateModified":"2026-06-11T05:48:56+00:00","mainEntityOfPage":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/"},"wordCount":1552,"image":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/#primaryimage"},"thumbnailUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9.jpeg","articleSection":["Ruuvi-Software-Artikel"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/","url":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/","name":"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting \u2013 Ruuvi","isPartOf":{"@id":"https:\/\/ruuvi.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/#primaryimage"},"image":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/#primaryimage"},"thumbnailUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9.jpeg","datePublished":"2018-09-21T07:01:00+00:00","dateModified":"2026-06-11T05:48:56+00:00","author":{"@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00"},"description":"Anleitung zum Hinzuf\u00fcgen der Bluetooth-Vorhersagefunktion zum Firmware-Code des RuuviTag als eine der m\u00f6glichen Kommunikationswege mit der Au\u00dfenwelt.","breadcrumb":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/#primaryimage","url":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9.jpeg","contentUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-9.jpeg","width":1400,"height":733,"caption":"Einf\u00fchrungsbild der Ruuvi Firmware-Serie Teil 9"},{"@type":"BreadcrumbList","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-part-9-bluetooth-broadcasting\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ruuvi.com\/de\/front\/"},{"@type":"ListItem","position":2,"name":"Ruuvi Firmware \u2013 Teil 9: Bluetooth Broadcasting"}]},{"@type":"WebSite","@id":"https:\/\/ruuvi.com\/de\/#website","url":"https:\/\/ruuvi.com\/de\/","name":"Ruuvi","description":"Measure Your World","potentialAction":[],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00","name":"Otso Jousimaa","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g","caption":"Otso Jousimaa"},"url":"https:\/\/ruuvi.com\/de\/author\/ojousima\/"}]}},"_links":{"self":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/comments?post=135872"}],"version-history":[{"count":1,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135872\/revisions"}],"predecessor-version":[{"id":135892,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135872\/revisions\/135892"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/media\/135873"}],"wp:attachment":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/media?parent=135872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/categories?post=135872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/tags?post=135872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}