{"id":6492,"date":"2022-03-24T14:33:11","date_gmt":"2022-03-24T13:33:11","guid":{"rendered":"https:\/\/medtech-ingenieur.de\/?p=6492"},"modified":"2022-06-01T08:23:42","modified_gmt":"2022-06-01T07:23:42","slug":"zeitsynchronisation-mit-ble","status":"publish","type":"post","link":"https:\/\/medtech-ingenieur.de\/en\/zeitsynchronisation-mit-ble\/","title":{"rendered":"Time synchronization with BLE"},"content":{"rendered":"<style type=\"text\/css\">\n .second {<br \/>   margin-left: 0px;<br \/>   margin-bottom: 0px;<br \/>   margin-top: 0px;<br \/>   padding-left: 20px;<br \/>   padding-top: 0px;<br \/> }<\/p>\n<p> .first {<br \/>   margin-left: 0px;<br \/>   margin-bottom: 0px;<br \/>   margin-top: 0px;<br \/>   padding-left: 10px;<br \/>   padding-top: 0px;<br \/> }<\/p>\n<p> h2 {<br \/> font-size: 16px;<br \/> }<\/p>\n<p> h3 {<br \/> font-size: 14px;<br \/> }<\/p>\n<p>h4 {<br \/>font-size: 12px;<br \/>}<\/p>\n<\/style>\n<p><script type=\"text\/javascript\">\nfunction image(img)\n{\n    var src = img.src;\n    window.open(src);\n}\n<\/script><\/p>\n<p>Viele technische Anwendungen erfordern die zeitliche Synchronisation verschiedener Systemkomponenten. So sind auch wir bei MEDtech schon h\u00e4ufig mit diesem Thema in Kontakt gekommen. In diesem Blog m\u00f6chte ich zun\u00e4chst generell auf Zeitsynchronisation eingehen und danach eine Methode vorstellen, mit welcher Master-Zeitstempel unter Verwendung von BLE-Advertising Paketen verschickt und von Slaves empfangen sowie ausgewertet werden.Dabei soll speziell auf die Anforderungen eingegangen werden, welche an den verwendeten (Mikro-)Controller sowie die HF-Einheit gestellt werden. Daraus sollen sich dann die auftretenden Probleme ableiten und erkl\u00e4ren lassen.<\/p>\n<h2>Zeitsynchronisation: Was ist das?<\/h2>\n<p>Die Antwort auf diese Frage liegt den (hoffentlich) vielen lesenden Personen meines Beitrags bestimmt auf der Hand. Da ein Jeder erfahrungsgem\u00e4\u00df aber eine leicht abweichende (&#8222;eigene&#8220;) Definition f\u00fcr Zeitsynchronisation besitzt, m\u00f6chte ich meine Definition des Begriffs, zumindest f\u00fcr den Kontext dieses Artikels, einmal niedergeschrieben haben:<\/p>\n<blockquote><p>Zeitsynchronisation ist die Orientierung mehrerer Systemkomponenten an einem gemeinsamen, system\u00fcbergreifenden Taktsignal.<\/p><\/blockquote>\n<p>Die Begrifflichkeit &#8222;Taktsignal&#8220; ist hierbei von entscheidender Bedeutung: ein technisch verwertbares Taktsignal kann z.B. durch die Winkelbeschleunigung des Sekundenzeigers einer analogen Wanduhr erzeugt werden. Die Voraussetzung ist hier, dass die Uhr das typische &#8222;Tick&#8220;-Verhalten aufweist: der Zeiger wechselt in jeder Sekunde zwischen Stillstand und Bewegung. Ein Taktsignal ist also ein sich mit der Zeit \u00e4nderndes, periodisches Signal. Die Taktdauer entspricht der Periodendauer des Signals (in unserem Fall 1s).<\/p>\n<h2>Quarze statt Wanduhren!<\/h2>\n<p>In der Welt der Mikroelektronik wird f\u00fcr die Erzeugung eines Taktes aber selbstverst\u00e4ndlich keine Wanduhr benutzt (das w\u00e4re wirklich umst\u00e4ndlich, schon allein aus Platzgr\u00fcnden). Wir setzen hier auf kleine, aber sehr komfortabel einsetzbare Helferlein: sogenannte Oszillatoren. Diese generieren aus einer angelegten Gleichspannung ein periodisch schwingendes Signal. Es existieren viele verschiedene Oszillatortypen. Ein sehr g\u00e4ngiger sowie genauer Typ sind sogenannte Kristalloszillatoren (h\u00e4ufiger als Quarz bezeichnet, manchmal mit XTAL abgek\u00fcrzt). Deren Funktionsweise basiert auf den piezoelektrischen Eigenschaften der verwendeten Kristallstruktur. Die Genauigkeit liegt hier typischerweise im Bereich 10-100ppm (parts per million). Ein wenig ungenauer sind RC-Oszillatoren: bei diesen wird mithilfe mehrerer RC-Glieder, die auf eine Verst\u00e4rkerschaltung r\u00fcckgekoppelt werden, eine 180\u00b0 Phasendrehung und damit ein schwingungsf\u00e4higes System erzeugt. Weiterhin existieren in der Praxis: Schwingkreise bestehend aus Kondensatoren und Spulen, Keramikresonatoren, elektromechanische Oszillatoren (MEMS-Resonatoren). Eine gro\u00dfe T\u00fccke ist, dass die Genauigkeit eines Oszillators gro\u00dfe Abh\u00e4ngigkeiten aufweist: so z.B. die durch die Leiterplatte entstehenden parasit\u00e4ren Kapazit\u00e4ten. Auch zeigt die Genauigkeit bei den meisten Typen starke Temperatur- und Altersabh\u00e4ngigkeit.<\/p>\n<p>Aus der variierenden Genauigkeit ergibt sich eine Anforderung an die Synchronisation: m\u00f6chte man die Uhr einer Systemkomponente mit einer \u00fcbergeordneten Uhr synchronisieren, so gen\u00fcgt es nicht, die zwei Uhren lediglich zum selben Zeitpunkt zu starten. Die Uhren driften n\u00e4mlich mit der Zeit auseinander. Es ist also ein kontinuierlicher Austausch (Re-Synchronisation) notwendig. Das soll den sogenannten &#8222;Clock-Drift&#8220; kompensieren.<\/p>\n<h2>BLE als Kommunikationskanal<\/h2>\n<p>Nun stellt sich die Frage: wor\u00fcber kann dieser Austausch erfolgen, wenn die Systeme physisch voneinander getrennt sind? Wie die \u00dcberschrift des Artikels verr\u00e4t, m\u00f6chte ich an dieser Stelle \u00fcber die Verwendung von Bluetooth Low Energy sprechen. BLE bietet sich auf den ersten Blick nicht gerade f\u00fcr Synchronisationsanwendungen an: so werden beispielsweie nicht-verbindungsorientierte Pakete (sogenannte Advertising-Pakete) quasi azyklisch verschickt. Auf den Paketzyklus wird n\u00e4mlich eine Zufallszeit aus dem Intervall 0-10 ms addiert, um Kollisionen mit anderen Paketen vorzubeugen. Auch das Auftreten von Latenzen macht bei der Synchronisation zu schaffen: Nutzdaten m\u00fcssen n\u00e4mlich bei BLE einen riesigen Protokoll-Stack durchlaufen. Bei hohen Datenraten entsteht hier schnell Konkurrenz mit anderen Daten, wodurch die Synchronisationsdaten unter Umst\u00e4nden gepuffert werden m\u00fcssen. Nichtsdestotrotz ist BLE in den vergangenen Jahren aufgrund der gesteigerten Anforderungen an die Batterielaufzeit zu einem der weitverbreitesten Nahbereichs-Funkstandards aufgestiegen. Hierauf begr\u00fcndet sich die Notwendigkeit, auch eine Synchronisation \u00fcber BLE durchf\u00fchren zu k\u00f6nnen.<\/p>\n<h2>Synchronisation mit BLE<\/h2>\n<p>Ich m\u00f6chte im Folgenden eine Methode vorstellen, die Advertising Kan\u00e4le nutzt, um Synchronisationspakete von einem Master an einen oder mehrere Slaves zu \u00fcbermitteln. Die in meinen Versuchen erzielte Genauigkeit lag dabei im Rahmen von ca. 250\u00b5s, wobei der Optimierungsfokus auf die Stromeinsparung gerichtet war. Als Grundlage f\u00fcr die Arbeit dienten mir die Ver\u00f6ffentlichungen <a title=\"CheepSync (researchgate.net)\" href=\"https:\/\/www.researchgate.net\/publication\/271447948_CheepSync_A_Time_Synchronization_Service_for_Resource_Constrained_Bluetooth_Low_Energy_Advertisers\" target=\"_blank\" rel=\"noopener\">CheepSync<\/a> und <a title=\"BlueSync (ieeexplorer.ieee.org)\" href=\"https:\/\/ieeexplore.ieee.org\/document\/9555832\" target=\"_blank\" rel=\"noopener\">BlueSync<\/a>.<br \/>\nIn einem Blockdaigramm m\u00f6chte ich zun\u00e4chst die prinzipielle Architektur vorstellen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"935\" height=\"509\" class=\"alignnone size-medium wp-image-6664\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture.png\" alt=\"\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture.png 935w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-300x163.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-768x418.png 768w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-100x54.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-150x82.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-200x109.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-450x245.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-600x327.png 600w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/SyncArchitecture-900x490.png 900w\" sizes=\"auto, (max-width: 935px) 100vw, 935px\" \/><\/p>\n<p>Da Bluetooth-Stacks in der Regel gekapselt vom Rest der Software betrachtet werden m\u00fcssen, findet die Magie auf der Applikationsebene statt. Nun stellt sich die Frage: worum m\u00fcssen wir uns hier denn \u00fcberhaupt k\u00fcmmern? Die Antwort m\u00f6chte ich in einer Liste zusammenfassen.<\/p>\n<ol class=\"first\">\n<li>Typ und Inhalt des Synchronisationspakets<\/li>\n<li>Radio-Timing beim Empfang des Synchronisationspakets<\/li>\n<li>Verarbeitung des Synchronisationspakets\n<ul class=\"second\">\n<li>Identifikation der Pakete<\/li>\n<li>Latenzkompensation<\/li>\n<li>Plausibilit\u00e4tscheck<\/li>\n<li>RTC-Synchronisation<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Im Folgenden m\u00f6chte ich n\u00e4her auf die einzelnen Punkte eingehen.<\/p>\n<h3>Typ und Inhalt der Pakete<\/h3>\n<p>Zun\u00e4chst einmal etwas Grunds\u00e4tzliches: der hier beschriebene Algorithmus basiert auf der Verbreitung von BLE-Advertising Paketen vom Typ ADV_IND_NONCONN (durch den BLE-Substandard spezifiziert). Diese Pakete sind von allen Scanning-f\u00e4higen BLE-Nodes empfangbar, laden allerdings nicht zum Aufbau einer Verbindung ein. Weiterhin erlauben diese Pakete den Transport von generischen, anwendungsspezifischen Informationen: n\u00e4mlich im AD-Modus &#8222;Manufacturer Specific Data&#8220; (siehe <a title=\"Link\" href=\"https:\/\/btprodspecificationrefs.blob.core.windows.net\/assigned-numbers\/Assigned%20Number%20Types\/Generic%20Access%20Profile.pdf\">PDF-Dokument AD-Typen<\/a>). Nachteil der Advertising Pakete ist, dass diese keiner Sicherung unterliegen: geht w\u00e4hrend der \u00dcbertragung einmal ein Paket verloren oder wird besch\u00e4digt, kommt es zu keiner Retransmission. Fehlerhafte Pakete werden jedoch durch eine Checksumme durch den BLE-Stack erkannt und eliminiert.<br \/>\nUm den Algorithmus richtig ausf\u00fchren zu k\u00f6nnen, ben\u00f6tigen wir mindestens 3 Komponenten. Diese sind:<\/p>\n<ol class=\"first\">\n<li>Eindeutiger Identifikator zur Unterscheidung von anderen Paketen (z.B. 16 Bit)<\/li>\n<li>RTC-Zeitstempel, auf den sich der\/die Slaves synchronisieren werden (je nach Registergr\u00f6\u00dfe zwischen 8 und 32 Bit)<\/li>\n<li>Paketnummer (zur Erkennung von Paketverlust, wenige Bits mit \u00dcberlaufhandling)<\/li>\n<\/ol>\n<p>Beim benutzten Advertising Typ ist eine Nutzdatengr\u00f6\u00dfe von bis zu 31 Byte m\u00f6glich. Trotzdem sollten die Pakete m\u00f6glichst klein ausfallen: Da es beim Advertising nicht zu Retransmission kommt, ist ein Verlust der Pakete durch Kollision mit anderen Paketen sowie Konkurrenz mit anderen Funkstandards im unlizenzierten ISM Band m\u00f6glich. Kleine Pakte verringern die \u00dcbertragungsdauer der Pakete und damit die Wahrscheinlichkeit einer Kollision.<\/p>\n<h3>Radio Timing beim Empfang des Synchronisationspakets<\/h3>\n<p>Ein wichtiger Aspekt beim Empfang der Pakete ist das rechtzeitige Einschalten des Empf\u00e4ngers (im BLE-Jargon Scanner genannt). Zwar ist es denkbar und m\u00f6glich, ein Scanning durchgehend durchzuf\u00fchren. Davon w\u00fcrde ich pers\u00f6nlich jedoch abraten, da dies den Stromverbrauch unn\u00f6tigerweise in die H\u00f6he treibt. Beim Timing sind \u00fcbergeordnet zwei Komponenten zu beachten:<\/p>\n<ul class=\"first\">\n<li>Zykluszeit der Synchronisationspakete (T<sub>Sync<\/sub>)<\/li>\n<li>Vom BLE-Substandard vorgeschriebene Zufallszeit zur Zykluszeit der BLE-Pakete<\/li>\n<\/ul>\n<p>Auch muss man beachten, dass die Scanning-Intervalle durch die BLE-Spezifikation genau geregelt sind: der Empf\u00e4nger kann f\u00fcr eine Dauer T<sub>dur<\/sub> (Scan-Duration) innerhalb eines Zeitfensters T<sub>wdw<\/sub> (Scan-Window) eingeschaltet werden. Dabei muss T<sub>dur<\/sub> ein ganzzahliges Vielfaches von 2,5 ms sein. Die L\u00e4nge von T<sub>wdw<\/sub> muss ein ganzzahliges Vielfaches von 10ms betragen. Bei Benutzung eines guten BLE-Stacks sollte die Einstellung komfortabel \u00fcber ein SDK m\u00f6glich sein.<br \/>\nSoweit, so gut! Aber wie muss jetzt das Timing gestaltet werden? In der Praxis hat sich ergeben, dass der Scanner f\u00fcr geringe Verlust f\u00fcr mindestens T<sub>dur<\/sub>=100ms um den gesch\u00e4tzten Empfangszeitpunkt eingeschaltet werden sollte. Das hei\u00dft: m\u00f6chte man Pakete im Abstand von T<sub>Sync<\/sub>=10s zueinander \u00fcbermitteln, so sollte der Empf\u00e4nger im Zeitraum zwischen im Intervall zwischen i * (10s +- 0,05s) eingeschaltet sein. i beschreibt hierbei die Paketnummer seit Synchronisationsstart. Das folgende Oszillogramm kann dies ein bisschen besser darstellen:<\/p>\n<figure id=\"attachment_6561\" aria-describedby=\"caption-attachment-6561\" style=\"width: 600px\" class=\"wp-caption alignnone left\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-6561\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg.png\" alt=\"\" width=\"600\" height=\"378\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg.png 800w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg-300x189.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg-768x483.png 768w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg-100x63.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg-150x94.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg-200x126.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg-450x283.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/adv_vs_scan_100ms_scan_dur_comp_beg-600x377.png 600w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><figcaption id=\"caption-attachment-6561\" class=\"wp-caption-text\">Zwei Advertising Pakete (orangene Flanken) fallen in Scanning Intervalle (blaue Pegel)<\/figcaption><\/figure>\n<p>Zu beachten ist an dieser Stelle au\u00dferdem, dass die Zufallszeit \u00fcber die Dauer der Synchronisation kompensiert werden muss: das Scan-Window, in dem die Scans zyklisch durchgef\u00fchrt werden, muss mit dem Mittelwert der Zufallsverteilung (5ms) beaufschlagt werden. Die Dauer des Scan-Windows betr\u00e4gt also: <b>T<sub>wdw<\/sub> = T<sub>Sync<\/sub> + 5ms<\/b>.<\/p>\n<h3>Verarbeitung der Synchronisationspakete<\/h3>\n<h4>Identifikation<\/h4>\n<p>Der erste Schritt der Verarbeitung im Slave ist die Identifizierung der Synchronisationspakete. Dies muss in der Anwendungsschicht geschehen, da der BLE-Stack die Scanning-Resultate typischerweise im Rahmen eines Callbacks in die Applikationsschicht reicht. F\u00fcr die Identifizierung kann ein Siebsystem mit nach hinten feiner werdenden Sieben benutzt werden:<br \/>\nSieb 1: Filter nach Pakettyp (ADV_IND_NONCONN)<br \/>\nSieb 2: Filter nach AD-Modus (Manufacturer Specific Data)<br \/>\nSieb 3: Filter nach Identifikator (eigens gew\u00e4hlt)<br \/>\nDie Menge an in Frage kommenden Paketen wird also von oben nach unten geschm\u00e4lert. Das ist vor Allem wichtig, um den Callback schnell wieder verlassen zu k\u00f6nnen (gerade im urbanen Umfeld mit vielen BLE-Nodes k\u00f6nnen dann mehr Pakete empfangen werden).<\/p>\n<h4>Latenzkompensation<\/h4>\n<p>Prinzipiell lassen sich Latenzen in deterministische (&#8222;synchronisationsfreundliche&#8220;) und nicht-deterministische (&#8222;weniger synchronisationsfreundliche&#8220;) Latenzen einteilen. In unserem Fall, bei der \u00dcbertragung von Paketen mit BLE, treten leider auch geh\u00e4uft nicht-deterministische Latenzen auf. Diese entstehen z.B. durch die Belegung der CPU mit anderen Prozessen, was ein Abholen von empfangenen Paketen aus dem MAC-Layer verz\u00f6gern kann. Mit dem Wissen aus <a title=\"BlueSync (ieeexplorer.ieee.org)\" href=\"https:\/\/ieeexplore.ieee.org\/document\/9555832\" target=\"_blank\" rel=\"noopener\">[2]<\/a> lassen sich die nicht-deterministischen Verz\u00f6gerungen auf Masterseite jedoch nahezu komplett beseitigen: mithilfe eines Interrupts, der z.B. mithilfe eines latenzarmen <a title=\"Peripheral Interconnect (Wikipedia)\" href=\"https:\/\/en.wikipedia.org\/wiki\/Autonomous_peripheral_operation\">Off-load Peripheral Interconnect Signals<\/a> nach dem Versenden eines Pakets ausgel\u00f6st wird, wird der Zeitstempel f\u00fcr das n\u00e4chste Paket gebildet. Die versendeten Zeitstempel weisen dann immer ein Paket Versatz zueinander auf!<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-6576\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-300x86.png\" alt=\"\" width=\"600\" height=\"172\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-300x86.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-768x219.png 768w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-100x29.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-150x43.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-200x57.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-450x128.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2-600x171.png 600w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/delay_2.png 778w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><br \/>\nAus Sicht des Slaves verkompliziert sich die Interpretation des Zeitstempels dann allerdings ein wenig: wenn der Zeitstempel immer ein Paket Versatz aufweist, wie kommen wir dann auf den aktuellen Zeitstempel zum Empfang eines Pakets? Die Antwort liefert uns nicht die Glaskugel, sondern, wie so oft im Leben des Ingenieurs, die Mathematik. Mithilfe von ein wenig RAM sowie einfacher Algebra k\u00f6nnen wir uns n\u00e4mlich den Offset der Master und Slave Uhren zum Synchronisationszeitpunkt ausrechnen. Es muss sich nur der Slave-Zeitstempel bei Empfang des letzten Pakets (i-1) gemerkt werden. Beim Empfang des Folgepakets (i) kann dann der empfangene Master-Zeitstempel dem mit dem Paket (i-1) gebildeten Slave-Zeitstempel zugeordnet werden. Addiert der Slave nun noch die Z\u00e4hler-Ticks auf, die zwischen dem Empfang von Paket i-1 und Paket i gez\u00e4hlt wurden, so erh\u00e4lt man eine sehr genaue Sch\u00e4tzung f\u00fcr den Master-Zeitstempel.<\/p>\n<p>Ein Nachteil des Verfahrens liegt jedoch beim gro\u00dfen Einfluss von Paketverlust: geht einmal ein Paket verloren, so wirkt sich das im Slave auch auf das vorhergehende und auf das nachfolgende Paket aus. Zur genauen Sch\u00e4tzung des Master-Zeitstempels sind n\u00e4mlich immer zwei aufeinanderfolgende Pakete notwendig.<\/p>\n<h4>Plausibilit\u00e4tscheck zur Ausrei\u00dfererkennung<\/h4>\n<p>Diese Komponente hatte ich am Anfang meiner Arbeit an diesem Thema sehr untersch\u00e4tzt. Ich war es aus der Uni n\u00e4mlich gewohnt, mit deterministischen Systemen zu arbeiten. Ein Synchronisationssystem ist in der Regel aber kein solches System. Es k\u00f6nnen an vielen Stellen in dem Prozess unerwartet Verz\u00f6gerungen (nicht-deterministische Latenzen) auftreten, welche die \u00dcbermittlung der Synchronisationspakete st\u00f6ren und dadurch die Zeitstempel verf\u00e4lschen. Um solche Verf\u00e4lschungen zu &#8222;entlarven&#8220;, haben wir uns im Zuge dieser Aufgabe mit einem Median-Filter beholfen. Dieser \u00fcberpr\u00fcft die Plausibilit\u00e4t der Zeitstempel durch den Vergleich mit dem zuvor aus N Korrekturwerten gebildeten Median, wobei N die L\u00e4nge des Filters ist. Bei der Implementierung ist dabei vor Allem darauf zu achten, dass der Grenzwert, der die zul\u00e4ssige Toleranz zum Median bestimmt, weder zu gro\u00df noch zu klein ist sowie Korrekturen in beide Richtungen zul\u00e4sst. Die Funktionsweise des Filters kann man am Besten anhand einer Grafik beschreiben.<br \/>\n<img decoding=\"async\" class=\"alignnone size-medium wp-image-6620 w3-hover-opacity\" style=\"width: 60%; cursor: pointer;\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/MedianFilter.drawio4.png\" alt=\"\" \/><br \/>\nWichtig bei der Implementierung ist, dass der Korrekturwert immer relativ zur Dauer seit der letzten Synchronisation bestimmt und in das Filter abgelegt wird. Das ist wichtig, weil die Re-Synchronisation innerhalb eines Intervalles unter Umst\u00e4nden auch einmal \u00fcbersprungen werden kann, z.B. bei Paketverlust. Auch wird von einer Kompensation mit dem aktuellen Filterwert abgeraten, da dies die Stabilit\u00e4t des Systems beeinflussen kann. Als fehlerhafte erkannte Zeitstempel sollten verworfen werden. Weiterhin sollte die L\u00e4nge des Filters nicht zu klein sein. Ein Filter der L\u00e4nge 7 liefert bei unserer Anwendung gute Ergebnisse.<\/p>\n<h4>RTC-Synchronisation<\/h4>\n<p>An dieser Stelle m\u00f6chte ich noch anrei\u00dfen, wie der letzte Schritt des Kernvorgangs aussieht. Bis jetzt haben wir:<\/p>\n<ul class=\"first\">\n<li>Auf dem Master Zeitstempel gebildet und versendet<\/li>\n<li>Diese mit dem Slave empfangen<\/li>\n<li>Korrekturwerte aus Zeitstempelpaaren gebildet<\/li>\n<li>Die Korrekturwerte auf Plausibilit\u00e4t \u00fcberpr\u00fcft<\/li>\n<\/ul>\n<p>Nun soll also das &#8222;Nachstellen&#8220; der Uhr stattfinden. Je nach verwendetem Z\u00e4hlwerk sowie Anwendungsfall kann dies verschiedene Formen annehmen. Ich m\u00f6chte mich hier jedoch auf einen Fall beschr\u00e4nken, in dem eine direkte Manipulation des RTC-Registerwerks m\u00f6glich ist (was aber nicht selbstverst\u00e4ndlich ist): nehmen wir an, dass dies mit einer Funktion <code>void setTicks(uint32_t tickVal)<\/code> m\u00f6glich ist! Eine Funktion <code>uint32_t getTicks(void)<\/code> soll uns den aktuellen Z\u00e4hlwert der RTC als R\u00fcckgabewert liefern. Erkl\u00e4rtes Ziel ist an dieser Stelle also, das RTC-Z\u00e4hlwerk des Slaves auf den Wert der Master-RTC zu setzen. Ein Code-Beispiel soll uns den L\u00f6sungsweg aufzeigen.<\/p>\n<pre style=\"color: #000000; background: #ffffff;\"><span style=\"color: #696969;\">\/*<\/span>\r\n<span style=\"color: #696969;\">\u00a0* from previous processing steps we got the correction value<\/span>\r\n<span style=\"color: #696969;\">\u00a0* saved in variable correctionValueTicks<\/span>\r\n<span style=\"color: #696969;\">\u00a0*\/<\/span>\r\n\r\n<span style=\"color: #696969;\">\/\/ get slave rtc time in ticks<\/span>\r\nuint32_t slaveTicks <span style=\"color: #808030;\">=<\/span> getTicks<span style=\"color: #808030;\">(<\/span><span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n\r\n<span style=\"color: #696969;\">\/\/ correct slave rtc time to master's rtc time<\/span>\r\nuint32_t masterTicks <span style=\"color: #808030;\">=<\/span> slaveTicks <span style=\"color: #808030;\">+<\/span> correctionValueTicks<span style=\"color: #800080;\">;<\/span>\r\n\r\n<span style=\"color: #696969;\">\/\/ set new rtc time<\/span>\r\nsetTicks<span style=\"color: #808030;\">(<\/span>masterTicks<span style=\"color: #808030;\">)<\/span><span style=\"color: #800080;\">;<\/span>\r\n<\/pre>\n<h3>Re-Synchronisationsintervalle<\/h3>\n<p>Bevor ich einige Ergebnisse unserer Arbeit zeige, m\u00f6chte ich noch kurz auf das letzte, wichtige Thema eingehen. Das Thema Re-Synchronisationsintervall beeinflusst die Genauigkeit sowie den Stromverbrauch der Synchronisation n\u00e4mlich stark. W\u00e4hlt man die Re-Synchronisationsintervalle n\u00e4mlich zu gro\u00df, so leidet die Genauigkeit durch den Clock-Drift. Der Stromverbrauch des Slaves wird jedoch durch die wenigen Empfangsintervalle sinken. Hier handelt es sich also um einen Trade-Off zwischen Genauigkeit und Stromverbrauch. Wie komme ich also auf den &#8222;richtigen&#8220; Wert f\u00fcr die Re-Synchronisation? Die Antwort auf diese Frage h\u00e4ngt im Grunde von der Gr\u00f6\u00dfe des RTC-Drifts ab. Bei einem guten Leiterplattendesign und der Verwendung von hochwertigen Oszillatoren kann die Dauer der Re-Synchronisationsintervalle problemlos gro\u00df gew\u00e4hlt werden, ohne mit gro\u00dfen Unannehmlichkeiten rechnen zu m\u00fcssen. Hier spart man nat\u00fcrlich auch sehr viel Strom! Im Umkehrschluss gilt: je ungenauer meine Uhren &#8222;von Natur aus&#8220; sind, desto \u00f6fter m\u00fcssen sie nat\u00fcrlich nachgestellt werden. In unserer Anwendung benutzen wir sehr ungenaue Uhren (keine Quarz-, sondern RC-Oszillatoren). Wir m\u00fcssen hier alle 10s (siehe Grafik) neue Pakete verschicken, um die gew\u00fcnschte Genauigkeit beizubehalten.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-6638\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio.png\" alt=\"\" width=\"633\" height=\"187\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio.png 633w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio-300x89.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio-100x30.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio-150x44.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio-200x59.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio-450x133.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/OwnSync-Page-1.drawio-600x177.png 600w\" sizes=\"auto, (max-width: 633px) 100vw, 633px\" \/><br \/>\nUnd warum verschicken wir 3 Sync-Pakete? Die Antwort ist einfach: sollte durch St\u00f6rung im Kanal einmal ein Paket verloren gehen, existiert noch ein Paket &#8222;Reserve&#8220;. Der Algorithmus braucht \u00fcber das Intervall von 10s jedoch nur ein Paketpaar zur Synchronisation. Das \u00fcberfl\u00fcssige Paket kann dann verworfen werden.<\/p>\n<h3>Ergebnisse<\/h3>\n<p>Zuletzt wollen wir uns den Ergebnissen dieser Arbeit widmen: im Praxisversuch konnte \u00fcber die Versuchsdauer von 8h eine Genauigkeit von im Mittel ca. 25,2 \u00b5s erzielt werden, wobei die Spannweite der resultierenden Verteilung ca. 460 \u00b5s betr\u00e4gt. Die Samples werden durch jeweils einen RTC-Interrupt auf Master bzw. Slave gebildet, deren RTCs mithilfe des hier beschriebenen Algorithmus synchronisiert wurden. In der Interrupt Routine wird auf beiden Controllern ein Pin getoggled. Mithilfe eines dritten Controllers kann der Abstand der Flanken zueinander bestimmt werden.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1360\" height=\"665\" class=\"alignnone size-medium wp-image-6643\" style=\"cursor: pointer;\" src=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr.png\" alt=\"\" srcset=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr.png 1360w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-300x147.png 300w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-768x376.png 768w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-1024x501.png 1024w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-100x49.png 100w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-150x73.png 150w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-200x98.png 200w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-450x220.png 450w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-600x293.png 600w, https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/Figure_8h_Own_Sync_Method_no_corr-900x440.png 900w\" sizes=\"auto, (max-width: 1360px) 100vw, 1360px\" \/><\/p>\n<h3>Und was ist noch wichtig?<\/h3>\n<p>Man sollte sich bewusst sein, dass die Genauigkeit der Synchronisation nie genauer als der Wert der RTC-Aufl\u00f6sung sein kann. Liegt die Aufl\u00f6sung der RTC bei 30,5 \u00b5s (RTC-Frequenz 32,768 kHz), so wird die Genauigkeit der Synchronisation mit dieser Methode stets schlechter als dieser Wert sein.<\/p>\n<h3>Noch Fragen?<\/h3>\n<p>Designen Sie ein Produkt, das Synchronisation ben\u00f6tigt oder brauchen Sie Hilfe bei der Umsetzung ihrer BLE-Features? Durch viele erfolgreiche Projekte in diesem Bereich verf\u00fcgen wir bei MEDtech \u00fcber geballtes BLE Know-How. Kommen Sie also gerne auf uns zu!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Viele technische Anwendungen erfordern die zeitliche Synchronisation verschiedener Systemkomponenten. So sind auch wir bei MEDtech schon h\u00e4ufig mit diesem Thema in Kontakt gekommen. In diesem Blog m\u00f6chte ich zun\u00e4chst generell auf Zeitsynchronisation eingehen und danach eine Methode vorstellen, mit welcher Master-Zeitstempel unter Verwendung von BLE-Advertising Paketen verschickt und von Slaves empfangen sowie ausgewertet werden.Dabei soll [&hellip;]<\/p>\n","protected":false},"author":24,"featured_media":6673,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3,6,5],"tags":[285,175,174,598,462,597,596],"class_list":["post-6492","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-dokumentation","category-software","category-technik","tag-ble","tag-bluetooth","tag-bluetooth-low-energy","tag-genauigkeit","tag-latenz","tag-stromsparen","tag-synchronisation","post-wrapper","thrv_wrapper"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Zeitsynchronisation mit BLE - MEDtech Ingenieur GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/medtech-ingenieur.de\/en\/zeitsynchronisation-mit-ble\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zeitsynchronisation mit BLE - MEDtech Ingenieur GmbH\" \/>\n<meta property=\"og:description\" content=\"Viele technische Anwendungen erfordern die zeitliche Synchronisation verschiedener Systemkomponenten. So sind auch wir bei MEDtech schon h\u00e4ufig mit diesem Thema in Kontakt gekommen. In diesem Blog m\u00f6chte ich zun\u00e4chst generell auf Zeitsynchronisation eingehen und danach eine Methode vorstellen, mit welcher Master-Zeitstempel unter Verwendung von BLE-Advertising Paketen verschickt und von Slaves empfangen sowie ausgewertet werden.Dabei soll [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/medtech-ingenieur.de\/en\/zeitsynchronisation-mit-ble\/\" \/>\n<meta property=\"og:site_name\" content=\"MEDtech Ingenieur GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/medtechIngenieur\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-24T13:33:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-06-01T07:23:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/pngwing.com_-e1654068202880.png\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Luca Lattanzio\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@MedtechIng\" \/>\n<meta name=\"twitter:site\" content=\"@MedtechIng\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Luca Lattanzio\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/\"},\"author\":{\"name\":\"Luca Lattanzio\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/person\\\/4afffdafc5ce4e056c9991577853e999\"},\"headline\":\"Zeitsynchronisation mit BLE\",\"datePublished\":\"2022-03-24T13:33:11+00:00\",\"dateModified\":\"2022-06-01T07:23:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/\"},\"wordCount\":2526,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/pngwing.com_-e1654068202880.png\",\"keywords\":[\"BLE\",\"Bluetooth\",\"Bluetooth Low Energy\",\"Genauigkeit\",\"Latenz\",\"Stromsparen\",\"Synchronisation\"],\"articleSection\":[\"Allgemein\",\"Dokumentation\",\"Software\",\"Technik\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/\",\"name\":\"Zeitsynchronisation mit BLE - MEDtech Ingenieur GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/pngwing.com_-e1654068202880.png\",\"datePublished\":\"2022-03-24T13:33:11+00:00\",\"dateModified\":\"2022-06-01T07:23:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#primaryimage\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/pngwing.com_-e1654068202880.png\",\"contentUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/pngwing.com_-e1654068202880.png\",\"width\":300,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/zeitsynchronisation-mit-ble\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zeitsynchronisation mit BLE\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#website\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\",\"name\":\"MEDtech Ingenieur GmbH\",\"description\":\"Ingenieursdienstleister f\u00fcr Medizintechnik\",\"publisher\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\"},\"alternateName\":\"MEDtech\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/medtech-ingenieur.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#organization\",\"name\":\"MEDtech Ingenieur\",\"alternateName\":\"MEDtech\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/logo-700x700-1.png\",\"contentUrl\":\"https:\\\/\\\/medtech-ingenieur.de\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/logo-700x700-1.png\",\"width\":700,\"height\":700,\"caption\":\"MEDtech Ingenieur\"},\"image\":{\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/medtechIngenieur\",\"https:\\\/\\\/x.com\\\/MedtechIng\",\"https:\\\/\\\/www.instagram.com\\\/medtech.ingenieure\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/37871229\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/medtech-ingenieur.de\\\/#\\\/schema\\\/person\\\/4afffdafc5ce4e056c9991577853e999\",\"name\":\"Luca Lattanzio\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d2cfcb769405caee34cb5557583054fbdf9999caecc3f85d7ac388e72b273685?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d2cfcb769405caee34cb5557583054fbdf9999caecc3f85d7ac388e72b273685?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d2cfcb769405caee34cb5557583054fbdf9999caecc3f85d7ac388e72b273685?s=96&d=mm&r=g\",\"caption\":\"Luca Lattanzio\"},\"description\":\"Luca ist studierter Elektrotechnik-Ingenieur und sammelte w\u00e4hrend seines Studiums sowie in der Zeit danach wertvolle berufliche Erfahrungen bei MEDtech. Obwohl er inzwischen f\u00fcr ein anderes Unternehmen t\u00e4tig ist, bleibt er bei MEDtech als Autor erhalten und verfasst gelegentlich Beitr\u00e4ge, um seine Expertise und Leidenschaft f\u00fcr seinen Beruf zu teilen. Dar\u00fcber hinaus z\u00e4hlt er weiterhin zu den engagierten Lesern des Blogs.\",\"url\":\"https:\\\/\\\/medtech-ingenieur.de\\\/en\\\/author\\\/llattanzio\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Time synchronization with BLE - MEDtech Ingenieur GmbH","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:\/\/medtech-ingenieur.de\/en\/zeitsynchronisation-mit-ble\/","og_locale":"en_US","og_type":"article","og_title":"Zeitsynchronisation mit BLE - MEDtech Ingenieur GmbH","og_description":"Viele technische Anwendungen erfordern die zeitliche Synchronisation verschiedener Systemkomponenten. So sind auch wir bei MEDtech schon h\u00e4ufig mit diesem Thema in Kontakt gekommen. In diesem Blog m\u00f6chte ich zun\u00e4chst generell auf Zeitsynchronisation eingehen und danach eine Methode vorstellen, mit welcher Master-Zeitstempel unter Verwendung von BLE-Advertising Paketen verschickt und von Slaves empfangen sowie ausgewertet werden.Dabei soll [&hellip;]","og_url":"https:\/\/medtech-ingenieur.de\/en\/zeitsynchronisation-mit-ble\/","og_site_name":"MEDtech Ingenieur GmbH","article_publisher":"https:\/\/www.facebook.com\/medtechIngenieur","article_published_time":"2022-03-24T13:33:11+00:00","article_modified_time":"2022-06-01T07:23:42+00:00","og_image":[{"width":300,"height":300,"url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/pngwing.com_-e1654068202880.png","type":"image\/png"}],"author":"Luca Lattanzio","twitter_card":"summary_large_image","twitter_creator":"@MedtechIng","twitter_site":"@MedtechIng","twitter_misc":{"Written by":"Luca Lattanzio","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#article","isPartOf":{"@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/"},"author":{"name":"Luca Lattanzio","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/person\/4afffdafc5ce4e056c9991577853e999"},"headline":"Zeitsynchronisation mit BLE","datePublished":"2022-03-24T13:33:11+00:00","dateModified":"2022-06-01T07:23:42+00:00","mainEntityOfPage":{"@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/"},"wordCount":2526,"commentCount":0,"publisher":{"@id":"https:\/\/medtech-ingenieur.de\/#organization"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#primaryimage"},"thumbnailUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/pngwing.com_-e1654068202880.png","keywords":["BLE","Bluetooth","Bluetooth Low Energy","Genauigkeit","Latenz","Stromsparen","Synchronisation"],"articleSection":["Allgemein","Dokumentation","Software","Technik"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/","url":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/","name":"Time synchronization with BLE - MEDtech Ingenieur GmbH","isPartOf":{"@id":"https:\/\/medtech-ingenieur.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#primaryimage"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#primaryimage"},"thumbnailUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/pngwing.com_-e1654068202880.png","datePublished":"2022-03-24T13:33:11+00:00","dateModified":"2022-06-01T07:23:42+00:00","breadcrumb":{"@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#primaryimage","url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/pngwing.com_-e1654068202880.png","contentUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2022\/03\/pngwing.com_-e1654068202880.png","width":300,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/medtech-ingenieur.de\/zeitsynchronisation-mit-ble\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/medtech-ingenieur.de\/"},{"@type":"ListItem","position":2,"name":"Zeitsynchronisation mit BLE"}]},{"@type":"WebSite","@id":"https:\/\/medtech-ingenieur.de\/#website","url":"https:\/\/medtech-ingenieur.de\/","name":"MEDtech Ingenieur GmbH","description":"Engineering service provider for medical technology","publisher":{"@id":"https:\/\/medtech-ingenieur.de\/#organization"},"alternateName":"MEDtech","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/medtech-ingenieur.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/medtech-ingenieur.de\/#organization","name":"MEDtech Engineer","alternateName":"MEDtech","url":"https:\/\/medtech-ingenieur.de\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/logo\/image\/","url":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2024\/01\/logo-700x700-1.png","contentUrl":"https:\/\/medtech-ingenieur.de\/wp-content\/uploads\/2024\/01\/logo-700x700-1.png","width":700,"height":700,"caption":"MEDtech Ingenieur"},"image":{"@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/medtechIngenieur","https:\/\/x.com\/MedtechIng","https:\/\/www.instagram.com\/medtech.ingenieure\/","https:\/\/www.linkedin.com\/company\/37871229\/"]},{"@type":"Person","@id":"https:\/\/medtech-ingenieur.de\/#\/schema\/person\/4afffdafc5ce4e056c9991577853e999","name":"Luca Lattanzio","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d2cfcb769405caee34cb5557583054fbdf9999caecc3f85d7ac388e72b273685?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d2cfcb769405caee34cb5557583054fbdf9999caecc3f85d7ac388e72b273685?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d2cfcb769405caee34cb5557583054fbdf9999caecc3f85d7ac388e72b273685?s=96&d=mm&r=g","caption":"Luca Lattanzio"},"description":"Luca studied electrical engineering and gained valuable professional experience at MEDtech during and after his studies. Although he now works for another company, he remains a contributing writer at MEDtech, occasionally contributing articles to share his expertise and passion for his profession. He also remains a dedicated reader of the blog.","url":"https:\/\/medtech-ingenieur.de\/en\/author\/llattanzio\/"}]}},"_links":{"self":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/6492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/comments?post=6492"}],"version-history":[{"count":124,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/6492\/revisions"}],"predecessor-version":[{"id":6622,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/posts\/6492\/revisions\/6622"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/media\/6673"}],"wp:attachment":[{"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/media?parent=6492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/categories?post=6492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/medtech-ingenieur.de\/en\/wp-json\/wp\/v2\/tags?post=6492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}