{"id":135862,"date":"2018-09-28T10:33:00","date_gmt":"2018-09-28T07:33:00","guid":{"rendered":"https:\/\/ruuvi.com\/ruuvi-firmware-teil-10-nfc-auslesen\/"},"modified":"2026-06-11T08:48:56","modified_gmt":"2026-06-11T05:48:56","slug":"ruuvi-firmware-teil-10-nfc-auslesen","status":"publish","type":"post","link":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/","title":{"rendered":"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen"},"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-10-1024x536.jpeg\" alt=\"Ruuvi Firmware Serie Teil 10 Intro-Bild\" class=\"wp-image-3713\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10-1024x536.jpeg 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10-450x236.jpeg 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10-768x402.jpeg 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10-600x314.jpeg 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10.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 dem Tag eine <em>Nahfeldkommunikations<\/em>-Funktion (<strong>NFC<\/strong>) zum Auslesen hinzu, d. h. RuuviTag wird am Ende dieses Beitrags ein schreibgesch\u00fctzter <strong>NFC<\/strong>-Tag sein. 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.10.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\/31\/\">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-10-0.png\" alt=\"ruuvi.firmware.c Architektur 3.10.0\" class=\"wp-image-3714\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-10-0.png 821w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-10-0-450x373.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-10-0-768x637.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-c-architecture-3-10-0-600x498.png 600w\" sizes=\"auto, (max-width: 821px) 100vw, 821px\" \/><figcaption>Dieses Bild wird langsam voll \u2013 Zeit, es f\u00fcr den n\u00e4chsten Teil neu zu zeichnen \ud83d\ude42<\/figcaption><\/figure><\/div>\n\n<h2 class=\"wp-block-heading\">NFC<\/h2>\n\n<h3 class=\"wp-block-heading\">NFC-Interface<\/h3>\n\n<p class=\"wp-block-paragraph\">Wie im vorherigen Beitrag werden wir nicht alles auf einmal implementieren. Bei der <em>Bluetooth Low-Energy<\/em>-Werbung (<strong>BLE<\/strong>) haben wir nur das Senden von Advertisements implementiert und das Scannen f\u00fcr sp\u00e4ter gelassen. Ebenso lassen wir <strong>NFC<\/strong>-Schreibvorg\u00e4nge auf den Tag vorerst unimplementiert. <\/p>\n\n<p class=\"wp-block-paragraph\">Wir wollen die Funktionalit\u00e4t aus Ruuvi FW 1.2.12 nachbilden, die die Firmware-Version, die <a href=\"https:\/\/en.wikipedia.org\/wiki\/MAC_address\"><em>Media-Access-Control<\/em><\/a>-Adresse (<strong>MAC<\/strong>) und die eindeutige ID des Tags ausgibt. Da unser Kommunikations-<em>Interface<\/em> kein Konzept von \u201eSlots\u201c kennt, wie z. B. <a href=\"https:\/\/nfcpy.readthedocs.io\/en\/latest\/topics\/ndef.html\">ndef-records<\/a>, f\u00fcgen wir die Text-<em>records<\/em> als <strong>NFC<\/strong>-spezifische Funktionen hinzu und senden sie als <strong>NFC<\/strong>-bin\u00e4ren <em>record<\/em>. <\/p>\n\n<pre class=\"wp-block-code\"><code>\/*\n * Initializes NFC hardware\n *\n * Returns RUUVI_DIRVER_SUCCESS on success, RUUVI_DIRVER_ERROR_INVALID_STATE if radio is already initialized\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_nfc_init(ruuvi_interface_communication_t* const channel);\n\n\/*\n * Uninitializes NFC hardware\n *\n * Returns RUUVI_DIRVER_SUCCESS on success or if radio was not initialized.\n * Returns RUUVI_DRIVER_ERROR_INVALID_STATE if radio hardware was initialized by another radio module.\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_nfc_uninit(ruuvi_interface_communication_t* const channel);\n\n\/\/ Encodes the given data fields into NFC buffer. Clears previous data.\nruuvi_driver_status_t ruuvi_interface_communication_nfc_data_set(void);\n\n\/**\n * Send data as ascii-encoded binary.\n *\n * Returns RUUVI_DRIVER_SUCCESS if the data was placed in buffer\n * Returns error code from the stack if data could not be placed to the buffer\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_nfc_send(ruuvi_interface_communication_message_t* messge);\n\n\/**\n * Send data as ascii-encoded binary.\n *\n * Returns RUUVI_DRIVER_SUCCESS if the data was placed in buffer\n * Returns error code from the stack if data could not be placed to the buffer\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_nfc_send(ruuvi_interface_communication_message_t* messge);\n\n\/**\n * Sets the device firmware version into \"FW\" text field.\n *\n *  parameter version: Pointer on string representation of the version. ie. \"FW: ruuvi.firmware.c 3.10.0\"\n *\n * returns RUUVI_DRIVER_SUCCESS on success\n * returns RUUVI_DRIVER_ERROR_NULL if version is NULL and length != 0\n * returns RUUVI_DRIVER_INVALID_LENGTH if name is over 32 bytes long\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_nfc_fw_version_set(const uint8_t* const version, const uint8_t length);\n\n\/**\n * Sets the device mac address into \"ad\" text field.\n *\n * returns RUUVI_DRIVER_SUCCESS on success\n * returns RUUVI_DRIVER_ERROR_NULL if address is NULL and length != 0\n * returns RUUVI_DRIVER_INVALID_LENGTH if name is over 32 bytes long\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_nfc_address_set(const uint8_t* const address, const uint8_t length);\n\n\/**\n * Sets the device id into \"id\" text field. Set NULL\/0 to disable\n *\n *  parameter id: Pointer on string representation of the id. ie. \"ID: 12:34:56:78:90:AB:CD:EF\n *\n * returns RUUVI_DRIVER_SUCCESS on success\n * returns RUUVI_DRIVER_ERROR_NULL if id is NULL and length != 0\n * returns RUUVI_DRIVER_INVALID_LENGTH if name is over 32 bytes long\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_nfc_id_set(const uint8_t* const id, const uint8_t length);\n\n\/\/ Not implemented\nruuvi_driver_status_t ruuvi_interface_communication_nfc_receive(ruuvi_interface_communication_message_t* messge);<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\" id=\"block-54a8a2eb-11cf-47de-bb1a-21c3174f1964\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/5806bc6be7efddca5e879a43dfd57ae1\/raw\/599edd53186856dac7af22c53178d7f504b748eb\/ruuvi_interface_communication_nfc.h\">Rohdaten anzeigen<\/a><\/p>\n\n<h3 class=\"wp-block-heading\">NFC-Treiber<\/h3>\n\n<p class=\"wp-block-paragraph\">Der Nordic-<strong>NFC<\/strong>-Treiber richtet einen Puffer im <strong>RAM<\/strong> ein, und wenn das <strong>NFC<\/strong>-Feld erkannt wird, wird dieser Puffer \u00fcber <strong>NFC<\/strong> an den Leser \u00fcbertragen \u2013 oder er wird vom Schreibger\u00e4t auf einen neuen Wert ge\u00e4ndert.<\/p>\n\n<p class=\"wp-block-paragraph\">Daher ben\u00f6tigen wir Double-Buffering: Zuerst richten wir ein, was wir in Records senden m\u00f6chten, und dann werden diese Records in den <strong>NFC<\/strong>-Puffer codiert. Wenn das <strong>NFC<\/strong>-Feld gerade aktiv ist, \u00e4ndern wir den Puffer nicht. <\/p>\n\n<p class=\"wp-block-paragraph\">Der Treiber selbst besteht aus einfachen Wrappern um die <em>Software Development Kit<\/em>-Funktionen (<strong>SDK<\/strong>) und der Handhabung der Datenpuffer. Es gibt eine Besonderheit: Wir m\u00fcssen <strong>HAL_NFC_ENGINEERING_BC_FTPAN_WORKAROUND<\/strong> zu unseren Compiler-Flags hinzuf\u00fcgen, damit der <strong>NFC<\/strong>-Treiber den <em>Hochfrequenztakt<\/em> (<strong>HFCLK<\/strong>) nach Unterbrechung der <strong>NFC<\/strong>-Verbindung freigibt. <\/p>\n\n<h2 class=\"wp-block-heading\">Integration in die Anwendung<\/h2>\n\n<p class=\"wp-block-paragraph\">Die Integration l\u00e4uft wie gewohnt: Wir schreiben <em>task_nfc<\/em> und rufen die Initialisierung in <em>main.c<\/em> auf. Die Initialisierung richtet die <em>Records<\/em> ein und wir sind bereit.<\/p>\n\n<pre class=\"wp-block-code\"><code>\/**\n * Initializes NFC and configures FW, ADDR and ID records according to application_config.h constants\n *\n * return RUUVI_DRIVER_SUCCESS on success\n * return error code from stack on error\n *\/\nruuvi_driver_status_t task_nfc_init(void);\n\n\/**\n * Sets given message to NFC RAM buffer. Clears previous message\n *\n * return RUUVI_DRIVER_SUCCESS on success\n * return error code from stack on error\n *\/\nruuvi_driver_status_t task_nfc_send(ruuvi_interface_communication_message_t* message);<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/9c9eb0da5d4dacd4e20a0b38244638f2\/raw\/4c011eae3fa55565c942456ee1dbd4f097d9dcba\/task_nfc.h\">Rohdaten anzeigen<\/a><\/p>\n\n<p class=\"has-text-align-center wp-block-paragraph\"><em>Bisher brauchen wir nur die Initialisierung.<\/em><\/p>\n\n<pre class=\"wp-block-code\"><code>int main(void)\n{\n  \/\/ Init logging\n  ruuvi_driver_status_t status = RUUVI_DRIVER_SUCCESS;\n  status |= ruuvi_platform_log_init(APPLICATION_LOG_LEVEL);\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Init yield\n  status |= ruuvi_platform_yield_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Init GPIO\n  status |= ruuvi_platform_gpio_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Initialize LED gpio pins, turn RED led on.\n  status |= task_led_init();\n  status |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_ON);\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Initialize SPI\n  status |= task_spi_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Initialize RTC\n  status |= task_rtc_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Initialize power\n  status |= task_power_dcdc_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Initialize nfc\n  status |= task_nfc_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  #if RUUVI_RUN_TESTS\n  \/\/ Tests will initialize and uninitialize the sensors, run this before using them in application\n  test_sensor_run();\n\n  \/\/ Print unit test status, activate tests by building in DEBUG configuration under SES\n  size_t tests_run, tests_passed;\n  test_sensor_status(&amp;tests_run, &amp;tests_passed);\n  char message&#091;128] = {0};\n  snprintf(message, sizeof(message), \"Tests ran: %u, passed: %u\\r\\n\", tests_run, tests_passed);\n  ruuvi_platform_log(RUUVI_INTERFACE_LOG_INFO, message);\n  #endif\n\n  \/\/ Initialize BLE\n  status |= task_advertisement_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Initialize ADC\n  status |= task_adc_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_SUCCESS);\n\n  \/\/ Initialize environmental- nRF52 will return ERROR NOT SUPPORTED if\n  \/\/ DSP was configured, log warning\n  status |= task_environmental_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_ERROR_NOT_SUPPORTED);\n\n  \/\/ Allow NOT FOUND in case we're running on basic model, NOT_SUPPORTED in case we have previous error from BME280\n  status |= task_acceleration_init();\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_ERROR_NOT_FOUND | RUUVI_DRIVER_ERROR_NOT_SUPPORTED);\n\n  \/\/ Initialize button with on_button task, do not reset on errors from model Basic\n  status |= task_button_init(RUUVI_INTERFACE_GPIO_SLOPE_HITOLO, task_button_on_press);\n  RUUVI_DRIVER_ERROR_CHECK(status, RUUVI_DRIVER_ERROR_NOT_FOUND | RUUVI_DRIVER_ERROR_NOT_SUPPORTED);\n\n  \/\/ Turn RED led off. Turn GREEN LED on if no errors occured\n  status |= task_led_write(RUUVI_BOARD_LED_RED, TASK_LED_OFF);\n  if(RUUVI_DRIVER_SUCCESS == status)\n  {\n    status |= task_led_write(RUUVI_BOARD_LED_GREEN, TASK_LED_ON);\n    ruuvi_platform_delay_ms(1000);\n  }\n  \/\/ Reset any previous errors, turn LEDs off, continue unless fatal error occurs\n  status |= task_led_write(RUUVI_BOARD_LED_GREEN, TASK_LED_OFF);\n  RUUVI_DRIVER_ERROR_CHECK(status, ~RUUVI_DRIVER_ERROR_FATAL);\n\n  while (1)\n  {\n    status = ruuvi_platform_yield();\n    \/\/ Reset only on fatal error\n    RUUVI_DRIVER_ERROR_CHECK(status, ~RUUVI_DRIVER_ERROR_FATAL);\n  }\n}<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/0ca948d3e21c722f1848f497bf3706ec\/raw\/7ad2d688213cb6b9cf7e82d217c410ae0b9a4102\/ruuvi_firmware_c_3_10_main.c\">Rohdaten anzeigen<\/a><\/p>\n\n<p class=\"has-text-align-center wp-block-paragraph\"><em>Wir haben auch eine Power-Task hinzugef\u00fcgt, um den DC\/DC-Wandler auf dem RuuviTag zu initialisieren<\/em><\/p>\n\n<p class=\"wp-block-paragraph\">Schauen wir uns das mit dem <strong>NFC<\/strong>-Leseger\u00e4t des Smartphones an:<\/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\/nfc-tools-576x1024.jpeg\" alt=\"NFC-Tools\" class=\"wp-image-3715\" srcset=\"https:\/\/ruuvi.com\/i\/u\/nfc-tools-576x1024.jpeg 576w, https:\/\/ruuvi.com\/i\/u\/nfc-tools-253x450.jpeg 253w, https:\/\/ruuvi.com\/i\/u\/nfc-tools-600x1067.jpeg 600w, https:\/\/ruuvi.com\/i\/u\/nfc-tools.jpeg 720w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><figcaption>NFC sieht gut aus<\/figcaption><\/figure><\/div>\n\n<h2 class=\"wp-block-heading\">Backlog<\/h2>\n\n<h3 class=\"wp-block-heading\">Power-Interface<\/h3>\n\n<p class=\"wp-block-paragraph\">Im vorherigen Beitrag haben wir \u00fcberm\u00e4\u00dfig viel Strom verbraucht, weil der interne <a href=\"https:\/\/en.wikipedia.org\/wiki\/DC-to-DC_converter\"><em>Gleichspannungswandler<\/em><\/a><em> (<\/em><strong>DC\/DC<\/strong>) des <em>nRF52832<\/em> nicht aktiviert war. Wir f\u00fcgen ein <em>Interface<\/em> hinzu, das eine Liste von zu aktivierenden Reglern \u00fcbernimmt und die Liste an die <em>Plattform<\/em>-Treiber weitergibt, die dann die ausgew\u00e4hlten Regler aktivieren. <\/p>\n\n<p class=\"wp-block-paragraph\">Es gibt weitere stromrelevante Funktionen, wie das Eintreten in den Tiefschlaf und die Konfiguration der Aufwachvorg\u00e4nge. Diese werden wir jedoch noch nicht implementieren. <\/p>\n\n<pre class=\"wp-block-code\"><code>#define RUUVI_INTERFACE_POWER_REGULATORS_DISABLED 0\n#define RUUVI_INTERFACE_POWER_REGULATORS_DCDC_INTERNAL (1&lt;&lt;0)  \/\/ DC\/DC for internal circuitry, i.e. nRF52832 radio\n#define RUUVI_INTERFACE_POWER_REGULATORS_DCDC_HV       (1&lt;&lt;1)  \/\/ DC\/DC for high voltage, i.e. nRF52840 USB\n\ntypedef uint32_t ruuvi_interface_power_regulators_t;\n\n\/**\n * Enable given regulators. The implementation must work regardless of software radio state, i.e. \n * on S132 on nRF52 the function must check if softdevice is running and call softdevice wrapper to\n * DC\/DC if it is and write registers directly if SD is not running. \n *\n * parameter regulators: binary flags of regulators to enable. \n * return: RUUVI_DRIVER_SUCCESS on success, error code from stack in case of a error.\n *\/\nruuvi_driver_status_t ruuvi_interface_power_regulators_enable(const ruuvi_interface_power_regulators_t regulators);<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/14e4e8e75fa3f778f68ce0e07949a205\/raw\/638803ad3553376f12bf7dc97b5d1012222d49ae\/ruuvi_interface_power.h\">Rohdaten anzeigen<\/a><\/p>\n\n<h3 class=\"wp-block-heading\">Power-Treiber<\/h3>\n\n<p class=\"wp-block-paragraph\">Der Power-Treiber ist an dieser Stelle einfach. Wir erstellen die Konfiguration und deinitialisieren den Power-Treiber, falls er bereits initialisiert war, dann konfigurieren und initialisieren wir den Treiber. <\/p>\n\n<pre class=\"wp-block-code\"><code>static bool m_is_init = false;\n\nruuvi_driver_status_t ruuvi_interface_power_regulators_enable(const ruuvi_interface_power_regulators_t regulators)\n{\n\n  ret_code_t err_code = NRF_SUCCESS;\n  nrfx_power_config_t config = {0};\n  if(RUUVI_INTERFACE_POWER_REGULATORS_DCDC_INTERNAL &amp; regulators)\n  {\n    config.dcdcen = true;\n  }\n  if(RUUVI_INTERFACE_POWER_REGULATORS_DCDC_HV &amp; regulators)\n  {\n    #if NRF_POWER_HAS_VDDH\n    config.dcdcenhv = true;\n    #endif\n  }\n  if(m_is_init)\n  {\n    nrfx_power_uninit();\n    m_is_init = false;\n  }\n  err_code |= nrfx_power_init (&amp;config);\n  m_is_init = true;\n  return ruuvi_platform_to_ruuvi_error(&amp;err_code);\n}<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/e41daab135aaba10cbdaf27ff2560471\/raw\/e77de8b72a957a142e267aae329d1ac8a26720fb\/ruuvi_platform_power.c\">Rohdaten anzeigen<\/a><\/p>\n\n<h3 class=\"wp-block-heading\">Kommunikations-Interface<\/h3>\n\n<p class=\"wp-block-paragraph\">Auch wenn wir noch nichts mit den NFC-Verbindungsinformationen machen, m\u00f6chten wir vielleicht das NFC-Verbindungsereignis nutzen, um in einen konfigurierbaren Modus zu wechseln (oder etwas \u00c4hnliches). Erweitern wir das Kommunikations-Interface um die Ereignisse <em>connected<\/em>, <em>disconnected<\/em>, <em>sent<\/em>, <em>received<\/em> und f\u00fcgen einen Event-Handler zum Function-Pointer-Interface hinzu. <\/p>\n\n<pre class=\"wp-block-code\"><code>\/\/ Standard BLE Broadcast manufacturer specific data payload length\n#define RUUVI_INTERFACE_COMMUNICATION_MESSAGE_MAX_LENGTH 24\n\ntypedef struct{\n  uint8_t data&#091;RUUVI_INTERFACE_COMMUNICATION_MESSAGE_MAX_LENGTH];\n  uint8_t data_length;\n  bool repeat;\n}ruuvi_interface_communication_message_t;\n\ntypedef enum {\n  RUUVI_INTERFACE_COMMUNICATION_CONNECTED,\n  RUUVI_INTERFACE_COMMUNICATION_DISCONNECTED,\n  RUUVI_INTERFACE_COMMUNICATION_SENT,\n  RUUVI_INTERFACE_COMMUNICATION_RECEIVED,\n}ruuvi_interface_communication_evt_t;\n\ntypedef struct ruuvi_interface_communication_t ruuvi_interface_communication_t;          \/\/ forward declaration *and* typedef\ntypedef ruuvi_driver_status_t(*ruuvi_interface_communication_xfer_fp_t)(ruuvi_interface_communication_message_t*);\ntypedef ruuvi_driver_status_t(*ruuvi_interface_communication_init_fp_t)(ruuvi_interface_communication_t* const);\ntypedef ruuvi_driver_status_t(*ruuvi_interface_communication_evt_handler_fp_t)(const ruuvi_interface_communication_evt_t);\n\n\/\/ Every Ruuvi communication channel must  be able to send data and receive data.\n\/\/ Channels can be init or uninit\nstruct ruuvi_interface_communication_t\n{\n  ruuvi_interface_communication_xfer_fp_t        send;\n  ruuvi_interface_communication_xfer_fp_t        read;\n  ruuvi_interface_communication_init_fp_t        init;\n  ruuvi_interface_communication_init_fp_t        uninit;\n  ruuvi_interface_communication_evt_handler_fp_t on_evt;\n};\n\n\/**\n * Writes maximum 64-bit unique id of the device to the pointer. This ID\n * must remain same across reboots and reflashes of the device\n *\n * param id: Output, value of id.\n * return RUUVI_DRIVER_SUCCESS on success\n * return RUUVI_DRIVER_ERROR_NOT_SUPPORTED if ID cannot be returned on given platform\n *\n *\/\nruuvi_driver_status_t ruuvi_interface_communication_id_get(uint64_t* const id);<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/b84aacb029fd32d9a969b3cc4d259282\/raw\/5b488e81d3e6c76de7a062ddc81df1a157889a1b\/ruuvi_interface_communication.h\">Rohdaten anzeigen<\/a><\/p>\n\n<p class=\"wp-block-paragraph\">Die brauchen wir sp\u00e4ter, wenn wir die Nachrichten ordentlich in eine Warteschlange stellen, statt \u201elass fallen, was gerade gesendet wird, und fang an, das hier zu senden\u201c.<\/p>\n\n<p class=\"wp-block-paragraph\">Wir f\u00fcgen auch eine Funktion hinzu, um die eindeutige ID des Ger\u00e4ts im Kommunikations-<em>Interface<\/em> zur\u00fcckzugeben, und eine Funktion, um die MAC-Adresse im Radio-<em>Interface<\/em> zur\u00fcckzugeben.<\/p>\n\n<h2 class=\"wp-block-heading\">Stromverbrauch<\/h2>\n\n<p class=\"wp-block-paragraph\">Wieder ist es Zeit zu pr\u00fcfen, wie der Stromverbrauch aussieht. Schauen wir uns zun\u00e4chst den Grundpegel beim Booten an. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"772\" src=\"https:\/\/ruuvi.com\/i\/u\/nrf-power-profile-2-5-0-1024x772.png\" alt=\"nRF Power Profile 2.5.0\" class=\"wp-image-3716\" srcset=\"https:\/\/ruuvi.com\/i\/u\/nrf-power-profile-2-5-0-1024x772.png 1024w, https:\/\/ruuvi.com\/i\/u\/nrf-power-profile-2-5-0-450x339.png 450w, https:\/\/ruuvi.com\/i\/u\/nrf-power-profile-2-5-0-768x579.png 768w, https:\/\/ruuvi.com\/i\/u\/nrf-power-profile-2-5-0-1536x1158.png 1536w, https:\/\/ruuvi.com\/i\/u\/nrf-power-profile-2-5-0-600x452.png 600w, https:\/\/ruuvi.com\/i\/u\/nrf-power-profile-2-5-0.png 2042w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Nichts Besonderes hier<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Jetzt verbrauchen wir im Leerlauf 5,9 <em>\u03bcA<\/em>, 0,7 <em>\u03bcA<\/em> weniger als die 6,6 <em>\u03bcA<\/em> in unserem vorherigen Beitrag. Wir verbrauchen wahrscheinlich nicht wirklich weniger Strom als zuvor, sondern dies ist eher ein Temperatureffekt oder eine Frage der Messwiederholbarkeit. <\/p>\n\n<p class=\"wp-block-paragraph\">Als N\u00e4chstes scannen wir den Tag und pr\u00fcfen, wie der Verbrauch aussieht.<\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"760\" src=\"https:\/\/ruuvi.com\/i\/u\/consumption-during-nfc-scan-1024x760.png\" alt=\"Verbrauch w&#xE4;hrend des NFC-Scans\" class=\"wp-image-3717\" srcset=\"https:\/\/ruuvi.com\/i\/u\/consumption-during-nfc-scan-1024x760.png 1024w, https:\/\/ruuvi.com\/i\/u\/consumption-during-nfc-scan-450x334.png 450w, https:\/\/ruuvi.com\/i\/u\/consumption-during-nfc-scan-768x570.png 768w, https:\/\/ruuvi.com\/i\/u\/consumption-during-nfc-scan-1536x1140.png 1536w, https:\/\/ruuvi.com\/i\/u\/consumption-during-nfc-scan-600x445.png 600w, https:\/\/ruuvi.com\/i\/u\/consumption-during-nfc-scan.png 2038w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Verbrauch w\u00e4hrend des NFC-Scans<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Der Stromverbrauch ist w\u00e4hrend des Scans deutlich h\u00f6her, da der <strong>HFCLK<\/strong> l\u00e4uft, um den Tag zu betreiben. Wichtig zu pr\u00fcfen ist, dass wir nach dem Scan wieder auf dem vorherigen Niveau sind, d. h. das C-Flag hat den Workaround f\u00fcr \u00fcberm\u00e4\u00dfigen Stromverbrauch nach dem <strong>NFC<\/strong>-Scan aktiviert. <\/p>\n\n<p class=\"wp-block-paragraph\">Als N\u00e4chstes dr\u00fccken wir \u201eB\u201c, um das Funkmodul zu starten, und schauen, wie sich unser Power-Treiber schl\u00e4gt.<\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"770\" src=\"https:\/\/ruuvi.com\/i\/u\/ble-transmission-1024x770.png\" alt=\"BLE-&#xDC;bertragung\" class=\"wp-image-3718\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ble-transmission-1024x770.png 1024w, https:\/\/ruuvi.com\/i\/u\/ble-transmission-450x338.png 450w, https:\/\/ruuvi.com\/i\/u\/ble-transmission-768x577.png 768w, https:\/\/ruuvi.com\/i\/u\/ble-transmission-1536x1155.png 1536w, https:\/\/ruuvi.com\/i\/u\/ble-transmission-600x451.png 600w, https:\/\/ruuvi.com\/i\/u\/ble-transmission.png 2038w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Jetzt verbraucht unsere <strong>BLE<\/strong>-\u00dcbertragung nur noch 10 mA in der Spitze<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Jetzt liegt unser durchschnittlicher Stromverbrauch bei 17,4 <em>\u03bcA<\/em>, 10 \u03bcA weniger als im vorherigen Beitrag, wo <strong>DC\/DC<\/strong> nicht aktiviert war. Das ist auch sehr konkurrenzf\u00e4hig mit den 24 <em>\u03bcA<\/em> der aktuellen Ruuvi Firmware \u2013 vielleicht bekommen wir am Ende eine etwas energieeffizientere Firmware? <\/p>\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n<p class=\"wp-block-paragraph\">Wir haben jetzt fast die gesamte Funktionalit\u00e4t der urspr\u00fcnglichen Ruuvi Firmware, aber ein wichtiges Feature fehlt noch: die Aktualisierung der Messung in regelm\u00e4\u00dfigen Abst\u00e4nden. Im n\u00e4chsten Teil der Serie f\u00fcgen wir einen Scheduler hinzu, um die Daten in regelm\u00e4\u00dfigen Abst\u00e4nden zu aktualisieren. <\/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 dem Tag eine Nahfeldkommunikations-Funktion (NFC) zum Auslesen hinzu, d. h. RuuviTag wird am Ende dieses Beitrags ein schreibgesch\u00fctzter NFC-Tag sein. Der finale Code dieses Blogbeitrags kann auf Ruuvi GitHub im ruuviblog-Branch, Tag 3.10.0-alpha, heruntergeladen werden. Bitte folge Teil 1 der Serie f\u00fcr Details zum Klonen des Repositories und [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":135865,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[324],"tags":[],"class_list":["post-135862","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 10: NFC-Auslesen - Ruuvi<\/title>\n<meta name=\"description\" content=\"Hinzuf\u00fcgen einer Nahfeldkommunikations-Funktionalit\u00e4t (NFC) zum Firmware-Code des smarten Bluetooth-Sensors RuuviTag.\" \/>\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-teil-10-nfc-auslesen\/\" \/>\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 10: NFC-Auslesen - Ruuvi\" \/>\n<meta property=\"og:description\" content=\"Hinzuf\u00fcgen einer Nahfeldkommunikations-Funktionalit\u00e4t (NFC) zum Firmware-Code des smarten Bluetooth-Sensors RuuviTag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/\" \/>\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-28T07:33: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-10.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=\"11\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-teil-10-nfc-auslesen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/\"},\"author\":{\"name\":\"Otso Jousimaa\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\"},\"headline\":\"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen\",\"datePublished\":\"2018-09-28T07:33:00+00:00\",\"dateModified\":\"2026-06-11T05:48:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/\"},\"wordCount\":858,\"image\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-10.jpeg\",\"articleSection\":[\"Ruuvi-Software-Artikel\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/\",\"name\":\"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen - Ruuvi\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-10.jpeg\",\"datePublished\":\"2018-09-28T07:33:00+00:00\",\"dateModified\":\"2026-06-11T05:48:56+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\"},\"description\":\"Hinzuf\u00fcgen einer Nahfeldkommunikations-Funktionalit\u00e4t (NFC) zum Firmware-Code des smarten Bluetooth-Sensors RuuviTag.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-10.jpeg\",\"contentUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-10.jpeg\",\"width\":1400,\"height\":733,\"caption\":\"Ruuvi Firmware Serie Teil 10 Intro-Bild\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-10-nfc-auslesen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/front\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen\"}]},{\"@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 10: NFC-Auslesen - Ruuvi","description":"Hinzuf\u00fcgen einer Nahfeldkommunikations-Funktionalit\u00e4t (NFC) zum Firmware-Code des smarten Bluetooth-Sensors RuuviTag.","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-teil-10-nfc-auslesen\/","og_locale":"de_DE","og_type":"article","og_title":"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen - Ruuvi","og_description":"Hinzuf\u00fcgen einer Nahfeldkommunikations-Funktionalit\u00e4t (NFC) zum Firmware-Code des smarten Bluetooth-Sensors RuuviTag.","og_url":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/","og_site_name":"Ruuvi","article_publisher":"https:\/\/www.facebook.com\/ruuvi.cc","article_published_time":"2018-09-28T07:33: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-10.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":"11\u00a0Minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/#article","isPartOf":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/"},"author":{"name":"Otso Jousimaa","@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00"},"headline":"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen","datePublished":"2018-09-28T07:33:00+00:00","dateModified":"2026-06-11T05:48:56+00:00","mainEntityOfPage":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/"},"wordCount":858,"image":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/#primaryimage"},"thumbnailUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10.jpeg","articleSection":["Ruuvi-Software-Artikel"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/","url":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/","name":"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen - Ruuvi","isPartOf":{"@id":"https:\/\/ruuvi.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/#primaryimage"},"image":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/#primaryimage"},"thumbnailUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10.jpeg","datePublished":"2018-09-28T07:33:00+00:00","dateModified":"2026-06-11T05:48:56+00:00","author":{"@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00"},"description":"Hinzuf\u00fcgen einer Nahfeldkommunikations-Funktionalit\u00e4t (NFC) zum Firmware-Code des smarten Bluetooth-Sensors RuuviTag.","breadcrumb":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/#primaryimage","url":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10.jpeg","contentUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-10.jpeg","width":1400,"height":733,"caption":"Ruuvi Firmware Serie Teil 10 Intro-Bild"},{"@type":"BreadcrumbList","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-10-nfc-auslesen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ruuvi.com\/de\/front\/"},{"@type":"ListItem","position":2,"name":"Ruuvi Firmware \u2013 Teil 10: NFC-Auslesen"}]},{"@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\/135862","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=135862"}],"version-history":[{"count":1,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135862\/revisions"}],"predecessor-version":[{"id":135870,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135862\/revisions\/135870"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/media\/135865"}],"wp:attachment":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/media?parent=135862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/categories?post=135862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/tags?post=135862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}