{"id":2144,"date":"2015-11-26T18:46:14","date_gmt":"2015-11-26T10:46:14","guid":{"rendered":"https:\/\/gergely.imreh.net\/blog\/?p=2144"},"modified":"2018-05-21T16:32:42","modified_gmt":"2018-05-21T15:32:42","slug":"navspark-beidou-ntp","status":"publish","type":"post","link":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/","title":{"rendered":"Dual Satellite NTP server with Navspark"},"content":{"rendered":"<p>A friend from NIST recently told me about a <a href=\"http:\/\/www.satsignal.eu\/ntp\/Raspberry-Pi-NTP.html\">Raspberry Pi Stratum-1 NTP server<\/a> project, and that reminded me of the <a href=\"https:\/\/gergely.imreh.net\/blog\/2014\/05\/navspark-beidou\/\">experiments I did<\/a> with the Navspark dual GPS+Beidou receiver module. Navspark is a small, Arduino-compatible module that besides GPS can also receive data from China&#8217;s <a href=\"https:\/\/en.wikipedia.org\/wiki\/BeiDou_Navigation_Satellite_System\">Beidou\u00a0\u5317\u6597 satellite navigation system<\/a>\u00a0, that is currently being built. I thought it would be fun to build a Beidou-powered Stratum-1 NTP server to see how does it compare to GPS.<\/p>\n<h2>Hardware<\/h2>\n<p>To have a really good really good, satellite-powered reference clock, I have to have access to a 1-pulse-per-second (1PPS) signal from the receiver. The pure USB-connected receivers don&#8217;t really seem to do that yet (looks like plenty of opportunities there!), instead I have to use separate hardware for it.<\/p>\n<p>The Navspark module has a 1PPS pin (GPO3 below), and the only other pin I&#8217;ll really need is a serial pin to receive the NMEA stream of the satellite lock data (TXD1 below).<\/p>\n<figure id=\"attachment_1768\" aria-describedby=\"caption-attachment-1768\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2014\/05\/pinout1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1768 size-full\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2014\/05\/pinout1.jpg\" alt=\"Detailed Navspark pinout with pin functions\" width=\"500\" height=\"530\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2014\/05\/pinout1.jpg 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2014\/05\/pinout1-472x500.jpg 472w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><figcaption id=\"caption-attachment-1768\" class=\"wp-caption-text\">Navspark pinout from the User Manual<\/figcaption><\/figure>\n<p><!--more-->These pins have to be connected to a Raspberry Pi 2&#8217;s GPIO pins.<\/p>\n<figure id=\"attachment_2155\" aria-describedby=\"caption-attachment-2155\" style=\"width: 882px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/raspberry_pi_circuit_note_fig2a-min.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2155 size-full\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/raspberry_pi_circuit_note_fig2a-min.jpg\" alt=\"Raspberry Pi 2 pinout diagram\" width=\"882\" height=\"770\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/raspberry_pi_circuit_note_fig2a-min.jpg 882w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/raspberry_pi_circuit_note_fig2a-min-500x437.jpg 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/raspberry_pi_circuit_note_fig2a-min-768x670.jpg 768w\" sizes=\"auto, (max-width: 882px) 100vw, 882px\" \/><\/a><figcaption id=\"caption-attachment-2155\" class=\"wp-caption-text\">Raspberry Pi 2 pinout diagram<\/figcaption><\/figure>\n<p>Based on the pinout above, and some digging around, the connections I needed to make between the Pi (left) and Navspark (right) were:<\/p>\n<ul>\n<li>5V \u2194\u00a0BATTERY<\/li>\n<li>Ground \u2194 GND<\/li>\n<li>GPIO15 (UART0_RX) \u2194 TXD1<\/li>\n<li>GPIO8 \u2194 P1PPS (GPO3)<\/li>\n<\/ul>\n<p>Some things to remember here, that on serial connections one side&#8217;s RX line is connected to the other&#8217;s TX \u00a0and vice versa. Also, as much as I gather any other GPIO pins on the Pi could be used to receive the 1PPS signal, I used GPIO8 because it&#8217;s been used by other projects and playing it safe&#8230;<\/p>\n<p>The adapter board was easy enough to put together (though single-side pads are a pain when the components are on both sides, as it is the case here).<\/p>\n<figure id=\"attachment_2147\" aria-describedby=\"caption-attachment-2147\" style=\"width: 604px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_testrun_home.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2147 size-large\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_testrun_home-1024x715.jpg\" alt=\"Raspberry Pi 2 with Navspark adapter board\" width=\"604\" height=\"422\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_testrun_home-1024x715.jpg 1024w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_testrun_home-500x349.jpg 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_testrun_home-768x536.jpg 768w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><figcaption id=\"caption-attachment-2147\" class=\"wp-caption-text\">Raspberry Pi 2 with Navspark adapter board<\/figcaption><\/figure>\n<p>The adapter works well enough, though I&#8217;m sure that it could be done nicer.<\/p>\n<h2>Software<\/h2>\n<p>I found a lot of examples and help from other people&#8217;s similar projects but there were still some differences to be figured along the way.\u00a0The overall setup was to be as follows:<\/p>\n<ul>\n<li><a href=\"http:\/\/archlinuxarm.org\/platforms\/armv7\/broadcom\/raspberry-pi-2\">ArchLinux ARM<\/a>\u00a0for base platform<\/li>\n<li><a href=\"http:\/\/www.catb.org\/gpsd\/\">gpsd<\/a> for interpreting the Navspark NMEA messages<\/li>\n<li>LinuxPPS for 1PPS signal passing from GPIO to the userspace<\/li>\n<li><a href=\"http:\/\/chrony.tuxfamily.org\/\">chrony<\/a>\u00a0as time server (as opposed to the usual ntpd)<\/li>\n<\/ul>\n<p>Installing the system was straightforward enough (well, because I&#8217;ve done it so many times, but I digress), and added a few required basic packages: gpsd, chrony, git, the base-devel group, <a href=\"https:\/\/wiki.archlinux.org\/index.php\/Avahi\">avahi<\/a> (for easier network discovery).<\/p>\n<h3>GPSD<\/h3>\n<p>UART0 serial communication is done through the \/dev\/ttyAMA0 device in Pi, though the default settings needed some change for gpsd to be able to receive the data from Navspark.<\/p>\n<p>Most of the changes our <a href=\"http:\/\/logicalgenetics.com\/serial-on-raspberry-pi-arch-linux\/\">outline in a blogpost<\/a>\u00a0where I have learned from as well. First remove all config settings from \/boot\/cmdline.txt, basically these parts:<\/p>\n<pre class=\"lang:default decode:true\">console=ttyAMA0,115200 kgdboc=ttyAMA0,115200<\/pre>\n<p>Next disable the automatic serial console on that device with removing relevant systemd unit with<\/p>\n<pre class=\"lang:default decode:true\">sudo systemctl disable serial-getty@ttyAMA0.service<\/pre>\n<p>Then\u00a0have to set up the serial channel&#8217;s baud rate to enable communication, and here I&#8217;ve done that with udev: create a new rule file at \/etc\/udev\/rules.d\/AMA0_serial.rules with the content of<\/p>\n<pre class=\"lang:default decode:true \">KERNEL==\"ttyAMA0\", RUN+=\"\/bin\/stty -F \/dev\/ttyAMA0 115200 raw -echo\"<\/pre>\n<p>which will set the 115200 baud rate used by Navspark when the ttyAMA0 device comes up.<\/p>\n<p>Finally have to add gpsd&#8217;s default settings in the \/etc\/gpsd file:<\/p>\n<pre class=\"lang:default decode:true \"># Default settings for gpsd.\r\nSTART_DAEMON=\"true\"\r\nGPSD_OPTIONS=\"-b -n\"\r\nDEVICES=\"\/dev\/ttyAMA0\"\r\nUSBAUTO=\"true\"<\/pre>\n<p>Now it&#8217;s ready, and should be able to run gpsd and see some communication.<\/p>\n<pre class=\"lang:default decode:true\">sudo systemctl start gpsd<\/pre>\n<p>and if want to start it on boot, then run the same command with &#8220;enable&#8221; instead &#8220;start&#8221;. Use gpsmon to see what NMEA data Navspark sends, and hopefully it will lock on soon too (mind the sky visibility!). Can also use cgps to monitor which satellites the system is locked onto.<\/p>\n<h3>1PPS<\/h3>\n<p>For 1PPS I had to add an item to \/boot\/config.txt:<\/p>\n<pre class=\"lang:default decode:true\">dttoverlay=pps-gpio,gpiopin=8<\/pre>\n<p>This adds the relevant device tree overlay to enable the pps-gpio driver on GPIO8. Upon boot there was a \/dev\/pps0 device that can be poked at e.g. with ppstest from\u00a0<a href=\"https:\/\/github.com\/ago\/pps-tools\">pps-tools<\/a>. Since pps-tools did not have a package on ArchLinux, I made one, and the <a href=\"https:\/\/gist.github.com\/imrehg\/5548370432737a82f58c\">PKGBUILD is available on Github<\/a>. That package also adds the timepps.h header file which is required for the chrony PPS driver to work.<\/p>\n<p>The pps signal can be checked by running ppstest:<\/p>\n<pre class=\"lang:sh decode:true \">$ sudo ppstest \/dev\/pps0\r\ntrying PPS source \"\/dev\/pps0\"\r\nfound PPS source \"\/dev\/pps0\"\r\nok, found 1 source(s), now start fetching data...\r\nsource 0 - assert 1448436177.999366423, sequence: 199 - clear  0.000000000, sequence: 0\r\nsource 0 - assert 1448436178.999373610, sequence: 200 - clear  0.000000000, sequence: 0\r\n...<\/pre>\n<p>but it needs a 3D fix for the signal to show up.<\/p>\n<h3>Chrony<\/h3>\n<p>Next up is the time server itself. The satellite time will be pulled in using two &#8220;reference clock&#8221;: the GPS timestamps provided by gpsd through a memory interface, and the PPS data that locks those timestamps. Unfortunately the PPS driver is not built in by default because it needs the timepps.h header. This means after installing pps-tools chrony needs to be recompiled.<\/p>\n<p>Update the chrony configuration by editing the \/etc\/chrony.conf file. I usually leave the defaults alone, and add my modifications to the end of the file for clarity. Here&#8217;s my current setup:<\/p>\n<pre class=\"lang:default decode:true\">lock_all\r\n\r\nlogdir \/var\/log\/chrony\r\nlog measurements statistics tracking refclocks\r\n\r\n# being a server\r\nallow 192.168\/16\r\n\r\nserver 2.tw.pool.ntp.org iburst\r\nserver 3.asia.pool.ntp.org iburst\r\nserver 2.asia.pool.ntp.org iburst\r\nserver 1.europe.pool.ntp.org iburst\r\n\r\n# on-boot time setup, from https:\/\/news.ycombinator.com\/item?id=9796885\r\nmakestep 0.1 1\r\n\r\n# from https:\/\/www.raspberrypi.org\/forums\/viewtopic.php?f=41&amp;t=1970&amp;start=275\r\nrefclock PPS \/dev\/pps0 lock GPS prefer refid PPS0\r\n# If Beidou, there is a day offset somehow\r\nrefclock SHM 0 offset -86400 delay 0.1 refid GPS noselect\r\n\r\nleapsectz right\/Asia\/Taipei<\/pre>\n<p>It uses <a href=\"http:\/\/www.pool.ntp.org\/en\/\">NTP pool servers<\/a> for initial time setup and a quick on-boot step (as we don&#8217;t want to be stuck at 1970, do we?). The time service related settings are the &#8220;<a href=\"http:\/\/chrony.tuxfamily.org\/manual.html#refclock\">refclock<\/a>&#8221; parts. The first line sets the 1PPS lock-on and I tell chrony to prefer that over other sources so we&#8217;ll switch over to that when there&#8217;s good-enough data. The second refclock section uses gpsd&#8217;s NMEA data. The large offset there is due to some issues where the reference time shows up with 24h offset. That I still need to investigate. The delay time set needs some fine-tuning too (I think), though from comments 0.1-0.3 (that is seconds) seems to be suitable? I also tell chrony not to use that for reference.<\/p>\n<p>I also set leap seconds timezones (with the &#8220;right\/&#8230;&#8221; \u00a0TAI time zone, see e.g. the <a href=\"http:\/\/support.ntp.org\/bin\/view\/Support\/TimeScales\">NTP support page<\/a>\u00a0and a <a href=\"https:\/\/lists.debian.org\/debian-user\/2005\/12\/msg03343.html\">discussion on the Debian mailing list<\/a>).\u00a0And I enable the server on the local network so other can connect to it and get the time.<\/p>\n<p>I&#8217;ve enabled logging of the tracking data (so there&#8217;s offset and other information available) and refclocks (tailing \/var\/log\/chrony\/refclocks.log continuously is a handy way to see when the lock is lost).<\/p>\n<p>Start chrony (or enable if you want to start it on boot)<\/p>\n<pre class=\"lang:default decode:true\">sudo systemctl start chrony<\/pre>\n<p>and the results can be monitored with chronyc.<\/p>\n<h3>All together now<\/h3>\n<p>If everything worked well, gpsmon should show a good locked signal after not too much time, something like this:<\/p>\n<figure id=\"attachment_2149\" aria-describedby=\"caption-attachment-2149\" style=\"width: 823px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_gpsmon.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2149 size-full\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_gpsmon.png\" alt=\"Navspark lock in gpsmon\" width=\"823\" height=\"513\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_gpsmon.png 823w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_gpsmon-500x312.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_gpsmon-768x479.png 768w\" sizes=\"auto, (max-width: 823px) 100vw, 823px\" \/><\/a><figcaption id=\"caption-attachment-2149\" class=\"wp-caption-text\">Navspark lock in gpsmon<\/figcaption><\/figure>\n<p>From the interface above I can also see that Navspark has a 3D lock (Mode A3) to satellites number 209, 207, and 206, which are Beidou birds. And that the time offset is 86399.96 seconds (~24h), that is what the chrony configuration compensates for.<\/p>\n<p>Checking the results in chrony I the system time it&#8217;s locked to PPS0 where the last sample had 410ns offset (pretty good). \u00a0Also printed the sourcestats.<\/p>\n<figure id=\"attachment_2150\" aria-describedby=\"caption-attachment-2150\" style=\"width: 823px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_chronyc.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2150 size-full\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_chronyc.png\" alt=\"Navspark-powered chrony time lock (PPS0 and GPS signal is relevant): sources and sourcestats\" width=\"823\" height=\"513\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_chronyc.png 823w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_chronyc-500x312.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_chronyc-768x479.png 768w\" sizes=\"auto, (max-width: 823px) 100vw, 823px\" \/><\/a><figcaption id=\"caption-attachment-2150\" class=\"wp-caption-text\">Navspark-powered chrony time lock (PPS0 and GPS signal is relevant): sources and sourcestats<\/figcaption><\/figure>\n<p>And this is pretty much all that is needed in general to have a Stratum-1 (atomic clock-locked) NTP server in general.<\/p>\n<p>Some extra references:<\/p>\n<ul>\n<li><a href=\"http:\/\/brandon.penglase.net\/index.php?title=NavSpark_GPS%2BGLONASS_Stratum-1_NTP_Time_Source_with_a_Raspberry_Pi\">NavSpark GPS+GLONASS Stratum-1 NTP Time Source with a Raspberry Pi<\/a><\/li>\n<li><a href=\"http:\/\/wiki.hackspherelabs.com\/index.php?title=NTP_GPS_Time_Server\">Hackspherelab: NTP GPS Time Server<\/a><\/li>\n<li><a href=\"http:\/\/www.catb.org\/gpsd\/gpsd-time-service-howto.html\">GPSD Time Service HOWTO<\/a><\/li>\n<\/ul>\n<h2>Experience<\/h2>\n<p>Navspark has a GNSS Viewer program (available for download <a href=\"http:\/\/www.navspark.com.tw\/downloads\/\">from their website<\/a>) which can also set the module&#8217;s parameters, for example forcing it to only listen to the GPS signal or only Beidou signal. There are a lot of settings, and I think most don&#8217;t need any change, but there&#8217;s still a bit to explore, and it&#8217;s definitely a handy tool.<\/p>\n<figure id=\"attachment_2152\" aria-describedby=\"caption-attachment-2152\" style=\"width: 1012px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/GNSS_Viewer_GPS_BD.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2152 size-full\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/GNSS_Viewer_GPS_BD.png\" alt=\"GNSS Viewer (and configuration) in Windows\" width=\"1012\" height=\"740\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/GNSS_Viewer_GPS_BD.png 1012w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/GNSS_Viewer_GPS_BD-500x366.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/GNSS_Viewer_GPS_BD-768x562.png 768w\" sizes=\"auto, (max-width: 1012px) 100vw, 1012px\" \/><\/a><figcaption id=\"caption-attachment-2152\" class=\"wp-caption-text\">GNSS Viewer (and configuration) in Windows<\/figcaption><\/figure>\n<p>Running the NTP lock and looking at the tracking lock there are immediately a few lessons in the ~1 day I&#8217;ve been playing with the system:<\/p>\n<p><strong>Environment matters a lot<\/strong>: having wind blowing over the system and being exposed to temperature changes (e.g. outdoor setting) is quite bad for frequency\/time stability. One could say duh! but it&#8217;s good to see. Even a curtain and placing it indoors helps too, though having it in a well air conditioned space is even better. Too bad that in that case the sky visibility and thus the signal strength suffers a lot, but as long as there&#8217;s enough signal to have a lock it is worth it.<\/p>\n<p><strong>PPS is lost when 3D fix is lost<\/strong>: this took a while to figure out why did I lose lock every now and then, especially because once chrony loses the PPS signal it won&#8217;t pick it up again.<\/p>\n<p><strong>Indoor can work<\/strong>: indoor lock with the <a href=\"http:\/\/navspark.mybigcommerce.com\/internal-gps-beidou-active-antenna\/\">default antenna<\/a>\u00a0can work, but the building structure matters a lot.<\/p>\n<h3>GPS vs Beidou<\/h3>\n<p>Of course the most interesting part is comparing GPS and Beidou. What follows here is not very well qualified yet, just first impressions and need more work.<\/p>\n<p>One of the biggest advantage of GPS is having a lot more satellites than Beidou. I wouldn&#8217;t be surprised if they are transmitting at a higher power too, or some other ways easier to receive. When locked onto GPS I could have rock-solid indoors time lock with 4-9 satellites visible at any one time. The time precision is judged by the offset frequency distribution that chrony reports (and would love to hear if there&#8217;s a better way to do that!), and that had a standard deviation of about 1\u00b5s by experience (in an air-conditioned office).<\/p>\n<p>When I&#8217;ve enabled both GPS and Beidou then Navspark seemed to have generally locked onto the Beidou signal. When i was lucky I got 5-6 satellites, but generally it&#8217;s around 3 &#8211; just on the threshold of having a 3D fix, and the source of the PPS-unlock mentioned above. The offset stability on the other hand can be really good, I had runs that had about 5x smaller time offset standard deviation than GPS had (~0.2\u00b5s), and that&#8217;s quite a bit of improvement!<\/p>\n<p>The issue is, that when I set the Navspark module GPS+Beidou then when there was a low Beidou satellite count (2-3), even though it still kept a (fragile) 3D fix, the time offset stability was pretty much the same as GPS on its own, though with some intervals of improved readings&#8230;.<\/p>\n<figure id=\"attachment_2154\" aria-describedby=\"caption-attachment-2154\" style=\"width: 823px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_cgps.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2154 size-full\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_cgps.png\" alt=\"Locked onto a bunch of Beidou satellites (PRN larger than 200)\" width=\"823\" height=\"513\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_cgps.png 823w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_cgps-500x312.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Navspark_cgps-768x479.png 768w\" sizes=\"auto, (max-width: 823px) 100vw, 823px\" \/><\/a><figcaption id=\"caption-attachment-2154\" class=\"wp-caption-text\">Locked onto a bunch of Beidou satellites (PRN larger than 200)<\/figcaption><\/figure>\n<p>This below is a ~35minutes run of GPS+Beidou setup in an air-conditioned office with limited sky-view and 3 more stories above, using the default 12dB antenna. Using cpgs I could see that in general the lock was provided by 2-3 Beidou satellites, and in some intervals switched over to GPS without losing PPS signal (until it did). Thus it&#8217;s not the best performance that I&#8217;ve seen but still pretty good. Offset is plotted with the reported standard deviation as error bars. The central line is the mean value of the offset readings, and the two bars are the standard deviation calculated from the offsets.<\/p>\n<figure id=\"attachment_2158\" aria-describedby=\"caption-attachment-2158\" style=\"width: 604px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Beidou_offset_log.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2158 size-large\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Beidou_offset_log-1024x745.png\" alt=\"Beidou time-lock offset over time (cutting the transients in the beginning, and finishing with signal being lost)\" width=\"604\" height=\"439\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Beidou_offset_log-1024x745.png 1024w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Beidou_offset_log-500x364.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Beidou_offset_log-768x559.png 768w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/Beidou_offset_log.png 1100w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><figcaption id=\"caption-attachment-2158\" class=\"wp-caption-text\">Beidou time-lock offset over time (cutting the transients in the beginning, and finishing with signal being lost)<\/figcaption><\/figure>\n<h2>Future<\/h2>\n<p>The ideal setup would be a well air-conditioned roof-top location (I think it would be possible to reliably see 6-7 satellites that way), and switching to Beidou only measurements to clearly see the difference between the two satellite network.<\/p>\n<p>Improved reception could probably be achieved by <a href=\"http:\/\/navspark.mybigcommerce.com\/tri-band-gps-galileo-glonass-bds-active-antenna\/\">a different Navspark antenna<\/a>, which provides 25\u00b13dB gain (that&#8217;s an extra ~13dB above the current antenna), and should help indoor reception a lot. It&#8217;s currently on pre-sale and expected by the end of the year, so will keep an eye on it!<\/p>\n<p>For more advanced improvements, the adapter board would be easy enough to redo on PCB (instead of surface mount soldering), add maybe some more voltage stabilization for the module to improve the noise figure, and probably have cleaner 1PPS signal too (compared to flying wires). Will definitely give it a try as it is so easy to get the boards printed these days, e.g. with <a href=\"http:\/\/www.seeedstudio.com\/propagate\/\">Seeed Studio<\/a>.<\/p>\n<p>Finally some more setting adjustments could improve the final result, such as tweaking the 1PPS pulse length, using the surveying profile for higher precision (though have to figure out what does it mean first, but looks promision), and other little tweaks&#8230;.<\/p>\n<p>It looks to me that if the satellite reception issues are cleaned up, the Navspark + Beidou 1PPS signal should be interesting to try with laboratory frequency references for long term stability (such as a <a href=\"http:\/\/www.thinksrs.com\/products\/FS725.htm\">Rubidium Clock<\/a>). And of course to run the Pi+Navspark as a local time reference and provide a NTP service, e.g. from the <a href=\"https:\/\/taipeihack.org\">Tapei Hackerspace<\/a>&#8230;. Plenty to do. :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A friend from NIST recently told me about a Raspberry Pi Stratum-1 NTP server project, and that reminded me of the experiments I did with the Navspark dual GPS+Beidou receiver module. Navspark is a small, Arduino-compatible module that besides GPS can also receive data from China&#8217;s Beidou\u00a0\u5317\u6597 satellite navigation system\u00a0, that is currently being built. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2145,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,10],"tags":[183,152,151,150,184,162],"class_list":["post-2144","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comp","category-lab","tag-arch-linux","tag-beidou","tag-gps","tag-navspark","tag-ntp","tag-raspberry-pi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dual Satellite NTP server with Navspark - ClickedyClick<\/title>\n<meta name=\"description\" content=\"Making a Beidou+Navspark Stratum-1 NTP server with Raspberry Pi 2: hardware and software setup, and some pretty plots.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dual Satellite NTP server with Navspark - ClickedyClick\" \/>\n<meta property=\"og:description\" content=\"Making a Beidou+Navspark Stratum-1 NTP server with Raspberry Pi 2: hardware and software setup, and some pretty plots.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/\" \/>\n<meta property=\"og:site_name\" content=\"ClickedyClick\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:published_time\" content=\"2015-11-26T10:46:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-05-21T15:32:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_assembly.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"5376\" \/>\n\t<meta property=\"og:image:height\" content=\"3752\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Gergely Imreh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@imrehg\" \/>\n<meta name=\"twitter:site\" content=\"@imrehg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gergely Imreh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/\"},\"author\":{\"name\":\"Gergely Imreh\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"headline\":\"Dual Satellite NTP server with Navspark\",\"datePublished\":\"2015-11-26T10:46:14+00:00\",\"dateModified\":\"2018-05-21T15:32:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/\"},\"wordCount\":2190,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/RPi_Navspark_assembly.jpg\",\"keywords\":[\"Arch Linux\",\"beidou\",\"gps\",\"navspark\",\"NTP\",\"Raspberry Pi\"],\"articleSection\":[\"Computers\",\"Lab\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/\",\"name\":\"Dual Satellite NTP server with Navspark - ClickedyClick\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/RPi_Navspark_assembly.jpg\",\"datePublished\":\"2015-11-26T10:46:14+00:00\",\"dateModified\":\"2018-05-21T15:32:42+00:00\",\"description\":\"Making a Beidou+Navspark Stratum-1 NTP server with Raspberry Pi 2: hardware and software setup, and some pretty plots.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/RPi_Navspark_assembly.jpg\",\"contentUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/RPi_Navspark_assembly.jpg\",\"width\":5376,\"height\":3752},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2015\\\/11\\\/navspark-beidou-ntp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dual Satellite NTP server with Navspark\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\",\"name\":\"ClickedyClick\",\"description\":\"Life in real, complex and digital.\",\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\",\"name\":\"Gergely Imreh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"caption\":\"Gergely Imreh\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\"},\"description\":\"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net\",\"sameAs\":[\"https:\\\/\\\/gergely.imreh.net\\\/\",\"https:\\\/\\\/www.facebook.com\\\/gergely.imreh\",\"https:\\\/\\\/www.instagram.com\\\/imrehg\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/gergelyimreh\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GergelyImreh\"],\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/author\\\/gergely\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dual Satellite NTP server with Navspark - ClickedyClick","description":"Making a Beidou+Navspark Stratum-1 NTP server with Raspberry Pi 2: hardware and software setup, and some pretty plots.","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:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/","og_locale":"en_GB","og_type":"article","og_title":"Dual Satellite NTP server with Navspark - ClickedyClick","og_description":"Making a Beidou+Navspark Stratum-1 NTP server with Raspberry Pi 2: hardware and software setup, and some pretty plots.","og_url":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/","og_site_name":"ClickedyClick","article_publisher":"https:\/\/www.facebook.com\/gergely.imreh","article_author":"https:\/\/www.facebook.com\/gergely.imreh","article_published_time":"2015-11-26T10:46:14+00:00","article_modified_time":"2018-05-21T15:32:42+00:00","og_image":[{"width":5376,"height":3752,"url":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_assembly.jpg","type":"image\/jpeg"}],"author":"Gergely Imreh","twitter_card":"summary_large_image","twitter_creator":"@imrehg","twitter_site":"@imrehg","twitter_misc":{"Written by":"Gergely Imreh","Estimated reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#article","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/"},"author":{"name":"Gergely Imreh","@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"headline":"Dual Satellite NTP server with Navspark","datePublished":"2015-11-26T10:46:14+00:00","dateModified":"2018-05-21T15:32:42+00:00","mainEntityOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/"},"wordCount":2190,"commentCount":0,"publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#primaryimage"},"thumbnailUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_assembly.jpg","keywords":["Arch Linux","beidou","gps","navspark","NTP","Raspberry Pi"],"articleSection":["Computers","Lab"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/","url":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/","name":"Dual Satellite NTP server with Navspark - ClickedyClick","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#primaryimage"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#primaryimage"},"thumbnailUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_assembly.jpg","datePublished":"2015-11-26T10:46:14+00:00","dateModified":"2018-05-21T15:32:42+00:00","description":"Making a Beidou+Navspark Stratum-1 NTP server with Raspberry Pi 2: hardware and software setup, and some pretty plots.","breadcrumb":{"@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#primaryimage","url":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_assembly.jpg","contentUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2015\/11\/RPi_Navspark_assembly.jpg","width":5376,"height":3752},{"@type":"BreadcrumbList","@id":"https:\/\/gergely.imreh.net\/blog\/2015\/11\/navspark-beidou-ntp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gergely.imreh.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Dual Satellite NTP server with Navspark"}]},{"@type":"WebSite","@id":"https:\/\/gergely.imreh.net\/blog\/#website","url":"https:\/\/gergely.imreh.net\/blog\/","name":"ClickedyClick","description":"Life in real, complex and digital.","publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gergely.imreh.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0","name":"Gergely Imreh","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","caption":"Gergely Imreh"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g"},"description":"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net","sameAs":["https:\/\/gergely.imreh.net\/","https:\/\/www.facebook.com\/gergely.imreh","https:\/\/www.instagram.com\/imrehg\/","https:\/\/www.linkedin.com\/in\/gergelyimreh\/","https:\/\/www.youtube.com\/@GergelyImreh"],"url":"https:\/\/gergely.imreh.net\/blog\/author\/gergely\/"}]}},"_links":{"self":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/comments?post=2144"}],"version-history":[{"count":14,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2144\/revisions"}],"predecessor-version":[{"id":2457,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2144\/revisions\/2457"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/media\/2145"}],"wp:attachment":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/media?parent=2144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/categories?post=2144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/tags?post=2144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}