[User manuals] Mail FeedConfluence Syndication Feedhttps://help.mikrotik.com/docsMikroTik Tag advertisement formatsDeniss M.tag:help.mikrotik.com,2009:page-105742533-462024-03-26T11:59:20Z2022-01-28T12:33:01Z<div class="feed"> <p>
Page
<b>edited</b> by
<a href=" https://help.mikrotik.com/docs/display/~denissm
">Deniss M.</a>
</p>
<div style="border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; padding: 10px;">
<h2 id="MikroTikTagadvertisementformats-/*<![CDATA[*/div.rbtoc1711618541274{padding:0px;}div.rbtoc1711618541274ul{margin-left:0px;}div.rbtoc1711618541274li{margin-left:0px;padding-left:0px;}/*]]>*/#MikroTikTagadvertisementformats-Introduction#MikroTikTagadvertise"><style type='text/css'>/*<![CDATA[*/
div.rbtoc1711618541274 {padding: 0px;}
div.rbtoc1711618541274 ul {margin-left: 0px;}
div.rbtoc1711618541274 li {margin-left: 0px;padding-left: 0px;}
/*]]>*/</style><div class='toc-macro rbtoc1711618541274'>
<ul class='toc-indentation'>
<li><a href='#MikroTikTagadvertisementformats-'></a></li>
<li><a href='#MikroTikTagadvertisementformats-Introduction'>Introduction</a></li>
<li><a href='#MikroTikTagadvertisementformats-MikroTikpacketstructure'>MikroTik packet structure</a>
<ul class='toc-indentation'>
<li><a href='#MikroTikTagadvertisementformats-MikroTikPDUPayloadstructure'>MikroTik PDU Payload structure</a>
<ul class='toc-indentation'>
<li><a href='#MikroTikTagadvertisementformats-Example'>Example</a></li>
<li><a href='#MikroTikTagadvertisementformats-Scriptfordecoding'>Script for decoding</a></li>
</ul>
</li>
</ul>
</li>
<li><a href='#MikroTikTagadvertisementformats-iBeaconpacketstructure'>iBeacon packet structure</a>
<ul class='toc-indentation'>
<li><a href='#MikroTikTagadvertisementformats-iBeaconPDUPayloadstructure'>iBeacon PDU Payload structure</a></li>
</ul>
</li>
<li><a href='#MikroTikTagadvertisementformats-Eddystone-TLMpacketstructure'>Eddystone-TLM packet structure</a>
<ul class='toc-indentation'>
<li><a href='#MikroTikTagadvertisementformats-Eddystone-TLMPDUPayloadstructure'>Eddystone-TLM PDU Payload structure</a></li>
</ul>
</li>
<li><a href='#MikroTikTagadvertisementformats-Eddystone-UIDpacketstructure'>Eddystone-UID packet structure</a>
<ul class='toc-indentation'>
<li><a href='#MikroTikTagadvertisementformats-Eddystone-UIDPDUPayloadstructure'>Eddystone-UID PDU Payload structure</a></li>
</ul>
</li>
</ul>
</div></h2><h2 id="MikroTikTagadvertisementformats-Introduction">Introduction</h2><p>TG-BT5-XX tags can operate in 4 different modes:</p><ol><li>Factory sleep mode</li><li>Configuration mode</li><li>Advertising mode</li><li>Upgrade mode</li></ol><p>In advertising mode, the tag will broadcast information about itself in Bluetooth advertising packets. The information depends on the advertising packet type.</p><p>At the moment, these are all the supported types that can be configured using the MikroTik Beacon Manager app:</p><p><a class="external-link" href="https://github.com/google/eddystone/tree/master/eddystone-tlm" rel="nofollow">Eddystone-TLM</a>, <a class="external-link" href="https://github.com/google/eddystone/tree/master/eddystone-uid" rel="nofollow">Eddystone-UID</a>, MikroTik, and <a class="external-link" href="https://developer.apple.com/ibeacon/" rel="nofollow">iBeacon</a>.</p><p>Bluetooth technology uses 2 types of channels (each using different frequencies) during the data exchange.</p><ol><li>Data channels dedicated to data transmission</li><li>Advertise channels dedicated to advertising</li></ol><p>There are 40 unique bands (channels) and each band has a 2 MHz separation. 37, 38, and 39 channels are used for advertising, and 0-36 are used for data transmission.</p><p>During the advertising process, the BLE advertising packet is broadcasted. This packet contains the Preamble, Access Address, PDU and CRS fields.</p><p>The Preamble and Access Address fields help the receiver detect frames. CRS field is used to check errors. PDU defines the packet itself.</p><p>MikroTik tags support legacy Non-Connectable Non-Scannable Undirected advertising<span> (<span class="codespan__pre-wrap"><code>ADV_NOCONN_IND</code></span>). The Payload, in this case, consists of "AdvA" (a field that contains information about the advertiser's address) and "AdvData" (a field that contains data information) fields.</span></p><p><span>1 octet = 1 byte = 8 bits</span></p><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 41.1958%;"><colgroup><col style="width: 24.2667%;"/><col style="width: 75.7333%;"/></colgroup><tbody><tr><td class="confluenceTd">Preamble</td><td class="confluenceTd">1 octet</td></tr><tr><td class="confluenceTd">Access-Address</td><td class="confluenceTd">4 octets</td></tr><tr><td class="confluenceTd">PDU</td><td class="confluenceTd"><ul><li>PDU Header = 2 octets</li><li>PDU Payload = AdvA (6 octets)+AdvData (0...31 octets)</li></ul></td></tr><tr><td colspan="1" class="confluenceTd">CRS</td><td colspan="1" class="confluenceTd">3 octets</td></tr></tbody></table></div><h2 id="MikroTikTagadvertisementformats-MikroTikpacketstructure">MikroTik packet structure</h2><p>"AdvData" field structure (max 31 octets/bytes):</p><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 93.5242%;"><colgroup><col style="width: 10.3301%;"/><col style="width: 29.7256%;"/><col style="width: 59.9741%;"/></colgroup><tbody><tr><td class="confluenceTd">Length</td><td class="confluenceTd">length of the payload</td><td class="confluenceTd">1 octet (<code>15</code>)</td></tr><tr><td class="confluenceTd">Type</td><td class="confluenceTd">manufacturer specific data</td><td class="confluenceTd">1 octet (<code>ff</code>)</td></tr><tr><td class="confluenceTd">ManufacturerData</td><td class="confluenceTd">company identifier</td><td class="confluenceTd">2 octets (<code>4F09</code>)</td></tr><tr><td class="confluenceTd">Version</td><td class="confluenceTd">the version of this advertisement structure</td><td class="confluenceTd">1 octet (uint)</td></tr><tr><td class="confluenceTd">UserData</td><td class="confluenceTd">user-configured part of the payload</td><td class="confluenceTd"><p>1 octet (uint)</p></td></tr><tr><td class="confluenceTd">Secret</td><td class="confluenceTd">optionally encrypted (AES-ECB) part of the payload</td><td class="confluenceTd"><ul><li>secret: salt (for encryption) = 2 octets (uint)</li><li>secret: acceleration (acceleration in signed 8.8 fixed point format - acceleration of all 3 axis (0=x, 1=y, 2=z)) = 6 octets (uint)</li><li>secret: temperature (ambient temperature in Celsius in signed 8.8 fixed point format) = 2 octet (int)</li><li>secret: uptime (uptime in seconds) = 4 octets (uint)</li><li>secret: flags (bit-mask of flags) = 1 octet (uint)</li><li>secret: batteryPercentage (battery level in percent) = 1 octet (uint)</li></ul></td></tr></tbody></table></div><div class="confluence-information-macro confluence-information-macro-information"><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Please note that all multi-byte values are in little-endian. Meaning, that if, for example, you want to get the temperature value and #14 and #15 octets indicate the temperature as "a1 19" ("plus" temperature) → the real temperature value is going to be (0x19a1)/256 = 25.6 C.</p></div></div><p>A detailed example of how you can convert <strong>hexadecimal</strong> payload's values to <strong>decimal</strong> values will be shown later in the <strong>PDU payload structure </strong>section.</p><p><br/></p><p>UserData and Secret fields are configured with the help of <code>flags</code>. In the "UserData" section, the parameter that controls whether the "Secret" is encrypted or not is called <code><span style="color: rgb(0,51,102);">FLAG_ENCRYPTED</span></code>. When <code>FLAG_ENCRYPTED=0</code>, it means the secret is not encrypted (1st bit in 6th octet would be set to 0), and when <code>FLAG_ENCRYPTED=1</code>, it means the secret is encrypted (1st bit in 6th octet would be set to 1).</p><p>In the "Secret" section, there are 6 <code>flags</code> (21st octet):</p><ol><li><code>FLAG_REED_SWITCH</code> (1st bit - if set to 1, shows <span>that the reed switch was closed at the moment of advertising</span>)</li><li><code>FLAG_ACCEL_TILT</code> (2nd bit - if set to 1, shows that the advertisement was sent by tilting the device)</li><li><code>FLAG_ACCEL_FREE_FALL</code> (3d bit - if set to 1, shows that the advertisement was sent by dropping the device)</li><li><code>FLAG_IMPACT_X</code> (4th bit - if set to 1, shows that there was an impact on the x-axis at the moment of advertising)</li><li><code>FLAG_IMPACT_Y</code> (5th bit - if set to 1, shows that there was an impact on the y-axis at the moment of advertising)</li><li><code>FLAG_IMPACT_Z</code> (6th bit - if set to 1, shows that there was an impact on the z-axis at the moment of advertising)</li></ol><p>For example, if you see that the 21st octet of the hex message is "02" (when converting the value "02" from <strong>hexadecimal</strong> to <strong>binary</strong> it is "0010" → 2nd bit is set to 1) → it means that the device was tilted. If you see "04" (<strong>hex</strong> "04" to <strong>bin</strong> is "0100" → 3d bit is set to 1) → it means that the device was dropped (freefalling triggered). If you see "38" (<strong>hex</strong> to <strong>bin</strong> it is "00111000" → 4th, 5th, and 6th bits are set to 1) → it means that when the advertisement was sent, the accelerometer detected an impact/wake-up on all 3 x/y/z-axis.</p><p>More examples (for 21 octet's value):</p><ul><li>"08" is the impact on just the x-axis;</li><li>"18" is the impact on the x and y-axis;</li><li>"28" is the impact on the x and z-axis;</li><li>"10" is the impact on just the y-axis;</li><li>"30" is the impact on y and z-axis;</li><li>"20" is the impact on just the z-axis.</li></ul><h3 id="MikroTikTagadvertisementformats-MikroTikPDUPayloadstructure">MikroTik PDU Payload structure</h3><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 44.3774%;"><colgroup><col style="width: 15.8416%;"/><col style="width: 13.7376%;"/><col style="width: 26.3614%;"/><col style="width: 44.0594%;"/></colgroup><tbody><tr><td class="confluenceTd">0</td><td class="confluenceTd">15</td><td colspan="1" class="confluenceTd">Length</td><td colspan="1" class="confluenceTd">length of the payload</td></tr><tr><td class="confluenceTd">1</td><td class="confluenceTd">FF</td><td colspan="1" class="confluenceTd">Type</td><td colspan="1" class="confluenceTd">manufacturer specific data</td></tr><tr><td class="confluenceTd">2</td><td class="confluenceTd">4F</td><td colspan="1" class="confluenceTd">Company identifier</td><td colspan="1" class="confluenceTd">MikroTik</td></tr><tr><td class="confluenceTd">3</td><td class="confluenceTd">09</td><td colspan="1" class="confluenceTd">Company identifier</td><td colspan="1" class="confluenceTd">MikroTik</td></tr><tr><td class="confluenceTd">4</td><td class="confluenceTd">01</td><td colspan="1" class="confluenceTd">Version</td><td colspan="1" class="confluenceTd">the version of this advertisement structure</td></tr><tr><td class="confluenceTd">5</td><td class="confluenceTd">00</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">user-configured part of the payload</td></tr><tr><td class="confluenceTd">6</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: salt</td></tr><tr><td class="confluenceTd">7</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: salt</td></tr><tr><td class="confluenceTd">8</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: acceleration on the X-axis</td></tr><tr><td class="confluenceTd">9</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: acceleration on the X-axis</td></tr><tr><td class="confluenceTd">10</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: acceleration on the Y-axis</td></tr><tr><td colspan="1" class="confluenceTd">11</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: acceleration on the Y-axis</td></tr><tr><td colspan="1" class="confluenceTd">12</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: acceleration on the Z-axis</td></tr><tr><td colspan="1" class="confluenceTd">13</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: acceleration on the Z-axis</td></tr><tr><td class="confluenceTd">14</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: temperature</td></tr><tr><td colspan="1" class="confluenceTd">15</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: temperature</td></tr><tr><td class="confluenceTd">16</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: uptime</td></tr><tr><td class="confluenceTd">17</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: uptime</td></tr><tr><td class="confluenceTd">18</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: uptime</td></tr><tr><td class="confluenceTd">19</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: uptime</td></tr><tr><td colspan="1" class="confluenceTd">20</td><td colspan="1" class="confluenceTd">00</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: flags</td></tr><tr><td colspan="1" class="confluenceTd">21</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">Secret</td><td colspan="1" class="confluenceTd">secret: batteryPercentage</td></tr></tbody></table></div><ul><li>- can vary</li></ul><h4 id="MikroTikTagadvertisementformats-Example">Example</h4><p>An example of the payload configured in MikroTik's format (non-encrypted) would be:</p><div class="table-wrap"><table class="wrapped confluenceTable"><colgroup><col/></colgroup><tbody><tr><th scope="col" class="confluenceTh"><span style="color: rgb(255,0,0);">15ff4f09</span>01<span style="color: rgb(0,0,255);">00</span><span style="color: rgb(51,153,102);">cea6<span style="color: rgb(255,0,0);">0000</span></span><span style="color: rgb(0,0,0);">0000</span><span style="color: rgb(0,0,255);">0200</span><span style="color: rgb(51,153,102);">a01c</span><span style="color: rgb(255,0,0);">91085700</span><span style="color: rgb(0,0,0);">00</span><span style="color: rgb(0,0,255);">5f</span></th></tr></tbody></table></div><p><strong><span style="color: rgb(255,0,0);">15ff4f09 </span></strong>(first 4 octets)<strong><span style="color: rgb(255,0,0);"> <span style="color: rgb(0,0,0);">→ </span></span></strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);">Length (0x15 <strong>hex-to-dec</strong> is 21). Type (0xff). Company identifier (0x4f09).</span></span></p><p><strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);">01 </span></span></strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);"><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);">(4th octet)</span></span></span></span><strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);"> → </span></span></strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);">Current version of the payload's structure. Should be the same for every payload (constant data).</span></span><strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);"><br/></span></span></strong></p><p><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);"><span style="color: rgb(0,0,255);"><strong>00</strong></span> <span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);">(5th octet)</span></span> → Indicates that the payload is not encrypted. "01" would mean it is encrypted.<br/></span></span></p><p><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);"><span style="color: rgb(51,153,102);"><strong>cea6</strong></span> (6th and 7th octets) → Salt. Each new payload should have a different salt value generated. You can use this value to check whether the identical payloads are encrypted differently. <strong>The value itself does not contain any useful information</strong>. If you see that the salt value is identical for two payloads received during different time intervals, it would mean that the two payloads received are exactly identical. You can calculate the salt value using the same principle that applies to the uptime calculation (17th to 20th octets) - see below.<br/></span></span></p><p><strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);"><span style="color: rgb(51,153,102);"><span style="color: rgb(255,0,0);">0000</span> </span></span></span></strong><span style="color: rgb(0,0,0);">(8th and 9th octets) → acceleration on the X-axis at the moment of the broadcast = <strong>0 <span class="qv3Wpe">m/s<sup>2</sup></span></strong>. Check acceleration calculation for the Z-axis below.</span><strong><span style="color: rgb(255,0,0);"><span style="color: rgb(0,0,0);"><span style="color: rgb(51,153,102);"><br/></span></span></span></strong></p><p><span style="color: rgb(0,0,0);"><strong>0000</strong> (10th and 11th octets) → acceleration on the Y-axis at the moment of the broadcast = <strong>0 <span class="qv3Wpe">m/s<sup>2</sup></span></strong>. Check acceleration calculation for the Z-axis below.<br/></span></p><p><span style="color: rgb(0,0,0);"><span style="color: rgb(0,0,255);"><strong>0200</strong></span> (12th and 13th octets) → acceleration on the Z-axis at the moment of the broadcast = <strong><span class="qv3Wpe">0.0078</span> <span class="qv3Wpe">m/s<sup>2</sup></span></strong>. To get the decimal value out of the hex format you will need to follow the steps:<br/></span></p><ul><li>As noted before, multi-byte values are in little-endian and that means, to calculate the realm value, you will need to switch octets places (switch octets order). So the first step is to swap places for the values from 0x<span style="color: rgb(0,0,255);"><strong>0200</strong></span> to 0x<span style="color: rgb(0,0,255);"><strong>0002</strong></span>. 0x<span style="color: rgb(0,0,255);"><strong>0002</strong></span> converted from <strong>hexadecimal</strong> to <strong>decimal</strong> is <span style="color: rgb(0,0,255);"><strong>02</strong></span>.<span style="color: rgb(0,0,0);"><br/></span></li><li>Keep in mind that acceleration is in signed 8.8 fixed point format (two's complement) and that means that you basically need to divide the result by "256". The second step is to divide the value by 256 → (0x<span style="color: rgb(0,0,255);"><strong>0002</strong></span> <strong>hex</strong> or <span style="color: rgb(0,0,255);"><strong>02</strong></span> <strong>dec</strong>)/256 = <span class="qv3Wpe">0.0078 m/s<sup>2</sup></span><span>.</span></li><li><span>The same calculation principle applies to the acceleration for the X and Y-axis. In our example, they just happen to be 0 → 0x0000/256=0.</span></li></ul><p><span><span style="color: rgb(51,153,102);"><strong>a01c</strong></span> (14th and 15th octets) → temperature detected by the tag in Celsius = <strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe">28.625 C</span></span></strong>. Temperature is in little-endian (as it is a multi-byte value) and it is in<strong> </strong></span>signed 16-bit integer [twos complement] 8.8 fixed point format, s<span>o the same "formula" applies here as well:</span></p><ul><li><span> 0x<span style="color: rgb(51,153,102);"><strong>1ca0</strong></span><span style="color: rgb(0,51,102);">/256</span><strong><span style="color: rgb(128,0,128);">=</span></strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe">28.625 C.</span></span><br/></span></li></ul><p><strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe"><span style="color: rgb(122,134,154);"><span style="color: rgb(255,0,0);">91085700</span> </span></span></span></strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe">(16th to 19th</span></span><span> octets) → tag's uptime in seconds = <strong>5703825 s</strong>. 0x<strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe"><span style="color: rgb(122,134,154);"><span style="color: rgb(255,0,0);">91085700</span> </span></span></span></strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe">is in little-endian, so just swap the octets to 0x<span style="color: rgb(255,0,0);"><strong>00570891</strong></span><span style="color: rgb(122,134,154);"> <span style="color: rgb(0,0,0);">and the result is 5703825 in decimal. That is 1584.395833 hours or<strong> </strong>66-day uptime.</span></span></span></span></span><span style="color: rgb(0,0,0);"><span class="qv3Wpe"><span style="color: rgb(122,134,154);"><br/></span></span></span></p><p><strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe"><span style="color: rgb(122,134,154);"><span style="color: rgb(0,0,0);"><span style="color: rgb(255,0,255);"><span style="color: rgb(0,0,0);">00 </span></span></span></span></span></span></strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe">(20th octet) → trigger (flag) that sent the payload. If it is "<strong>00</strong>" it means that no trigger was detected and that it is just a periodically broadcasted payload (based on the advertisement interval configured for the tag). </span></span><span style="color: rgb(0,0,0);"><span class="qv3Wpe">If the value would be "<strong>04</strong>" it would mean that the device was dropped (freefalling triggered). You can find more information on the "flags" and the "Secret" section above in the <strong>packet structure </strong>section.</span></span></p><p><strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe"><span style="color: rgb(0,0,255);">5f</span> </span></span></strong><span style="color: rgb(0,0,0);"><span class="qv3Wpe">(21st octet) → battery percentage of the tag = <strong>95 %</strong>. 0x<span style="color: rgb(0,0,255);"><strong>5f</strong></span> from hex to dec is<strong> </strong>95.</span></span></p><div class="confluence-information-macro confluence-information-macro-information"><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Starting with v<strong>7.11</strong>, you can use the <a href="https://help.mikrotik.com/docs/display/ROS/Bluetooth#Bluetooth-PeripheralDevices" rel="nofollow">Peripheral Device</a> section or/and <a href="https://help.mikrotik.com/docs/display/ROS/Bluetooth#Bluetooth-Decode-ad" rel="nofollow">Decode-ad</a> feature to view decoded values!</p></div></div><h4 id="MikroTikTagadvertisementformats-Scriptfordecoding"><span style="color: rgb(0,0,0);"><span class="qv3Wpe">Script for decoding</span></span></h4><p><span style="color: rgb(0,0,0);"><span class="qv3Wpe">Add a new script under the "<strong>System>Scripts</strong>" tab and import the script there (for non-encrypted payloads).</span></span></p><blockquote><p># POSIX regex for filtering advertisement Bluetooth addresses. E.g. "^BC:33:AC"<br/># would only include addresses which start with those 3 octets.<br/># To disable this filter, set it to ""<br/>:local addressRegex "2C:C8:1B:4B:BB:0A"</p><p># POSIX regex for filtering Bluetooth advertisements based on their data. Same<br/># usage as with 'addressRegex'.<br/>:local advertisingDataRegex ""</p><p># Signal strength filter. E.g. -40 would only include Bluetooth advertisements<br/># whose signal strength is stronger than -40dBm.<br/># To disable this filter, set it to ""<br/>:local rssiThreshold ""</p><p>################################## Bluetooth ##################################<br/>:global invertU16 do={<br/> :local inverted 0<br/> :for idx from=0 to=15 step=1 do={<br/> :local mask (1 << $idx)<br/> :if ($1 & $mask = 0) do={<br/> :set $inverted ($inverted | $mask)<br/> }<br/> }<br/> return $inverted<br/>}</p><p>:global le16ToHost do={<br/> :local lsb [:pick $1 0 2]<br/> :local msb [:pick $1 2 4]</p><p> :return [:tonum "0x$msb$lsb"]<br/>}</p><p>:local le32ToHost do={<br/> :local lsb [:pick $1 0 2]<br/> :local midL [:pick $1 2 4]<br/> :local midH [:pick $1 4 6]<br/> :local msb [:pick $1 6 8]</p><p> :return [:tonum "0x$msb$midH$midL$lsb"]<br/>}</p><p>:local from88 do={<br/> :global invertU16<br/> :global le16ToHost<br/> :local num [$le16ToHost $1]</p><p> # Handle negative numbers<br/> :if ($num & 0x8000) do={<br/> :set num (-1 * ([$invertU16 $num] + 1))<br/> }</p><p> # Convert from 8.8. Scale by 1000 since floating point is not supported<br/> :return (($num * 125) / 32)<br/>}</p><p>:local flagStr do={<br/> :local str ""</p><p> :if ($1 & 0x01) do={ :set $str " switch" }<br/> :if ($1 & 0x02) do={ :set $str "$str tilt" }<br/> :if ($1 & 0x04) do={ :set $str "$str free_fall" }<br/> :if ($1 & 0x08) do={ :set $str "$str impact_x" }<br/> :if ($1 & 0x10) do={ :set $str "$str impact_y" }<br/> :if ($1 & 0x20) do={ :set $str "$str impact_z" }</p><p> :if ([:len $str] = 0) do={ :return "" }</p><p> :return [:pick $str 1 [:len $str]]<br/>}</p><p># Find fresh Bluetooth advertisements<br/>:global btOldestAdvertisementTimestamp<br/>:if ([:typeof $btOldestAdvertisementTimestamp] = "nothing") do={<br/> # First time this script has been run since booting, need to initialize<br/> # persistent variables<br/> :set $btOldestAdvertisementTimestamp 0<br/>}<br/>:local advertisements [/iot bluetooth scanners advertisements print detail \<br/> as-value where \<br/> epoch > $btOldestAdvertisementTimestamp and \<br/> address ~ $addressRegex and \<br/> data ~ $advertisingDataRegex and \<br/> rssi > $rssiThreshold<br/>]<br/>:local advCount 0<br/>:local lastAdvTimestamp 0<br/>:local advJson ""<br/>:local advSeparator ""</p><p># Remove semicolons from MAC/Bluetooth addresses<br/>:local minimizeMac do={<br/> :local minimized<br/> :local lastIdx ([:len $address] - 1)<br/> :for idx from=0 to=$lastIdx step=1 do={<br/> :local char [:pick $address $idx]<br/> :if ($char != ":") do={<br/> :set $minimized "$minimized$char"<br/> }<br/> }<br/> :return $minimized<br/>}</p><p>:foreach adv in=$advertisements do={<br/> :local address ($adv->"address")<br/> :local rssi ($adv->"rssi")<br/> :local epoch ($adv->"epoch")<br/> :local ad ($adv->"data")<br/> :local version [:tonum "0x$[:pick $ad 8 10]"]<br/> :local encrypted [:tonum "0x$[:pick $ad 10 12]"]<br/> :local salt [$le16ToHost [:pick $ad 12 16]]<br/> :local accelX [$from88 [:pick $ad 16 20]]<br/> :local accelY [$from88 [:pick $ad 20 24]]<br/> :local accelZ [$from88 [:pick $ad 24 28]]<br/> :local temp [$from88 [:pick $ad 28 32]]<br/> :local uptime [$le32ToHost [:pick $ad 32 40]]<br/> :local flags [:tonum "0x$[:pick $ad 40 42]"]<br/> :local bat [:tonum "0x$[:pick $ad 42 44]"]</p><p> :put ("$advCount: \<br/> address=$address \<br/> ts=$epoch \<br/> rssi=$rssi \<br/> version=$version \<br/> encrypted=$encrypted \<br/> salt=$salt \<br/> accelX=$accelX \<br/> accelY=$accelY \<br/> accelZ=$accelZ \<br/> temp=$temp \<br/> uptime=$uptime \<br/> flags=\"$[$flagStr $flags]\" \<br/> bat=$bat" \<br/> )<br/> :set $advCount ($advCount + 1)<br/> :set $lastAdvTimestamp $epoch<br/>}<br/>:if ($advCount > 0) do={<br/> :set $btOldestAdvertisementTimestamp $lastAdvTimestamp<br/>}</p></blockquote><p>The only line that you need to alter is the:</p><blockquote><p>:local addressRegex "2C:C8:1B:4B:BB:0A"</p></blockquote><p>line, where you need to input the MAC address of the tag.</p><p>Save the script with whichever name you like, for example, <strong>decode</strong>.</p><p>Run the script via the command line interface ("<strong>New Terminal</strong>" button in Winbox/Webfig):</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Example</b></div><div class="codeContent panelContent pdl">
<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: ros; gutter: false; theme: Confluence" data-custom-language-resource="com.atlassian.confluence.ext.code.custom.RouterOS.-3571982644292169508:custom-code-syntax-resources" data-theme="Confluence">[admin@MikroTik] > system script run decode
0: address=2C:C8:1B:4B:BB:0A ts=1662553431348 rssi=-45 version=1 encrypted=0 salt=57919 accelX=3 accelY=-35 accelZ=-70 temp=25535 uptime=1046174 flags="" bat=99
1: address=2C:C8:1B:4B:BB:0A ts=1662553436349 rssi=-40 version=1 encrypted=0 salt=24154 accelX=-19 accelY=-23 accelZ=0 temp=25546 uptime=1046179 flags="" bat=99
2: address=2C:C8:1B:4B:BB:0A ts=1662553446351 rssi=-37 version=1 encrypted=0 salt=37822 accelX=-15 accelY=35 accelZ=15 temp=25550 uptime=1046189 flags="" bat=99</pre>
</div></div><p>As you can see from the example above, the script will "translate" all payloads from a <strong>hexadecimal</strong> format to a <strong>decimal</strong> format and print them into the terminal.</p><p>You can also alter the script further to structure a message out of the "already decoded" values and post it to an EMAIL, MQTT, or HTTP server of your choice <strong>but!</strong> please keep in mind that it might load the device more. So you need to test the performance when running the script. It will be easier on RouterOS resources when the decoding is done on the server side.</p><div class="confluence-information-macro confluence-information-macro-information"><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Because of the fact that floating point is not supported → every calculation behind a decimal point will be "rounded up" to a whole number. This is why the script will calculate the temperature and acceleration values <strong>scaled by 1000</strong> (multiplied by <strong>1000</strong>).<br/>So, if you see the temperature as <strong>temp=25546</strong>, the real temperature is <strong>25.546 C</strong> (25546/1000) and if you see <strong>accelZ=15</strong>, the real acceleration against the z-axis will be <strong>0.015</strong> <span style="color: rgb(0,0,0);"><strong><span class="qv3Wpe">m/s<sup>2 </sup></span></strong></span>(15/1000).</p></div></div><h2 id="MikroTikTagadvertisementformats-iBeaconpacketstructure">iBeacon packet structure</h2><p>iBeacon is one of the supported advertising packet types. You can find more information about the protocol following the <a class="external-link" href="https://en.wikipedia.org/wiki/IBeacon" rel="nofollow">link</a>.</p><p><span>The PDU Payload, in this case, consists of "AdvA" (that is 6 octets long) and "AdvData" (a field that contains data information) fields. Legacy Bluetooth devices can only support 31 byte-long beacon messages. UUID is 16 byte-long (MikroTik default UID=b2b98de4-c81c-47c2-b14e-791b3e5587ec).<br/></span></p><p>"AdvData" field structure:</p><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 68.3489%;"><colgroup><col style="width: 16.0643%;"/><col style="width: 37.5904%;"/><col style="width: 46.3454%;"/></colgroup><tbody><tr><td class="confluenceTd">ManufacturerData</td><td colspan="1" class="confluenceTd">company identifier</td><td class="confluenceTd">4 octets (<code>1aff4c00</code>)</td></tr><tr><td class="confluenceTd">BeaconType</td><td colspan="1" class="confluenceTd">a secondary identifier</td><td class="confluenceTd">1 octet (const)</td></tr><tr><td class="confluenceTd">RemainingDataLength</td><td colspan="1" class="confluenceTd">defines the remaining length for the payload in bytes</td><td class="confluenceTd"><p>1 octet (const)</p></td></tr><tr><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">user-configured part of the payload</td><td colspan="1" class="confluenceTd"><ul><li>Proximity UUID (<span>universally unique identifier</span>) = 16 octets (uint)</li><li>Major Number (specific group identifier) = 2 octets (uint)</li><li>Minor Number (specific beacon identifier) = 2 octets (uint)</li></ul></td></tr><tr><td colspan="1" class="confluenceTd">TxPower</td><td colspan="1" class="confluenceTd">indicates the signal strength at one meter from the device</td><td colspan="1" class="confluenceTd"><p>1 octet (int)</p></td></tr></tbody></table></div><h3 id="MikroTikTagadvertisementformats-iBeaconPDUPayloadstructure">iBeacon PDU Payload structure</h3><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 60.0658%;"><colgroup><col style="width: 13.9854%;"/><col style="width: 11.0603%;"/><col style="width: 24.4059%;"/><col style="width: 50.5484%;"/></colgroup><tbody><tr><td class="confluenceTd">0</td><td class="confluenceTd"><code>1a</code></td><td colspan="1" class="confluenceTd">ManufacturerData</td><td colspan="1" class="confluenceTd">company identifier</td></tr><tr><td class="confluenceTd">1</td><td class="confluenceTd">ff</td><td colspan="1" class="confluenceTd">ManufacturerData</td><td colspan="1" class="confluenceTd">company identifier</td></tr><tr><td class="confluenceTd">2</td><td class="confluenceTd">4c</td><td colspan="1" class="confluenceTd">ManufacturerData</td><td colspan="1" class="confluenceTd">company identifier</td></tr><tr><td class="confluenceTd">3</td><td class="confluenceTd">00</td><td colspan="1" class="confluenceTd">ManufacturerData</td><td colspan="1" class="confluenceTd">company identifier</td></tr><tr><td class="confluenceTd">4</td><td class="confluenceTd">02</td><td colspan="1" class="confluenceTd">BeaconType</td><td colspan="1" class="confluenceTd">a secondary identifier</td></tr><tr><td class="confluenceTd">5</td><td class="confluenceTd">21</td><td colspan="1" class="confluenceTd">RemainingDataLength</td><td colspan="1" class="confluenceTd">defines the remaining length for the payload in bytes</td></tr><tr><td class="confluenceTd">6</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">7</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">8</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">9</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">10</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td colspan="1" class="confluenceTd">11</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td colspan="1" class="confluenceTd">12</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td colspan="1" class="confluenceTd">13</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">14</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">15</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">16</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">17</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td class="confluenceTd">18</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td colspan="1" class="confluenceTd">19</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td colspan="1" class="confluenceTd">20</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td colspan="1" class="confluenceTd">21</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Proximity UUID</td></tr><tr><td colspan="1" class="confluenceTd">22</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Major Number</td></tr><tr><td colspan="1" class="confluenceTd">23</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Major Number</td></tr><tr><td colspan="1" class="confluenceTd">24</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Minor Number</td></tr><tr><td colspan="1" class="confluenceTd">25</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UserData</td><td colspan="1" class="confluenceTd">Minor Number</td></tr><tr><td colspan="1" class="confluenceTd">26</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TxPower</td><td colspan="1" class="confluenceTd">indicates the signal strength at one meter from the device</td></tr></tbody></table></div><p class="auto-cursor-target">* - can vary</p><h2 id="MikroTikTagadvertisementformats-Eddystone-TLMpacketstructure">Eddystone-TLM packet structure</h2><p>Eddystone-TLM is one of the supported advertising packet types. You can find more information about the protocol following the <a class="external-link" href="https://github.com/google/eddystone/blob/master/eddystone-tlm/tlm-plain.md" rel="nofollow">link</a>.</p><p><span>The PDU Payload, in this case, consists of "AdvA" (that is 6 octets long) and "AdvData" (a field that contains data information) fields. MikroTik default CompleteUUID=03 03 aa fe; ServiceData=11 16 aa fe.<br/></span></p><p>"AdvData" field structure:</p><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 77.1256%;"><colgroup><col style="width: 10.8185%;"/><col style="width: 40.7117%;"/><col style="width: 48.4698%;"/></colgroup><tbody><tr><td class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">part of the advertisement payload that is common for all Eddystone's frame types</td><td class="confluenceTd"><ul><li>CompleteUUID (<span>universally unique identifier</span>) = 4 octets (const)</li><li>ServiceData (<em>16 bit UUID</em> data type) = 4 octets (const)</li><li>FrameType (Value = <code>0x20</code>) = 1 octet (const)</li></ul></td></tr><tr><td class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">Eddystone-TLM frame payload</td><td class="confluenceTd"><ul><li>Version (TLM version) = 1 octet (const)</li><li>BatteryVoltageMv (Battery voltage, 1 mV/bit) = 2 octets (uint)</li><li>TemperatureC (Beacon temperature in Celsius) = 2 octets (int)</li><li>AdvertisementCount (Advertising PDU count) = 4 octets (uint)</li><li>UptimeCounter (Time since power-on or reboot) = 4 octets (uint)</li></ul></td></tr></tbody></table></div><p><br/></p><h3 id="MikroTikTagadvertisementformats-Eddystone-TLMPDUPayloadstructure">Eddystone-TLM PDU Payload structure</h3><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 43.4997%;"><colgroup><col style="width: 23.4848%;"/><col style="width: 18.5606%;"/><col style="width: 24.8737%;"/><col style="width: 33.0808%;"/></colgroup><tbody><tr><td class="confluenceTd">0</td><td class="confluenceTd"><code>03</code></td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">1</td><td class="confluenceTd">03</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">2</td><td class="confluenceTd">aa</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">3</td><td class="confluenceTd">fe</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">4</td><td class="confluenceTd">11</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">5</td><td class="confluenceTd">16</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">6</td><td class="confluenceTd">aa</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">7</td><td class="confluenceTd">fe</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">8</td><td class="confluenceTd">20</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">FrameType</td></tr><tr><td class="confluenceTd">9</td><td class="confluenceTd">00</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">Version</td></tr><tr><td class="confluenceTd">10</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">BatteryVoltageMv</td></tr><tr><td colspan="1" class="confluenceTd">11</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">BatteryVoltageMv</td></tr><tr><td colspan="1" class="confluenceTd">12</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">TemperatureC </td></tr><tr><td colspan="1" class="confluenceTd">13</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">TemperatureC </td></tr><tr><td class="confluenceTd">14</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">AdvertisementCount</td></tr><tr><td class="confluenceTd">15</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">AdvertisementCount</td></tr><tr><td class="confluenceTd">16</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">AdvertisementCount</td></tr><tr><td class="confluenceTd">17</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">AdvertisementCount</td></tr><tr><td class="confluenceTd">18</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">UptimeCounter</td></tr><tr><td colspan="1" class="confluenceTd">19</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">UptimeCounter</td></tr><tr><td colspan="1" class="confluenceTd">20</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">UptimeCounter</td></tr><tr><td colspan="1" class="confluenceTd">21</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">TlmPayload</td><td colspan="1" class="confluenceTd">UptimeCounter</td></tr></tbody></table></div><p>* - can vary</p><h2 id="MikroTikTagadvertisementformats-Eddystone-UIDpacketstructure">Eddystone-UID packet structure</h2><p>Eddystone-UID is one of the supported advertising packet types. You can find more information about the protocol following the <a class="external-link" href="https://github.com/google/eddystone/blob/master/eddystone-uid/README.md" rel="nofollow">link</a>.</p><p><span>The PDU Payload, in this case, consists of "AdvA" (that is 6 octets long) and "AdvData" (a field that contains data information) fields. MikroTik default CompleteUUID=03 03 aa fe; ServiceData=17 16 aa fe.<br/></span></p><p>"AdvData" field structure:</p><div class="table-wrap"><table class="relative-table wrapped confluenceTable"><colgroup><col style="width: 10.8185%;"/><col style="width: 40.7117%;"/><col style="width: 48.4698%;"/></colgroup><tbody><tr><td class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">part of the advertisement payload that is common for all Eddystone's frame types</td><td class="confluenceTd"><ul><li>CompleteUUID (<span>universally unique identifier</span>) = 4 octets (const)</li><li>ServiceData (<em>16 bit UUID</em> data type) = 4 octets (const)</li><li>FrameType (value = <code>0x00</code>) = 1 octet (const)</li></ul></td></tr><tr><td class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Eddystone-UID frame payload</td><td class="confluenceTd"><ul><li>Ranging Data (calibrated Tx power at 0 m) = 1 octet (int)</li><li>Nspace (unique self-assigned beacon ID namespace) = 10 octets (uint)</li><li>Instance (unique ID within the namespace) = 6 octets (uint)</li><li>RFU1 (reserved for future use, value=<code>0x00</code>) = 1 octet (const)</li><li>RFU2 (reserved for future use, value=<code>0x00</code>) = 1 octet (const)</li></ul></td></tr></tbody></table></div><p><br/></p><h3 id="MikroTikTagadvertisementformats-Eddystone-UIDPDUPayloadstructure">Eddystone-UID PDU Payload structure</h3><div class="table-wrap"><table class="relative-table wrapped confluenceTable" style="width: 48.2644%;"><colgroup><col style="width: 16.3504%;"/><col style="width: 19.8153%;"/><col style="width: 30.6233%;"/><col style="width: 33.2549%;"/></colgroup><tbody><tr><td class="confluenceTd">0</td><td class="confluenceTd"><code>03</code></td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">1</td><td class="confluenceTd">03</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">2</td><td class="confluenceTd">aa</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">3</td><td class="confluenceTd">fe</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">CompleteUUID</td></tr><tr><td class="confluenceTd">4</td><td class="confluenceTd">17</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">5</td><td class="confluenceTd">16</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">6</td><td class="confluenceTd">aa</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">7</td><td class="confluenceTd">fe</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">ServiceData</td></tr><tr><td class="confluenceTd">8</td><td class="confluenceTd">00</td><td colspan="1" class="confluenceTd">CommonPayload</td><td colspan="1" class="confluenceTd">FrameType</td></tr><tr><td class="confluenceTd">9</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Ranging Data</td></tr><tr><td class="confluenceTd">10</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td colspan="1" class="confluenceTd">11</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td colspan="1" class="confluenceTd">12</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td colspan="1" class="confluenceTd">13</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td class="confluenceTd">14</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td class="confluenceTd">15</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td class="confluenceTd">16</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td class="confluenceTd">17</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td class="confluenceTd">18</td><td class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td colspan="1" class="confluenceTd">19</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Nspace</td></tr><tr><td colspan="1" class="confluenceTd">20</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Instance</td></tr><tr><td colspan="1" class="confluenceTd">21</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Instance</td></tr><tr><td colspan="1" class="confluenceTd">22</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Instance</td></tr><tr><td colspan="1" class="confluenceTd">23</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Instance</td></tr><tr><td colspan="1" class="confluenceTd">24</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Instance</td></tr><tr><td colspan="1" class="confluenceTd">25</td><td colspan="1" class="confluenceTd">xx*</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">Instance</td></tr><tr><td colspan="1" class="confluenceTd">26</td><td colspan="1" class="confluenceTd">00</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">RFU1</td></tr><tr><td colspan="1" class="confluenceTd">27</td><td colspan="1" class="confluenceTd">00</td><td colspan="1" class="confluenceTd">UidPayload</td><td colspan="1" class="confluenceTd">RFU2</td></tr></tbody></table></div><p class="auto-cursor-target">* - can vary</p>
</div>
<div style="padding: 10px 0;">
<a href="https://help.mikrotik.com/docs/display/UM/MikroTik+Tag+advertisement+formats">View Online</a>
·
<a href="https://help.mikrotik.com/docs/pages/diffpagesbyversion.action?pageId=105742533&revisedVersion=46&originalVersion=45">View Changes Online</a>
</div>
</div>Deniss M.2022-01-28T12:33:01Z