{"id":364,"date":"2018-04-06T22:57:49","date_gmt":"2018-04-06T21:57:49","guid":{"rendered":"https:\/\/www.burningimage.net\/cattrack\/?p=364"},"modified":"2023-08-11T22:11:32","modified_gmt":"2023-08-11T21:11:32","slug":"cc1125-long-range-communications","status":"publish","type":"post","link":"https:\/\/www.burningimage.net\/cattrack\/cc1125-long-range-communications\/","title":{"rendered":"Long Range Communications with the CC1125"},"content":{"rendered":"<p>I&#8217;ve now written enough code for the PIC on the CatTrack base station such that I can begin to test it!<\/p>\n<p>I&#8217;ve already tested comms with the CatTrack collar, using a development board instead of the base station. \u00a0Read about that <a href=\"https:\/\/www.burningimage.net\/cattrack\/it-works\/\">here<\/a>.<\/p>\n<p>Unfortunately, when testing my base station I found that it was nowhere near as sensitive as the development board &#8211; the base station was getting CRC errors whilst the development board was still receiving the signal fine. \u00a0After a small bit of investigation I found out why. \u00a0The problem is all down to the fact that I want to use the CC1125 at the lowest baud rate (300 bps), and consequently a very narrow receive bandwidth (3.8 kHz).<\/p>\n<p><!--more--><\/p>\n<p>Before I get to the problem, we need to understand some theory. \u00a0CatTrack uses a modulation scheme called Frequency Shift Keying (FSK). \u00a0I am using a carrier frequency of 868 MHz and a frequency deviation of 1 kHz. \u00a0This deviation is the value recommended by TI for a baud rate of 300 bps. \u00a0This means that in order to transmit a &#8216;0&#8217;, the transmitter transmits a signal at (868 MHz <span style=\"color: #ff0000;\"><strong>&#8211;<\/strong><\/span> 1 kHz) for (1 \/ 300) seconds, so 867.999 MHz for 3.3 milliseconds. \u00a0In order to transmit a &#8216;1&#8217;, the transmitter switches to (868 MHz <span style=\"color: #ff0000;\"><strong>+<\/strong><\/span> 1 kHz), so 868.001 MHz and sits there for 3.3 milliseconds. \u00a0Bit by bit our entire message is transmitted. \u00a0Makes sense right?<\/p>\n<p>Carson&#8217;s bandwidth rule tells us the occupied bandwidth of the transmitted signal:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-835df9d93de34b237bbc5fb648073079_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;&#66;&#82;&#61;&#50;&#40;&#123;&#92;&#68;&#101;&#108;&#116;&#97;&#125;&#102;&#43;&#102;&#95;&#109;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"156\" style=\"vertical-align: -5px;\"\/><\/p>\n<p>Where:<\/p>\n<ul>\n<li><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-f2d37e797a04c8f739bedbf3887cad4f_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#67;&#66;&#82;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"42\" style=\"vertical-align: 0px;\"\/> is the bandwidth occupied by the signal<\/li>\n<li><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-3710e689137417be96dc09da58177865_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#123;&#92;&#68;&#101;&#108;&#116;&#97;&#125;&#102;\" title=\"Rendered by QuickLaTeX.com\" height=\"17\" width=\"25\" style=\"vertical-align: -4px;\"\/> is the frequency deviation<\/li>\n<li><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-3f8595b11fdcb51a5c71a3f70b5397b9_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#102;&#95;&#109;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"21\" style=\"vertical-align: -4px;\"\/> is the modulating bit rate<\/li>\n<\/ul>\n<p>An important thing to note here (and the source of much confusion in various forums!) is that <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-3f8595b11fdcb51a5c71a3f70b5397b9_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#102;&#95;&#109;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"21\" style=\"vertical-align: -4px;\"\/> is equal to the <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-e8c082215b4d0f5317a213896961474b_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#102;&#114;&#97;&#99;&#123;&#98;&#97;&#117;&#100;&#32;&#114;&#97;&#116;&#101;&#125;&#123;&#50;&#125;\" title=\"Rendered by QuickLaTeX.com\" height=\"22\" width=\"54\" style=\"vertical-align: -6px;\"\/> in our case. \u00a0Our highest baud rate will be when sending an alternating 0-1-0 sequence. \u00a0As we saw above, this means we transmit for 3.3 milliseconds on one frequency, then 3.3 milliseconds on another. \u00a0Thus the period is 6.6 milliseconds, therefore the bit rate is <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-e16a9cf9507c2bdc7242872ac502c8b4_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#54;&#46;&#54;&#32;&#109;&#115;&#125;&#61;&#49;&#53;&#48;\" title=\"Rendered by QuickLaTeX.com\" height=\"22\" width=\"89\" style=\"vertical-align: -6px;\"\/>.<\/p>\n<p>So in our case, the bandwidth occupied by the transmitted signal is:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-f8af7ed12c7ce8162dea6e1b0f9fad0b_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#50;&#40;&#49;&#48;&#48;&#48;&#43;&#49;&#53;&#48;&#41;&#61;&#50;&#46;&#51;&#32;&#107;&#72;&#122;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"188\" style=\"vertical-align: -5px;\"\/><\/p>\n<p>Now, in the receiver we have a receive bandwidth of 3.8 kHz. \u00a0The receive bandwidth needs to be set to a value such that the transmitted signal fits comfortably inside it.<\/p>\n<p>In theory this sounds perfect &#8211; our receive bandwidth is 3.8 kHz and our transmitted signal only occupies 2.3 kHz, everything should work just fine!<\/p>\n<p>However&#8230; this maths assumes that the transmitter transmits its signal centred\u00a0<em>exactly<\/em>\u00a0on 868 MHz, and that the receiver places its 3.8 kHz receive window\u00a0<em>exactly<\/em> around 868 MHz. \u00a0The reality is somewhat different.<\/p>\n<p>We have frequency references inside our transmitter and receiver from which the transmit and receive frequencies are derived. \u00a0These have an inherent accuracy, expressed in\u00a0<em>parts per million (ppm)<\/em>. \u00a0A 1 MHz reference oscillator with an accuracy of \u00b110 ppm could in reality output any value from 0.99999 MHz to 1.00001 MHz. \u00a0This doesn&#8217;t look too bad, but by the time this signal is multiplied up to our transmit frequency, using a reference oscillator with an accuracy of \u00b110 ppm means that instead of transmitting on\u00a0<em>exactly<\/em> 868 MHz, we could be transmitting at 868.008680 MHz &#8211; as much as 8.7 kHz off the correct frequency! \u00a0Remembering that our receive window is only 3.8 kHz, transmitting 8.7 kHz away from the correct frequency is a big problem &#8211; our receiver will never even see our transmitted signal!<\/p>\n<p>The frequency reference components I&#8217;ve used in CatTrack are <a href=\"http:\/\/uk.farnell.com\/epson\/x1g0035810024-tg-5021cg-17n-40mhz\/vctcxo-40mhz-2-5-x-2mm-clipped\/dp\/2471843RL\">TG-5021CG Temperature Controlled Oscillators (TCXOs)<\/a>. Their specification is \u00b12 ppm. \u00a0Better than \u00b110 ppm, but still a problem for us with our narrow receive bandwidth.<\/p>\n<p>Taking the extreme (but plausible) example, where our transmitter TCXO is +2 ppm and our receiver TCXO is -2 ppm, we will end up in the following situation:<\/p>\n<p>The lowest frequency in our transmitted signal will be at:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-f3ada9ae37162ef53f97d91c792bd360_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#43;&#32;&#49;&#49;&#53;&#48;&#41;&#32;&#43;&#32;&#40;&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#43;&#32;&#49;&#49;&#53;&#48;&#41;&#40;&#50;&#92;&#116;&#105;&#109;&#101;&#115;&#49;&#48;&#94;&#123;&#45;&#54;&#125;&#41;&#41;&#32;&#61;&#32;&#56;&#54;&#56;&#46;&#48;&#48;&#50;&#56;&#56;&#54;&#32;&#77;&#72;&#122;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"569\" style=\"vertical-align: -5px;\"\/><\/p>\n<p>And the highest at:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-15a138a7c05bf2a48c44222ecb9a02db_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#45;&#32;&#49;&#49;&#53;&#48;&#41;&#32;&#43;&#32;&#40;&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#45;&#32;&#49;&#49;&#53;&#48;&#41;&#40;&#50;&#92;&#116;&#105;&#109;&#101;&#115;&#49;&#48;&#94;&#123;&#45;&#54;&#125;&#41;&#41;&#32;&#61;&#32;&#56;&#54;&#56;&#46;&#48;&#48;&#48;&#53;&#56;&#54;&#32;&#77;&#72;&#122;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"569\" style=\"vertical-align: -5px;\"\/><\/p>\n<p>Now, assuming the TCXO in our receiver comes from the factory at -2 ppm (still within the \u00b12ppm specification), our 3.8 kHz receive window will start at:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-9e6dc81e56a907a15b02ddeced4e5312_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#45;&#32;&#49;&#57;&#48;&#48;&#41;&#32;&#45;&#32;&#40;&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#45;&#32;&#49;&#57;&#48;&#48;&#41;&#40;&#50;&#92;&#116;&#105;&#109;&#101;&#115;&#49;&#48;&#94;&#123;&#45;&#54;&#125;&#41;&#41;&#32;&#61;&#32;&#56;&#54;&#55;&#46;&#57;&#57;&#54;&#51;&#54;&#52;&#32;&#77;&#72;&#122;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"569\" style=\"vertical-align: -5px;\"\/><\/p>\n<p>and end at:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/ql-cache\/quicklatex.com-0072835ed24923b9cca959de01042326_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#43;&#32;&#49;&#57;&#48;&#48;&#41;&#32;&#45;&#32;&#40;&#40;&#56;&#54;&#56;&#48;&#48;&#48;&#48;&#48;&#48;&#32;&#43;&#32;&#49;&#57;&#48;&#48;&#41;&#40;&#50;&#92;&#116;&#105;&#109;&#101;&#115;&#49;&#48;&#94;&#123;&#45;&#54;&#125;&#41;&#41;&#32;&#61;&#32;&#56;&#54;&#56;&#46;&#48;&#48;&#48;&#49;&#54;&#51;&#32;&#77;&#72;&#122;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"569\" style=\"vertical-align: -5px;\"\/><\/p>\n<p>And now given that a picture speaks a thousand words:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-387 aligncenter\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/cattracktx.png\" alt=\"\" width=\"628\" height=\"393\" srcset=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/cattracktx.png 1908w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/cattracktx-300x188.png 300w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/cattracktx-768x481.png 768w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/cattracktx-1024x641.png 1024w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/cattracktx-1440x902.png 1440w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/><\/p>\n<p>Our transmitted signal occupies the spectrum covered by the blue line and our receiver is listening in the region shown by the orange line (ignore the y-axis, they&#8217;ve only been spaced out for clarity).<\/p>\n<p>Clearly this is bad and explains why our receiver isn&#8217;t properly receiving the signal that the collar is transmitting. \u00a0But what can we do about it?<\/p>\n<p>Thankfully there is something we can do, without putting more accurate frequency references in the transmitter and receiver (which would take more power, space and expense).<\/p>\n<p>The CC1125 has a frequency offset feature whereby after receiving a packet, it populates a register with a value that represents the measured frequency offset between transmitter and receiver, thus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-388\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/frequency-offset-registers.png\" alt=\"\" width=\"1894\" height=\"694\" srcset=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/frequency-offset-registers.png 1894w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/frequency-offset-registers-300x110.png 300w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/frequency-offset-registers-768x281.png 768w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/frequency-offset-registers-1024x375.png 1024w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/frequency-offset-registers-1440x528.png 1440w\" sizes=\"auto, (max-width: 1894px) 100vw, 1894px\" \/><\/p>\n<p>We can then program this calculated offset back into the FREQOFF registers, thereby shifting our receive window to match the transmitted signal. Magic!<\/p>\n<p>In practice, the first thing we do is set our receiver to a larger receiver bandwidth by writing to the CHAN_BW register. \u00a0I&#8217;m using 10 kHz. \u00a0This is to be sure that we receive the transmitted signal so we can calculate the offset, like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-389\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/widened-rx-bandwidth.png\" alt=\"\" width=\"628\" height=\"393\" srcset=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/widened-rx-bandwidth.png 1908w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/widened-rx-bandwidth-300x188.png 300w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/widened-rx-bandwidth-768x481.png 768w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/widened-rx-bandwidth-1024x641.png 1024w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/widened-rx-bandwidth-1440x902.png 1440w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/><\/p>\n<p>As we can see, the transmitted signal is now falling inside our receive bandwidth. \u00a0Now we wait for a packet to arrive from the transmitter and as soon as it arrives we read back the FREQOFF_EST registers from the CC1125 and program them back into the FREQOFF register, shifting our receive window to match the transmitted signal. \u00a0As a point of interest, you can alternatively send the SAFC strobe to automate this register reading\/writing process.<\/p>\n<p>Now that our receive window is aligned with our transmitter, we can take the receive bandwidth back down to the 3.8 kHz. \u00a0This is how we end up:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-390\" src=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/receive-bandwidth-matching-transmit-bandwidth.png\" alt=\"\" width=\"628\" height=\"393\" srcset=\"https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/receive-bandwidth-matching-transmit-bandwidth.png 1908w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/receive-bandwidth-matching-transmit-bandwidth-300x188.png 300w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/receive-bandwidth-matching-transmit-bandwidth-768x481.png 768w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/receive-bandwidth-matching-transmit-bandwidth-1024x641.png 1024w, https:\/\/www.burningimage.net\/cattrack\/wp-content\/uploads\/2018\/04\/receive-bandwidth-matching-transmit-bandwidth-1440x902.png 1440w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/><\/p>\n<p>Perfect! \u00a0As soon as I had carried out this procedure I was measuring a receive sensitivity of -124 dBm and I was out-performing the development board.<\/p>\n<p>This procedure is essential if you want to use the CC1125 for long-range communications. \u00a0I thought I could get away with not doing it, but clearly the Maths shows that you do need it!<\/p>\n<p>You may wonder why we don&#8217;t just simply leave the receive bandwidth set to 10 kHz and not bother with any of this offset setting malarky. \u00a0The reason is down to receive sensitivity. \u00a0Every time we half the receive bandwidth, we add 3 dB to our sensitivity. \u00a0Therefore it stands that the narrower the receive bandwidth, the greater our range.<\/p>\n<p>A couple of other things I did to the CC1125 to optimise it for long range communications:<\/p>\n<ol>\n<li>Set the FREQOFF_CFG register to 0x30 &#8211; this enables a feature called &#8216;frequency offset correction&#8217;. \u00a0It&#8217;s explained well in the CC1125 manual, but the long and short of it is that it increases the effective receive bandwidth by BW\/4, without compromising sensitivity.<\/li>\n<li>Change the modulation type from FSK to GFSK. \u00a0GFSK is more bandwidth efficient than FSK, so you can get away with a slightly narrower receive bandwidth (Carson&#8217;s rule doesn&#8217;t properly apply to GFSK).<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve now written enough code for the PIC on the CatTrack base station such that I can begin to test it! I&#8217;ve already tested comms with the CatTrack collar, using a development board instead of the base station. \u00a0Read about that here. Unfortunately, when testing my base station I found that it was nowhere near [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":394,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[106,103,55,4,101,5,104,99,102,8,49,105,100,15,7],"class_list":["post-364","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts","tag-bandwidth","tag-carsons-rule","tag-cattrack","tag-cc1125","tag-frequency","tag-fsk","tag-gfsk","tag-long-range","tag-oscillator","tag-receiver","tag-rf","tag-sensitivity","tag-tcxo","tag-ti","tag-transmitter"],"_links":{"self":[{"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/posts\/364","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/comments?post=364"}],"version-history":[{"count":29,"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/posts\/364\/revisions"}],"predecessor-version":[{"id":498,"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/posts\/364\/revisions\/498"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/media\/394"}],"wp:attachment":[{"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/media?parent=364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/categories?post=364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.burningimage.net\/cattrack\/wp-json\/wp\/v2\/tags?post=364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}