<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.recessim.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aero</id>
	<title>RECESSIM - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.recessim.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aero"/>
	<link rel="alternate" type="text/html" href="https://wiki.recessim.com/view/Special:Contributions/Aero"/>
	<updated>2026-05-08T09:10:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://wiki.recessim.com/w/index.php?title=Landis%2BGyr_GridStream_Protocol&amp;diff=1465</id>
		<title>Landis+Gyr GridStream Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.recessim.com/w/index.php?title=Landis%2BGyr_GridStream_Protocol&amp;diff=1465"/>
		<updated>2021-05-14T01:29:26Z</updated>

		<summary type="html">&lt;p&gt;Aero: Uploaded capture data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:LandisGyrResidentialMeter1.JPG|thumb]]&lt;br /&gt;
&lt;br /&gt;
==Protocol Analysis==&lt;br /&gt;
Analysis and decoding of the packets used on the Landis+Gyr GridStream mesh network.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
===Packet Structure===&lt;br /&gt;
&lt;br /&gt;
====Sync and Header====&lt;br /&gt;
----The sync word that the Landis+Gyr smart meters send is shown below, this can be used in GNU Radio or other tools to receive only packets transmitted by the meters. Note that at the start of the header we begin using start and stop bits. These must be stripped off of the rest of the data packet during processing.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sync and Header&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot; |Sync&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |Header&lt;br /&gt;
|-&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xA&lt;br /&gt;
!0x00&lt;br /&gt;
!0xFF&lt;br /&gt;
!0x2A&lt;br /&gt;
|-&lt;br /&gt;
|10101010&lt;br /&gt;
|10101010&lt;br /&gt;
|10101010&lt;br /&gt;
|10101010&lt;br /&gt;
|10101010&lt;br /&gt;
|1010&lt;br /&gt;
|0 '''00000000''' 1&lt;br /&gt;
|0 '''11111111''' 1&lt;br /&gt;
|0 '''00101010''' 1&lt;br /&gt;
|}&lt;br /&gt;
Using GNU Radio it was found that shortening the Sync requirements a bit and incorporating part of the header leads to the cleanest data for further downstream processing. The modified sync shown in 8 bit chunks is shown below.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Sync Word used with GNURadio&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xAA&lt;br /&gt;
!0xA0&lt;br /&gt;
!0x05&lt;br /&gt;
!0xFF&lt;br /&gt;
|-&lt;br /&gt;
|10101010&lt;br /&gt;
|10101010&lt;br /&gt;
|10101010&lt;br /&gt;
|10101010&lt;br /&gt;
|10100000&lt;br /&gt;
|00000101&lt;br /&gt;
|11111111&lt;br /&gt;
|}&lt;br /&gt;
The final byte of the sync (0x2A) along with it's start and stop bits are discarded as part of the processing.&lt;br /&gt;
----&amp;lt;br /&amp;gt;&lt;br /&gt;
====Type, Length and Sub Type====&lt;br /&gt;
----So far only two types of packets have been observed, a 0x55 and a 0xD5 packet. Multiple lengths and SubTypes of these are listed below.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&lt;br /&gt;
!Type&lt;br /&gt;
!Length&lt;br /&gt;
!SubType&lt;br /&gt;
!Packets Purpose&lt;br /&gt;
|-&lt;br /&gt;
!1&lt;br /&gt;
|0x55&lt;br /&gt;
|0x0023&lt;br /&gt;
|0x30&lt;br /&gt;
|Report up-time and other unknown data&lt;br /&gt;
|-&lt;br /&gt;
!2&lt;br /&gt;
|0x55&lt;br /&gt;
|0x0028&lt;br /&gt;
|0x30&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!3&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0011&lt;br /&gt;
|0x21&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!4&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0011&lt;br /&gt;
|0x22&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!5&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0011&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!6&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0016&lt;br /&gt;
|0x21&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!8&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0016&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0017&lt;br /&gt;
|0x21&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!9&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0017&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!10&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x001C&lt;br /&gt;
|0x21&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!11&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x001C&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!12&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x001D&lt;br /&gt;
|0x29&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!13&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x0047&lt;br /&gt;
|0x51&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!14&lt;br /&gt;
|0xD5&lt;br /&gt;
|0x00FD&lt;br /&gt;
|0xC0&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
----&amp;lt;br /&amp;gt;&lt;br /&gt;
====Data====&lt;br /&gt;
----Data varies per packet type but a common theme is the 0x55 packets appear to be broadcasts from the meters with only their own ID. 0xD5 packets usually contain two ID's and appear to be how data is routed across the network. Sometimes one of the meter ID's in a 0xD5 packet is FFFFFFFF which may be a broadcast packet. This was observed when packets were sent that appear to be updating the system time of the meters.&lt;br /&gt;
----&amp;lt;br /&amp;gt;&lt;br /&gt;
====Checksum====&lt;br /&gt;
----&lt;br /&gt;
C++ source code below used to calculate the CRC, different energy providers use a different initial CRC value. Assume this is to segment traffic, unsure if Routers/Collectors are shared by different providers to return traffic or not. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t Landis_crc16 (uint16_t crc, const std::vector&amp;lt;uint8_t&amp;gt; &amp;amp;data, size_t size) { &lt;br /&gt;
// CoServ CRC = 0x45F8 &lt;br /&gt;
// Oncor CRC = 0x5FD6 &lt;br /&gt;
// Hard coded Poly 0x1021&lt;br /&gt;
    uint16_t i = 0;&lt;br /&gt;
    while (size--) {&lt;br /&gt;
        crc ^= data[i] &amp;lt;&amp;lt; 8; &lt;br /&gt;
        i++; &lt;br /&gt;
        for (unsigned k = 0; k &amp;lt; 8; k++) &lt;br /&gt;
            crc = crc &amp;amp; 0x8000 ? (crc &amp;lt;&amp;lt; 1) ^ 0x1021 : crc &amp;lt;&amp;lt; 1;&lt;br /&gt;
    }&lt;br /&gt;
    return crc; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Captured Meter Data===&lt;br /&gt;
There have been two packet types observed thus far, a 0x55 and a 0xD5 packet.&lt;br /&gt;
&lt;br /&gt;
*0x55 appears to be broadcasts from the meters and happen frequently. They have been observed multiple times per minute from a single meter.&lt;br /&gt;
&lt;br /&gt;
*0xD5 appears to be a packet for transporting data across the mesh network. Each D5 packet will contain two meter ID's, Meter ID #1 and Meter ID #2. There are many 0xD5 packet length and types that have been observed, some are shown below.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
====0x55 Meter Data====&lt;br /&gt;
The data below was captured from the same meter (F0EE36DB) and shows some of the values that can change with each transmission. Different meters have different fixed data and some of the data changes less frequently as well.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
0x55 Captured packets from Meter F0EE36DB (Oncor)&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Pkt&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
!9&lt;br /&gt;
!10&lt;br /&gt;
!11&lt;br /&gt;
!12&lt;br /&gt;
!13&lt;br /&gt;
!14&lt;br /&gt;
!15&lt;br /&gt;
!16&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |Not part of CRC calc&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; |Data&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
!Header&lt;br /&gt;
!Type&lt;br /&gt;
!Length&lt;br /&gt;
!SubType&lt;br /&gt;
!Unknown&lt;br /&gt;
!WAN Address&lt;br /&gt;
!Counter&lt;br /&gt;
!Uptime&lt;br /&gt;
!Unknown&lt;br /&gt;
!LAN Address&lt;br /&gt;
!Unknown&lt;br /&gt;
!Unknown&lt;br /&gt;
!Timing &lt;br /&gt;
(0.01 increments)&lt;br /&gt;
!Unknown&lt;br /&gt;
!Checksum&lt;br /&gt;
!Trailing&lt;br /&gt;
|-&lt;br /&gt;
!1&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''0C'''&lt;br /&gt;
|'''0001ECBF'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''384F'''&lt;br /&gt;
|7E80&lt;br /&gt;
|0896&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!2&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''16'''&lt;br /&gt;
|'''0001ECC6'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''3AC5'''&lt;br /&gt;
|7E80&lt;br /&gt;
|F47E&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!3&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''2A'''&lt;br /&gt;
|'''0001ED05'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''1207'''&lt;br /&gt;
|7E80&lt;br /&gt;
|A412&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!4&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''34'''&lt;br /&gt;
|'''0001ED29'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''1FF9'''&lt;br /&gt;
|7E80&lt;br /&gt;
|D9C4&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!5&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''38'''&lt;br /&gt;
|'''0001ED37'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''2571'''&lt;br /&gt;
|7E80&lt;br /&gt;
|963C&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!6&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''42'''&lt;br /&gt;
|'''0001ED5C'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''33A9'''&lt;br /&gt;
|7E80&lt;br /&gt;
|8384&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''4C'''&lt;br /&gt;
|'''0001ED60'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''354D'''&lt;br /&gt;
|7E80&lt;br /&gt;
|2CB6&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!8&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''4E'''&lt;br /&gt;
|'''0001ED79'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''3F25'''&lt;br /&gt;
|7E80&lt;br /&gt;
|871A&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!9&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''60'''&lt;br /&gt;
|'''0001EDA6'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''0F05'''&lt;br /&gt;
|7E80&lt;br /&gt;
|25C9&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!10&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|50CF8DD9E2C0&lt;br /&gt;
|'''6A'''&lt;br /&gt;
|'''0001EDCD'''&lt;br /&gt;
|A483&lt;br /&gt;
|F0EE36DB&lt;br /&gt;
|0100&lt;br /&gt;
|213204&lt;br /&gt;
|'''1E55'''&lt;br /&gt;
|7E80&lt;br /&gt;
|F33F&lt;br /&gt;
|04&lt;br /&gt;
|}&lt;br /&gt;
[[File:55 Packet Timing Analysis.png|thumb|600x600px|Field 15 Timing Analysis  -Anonymous]]&lt;br /&gt;
Commentary on the data fields above, they have been grouped based on sample analysis but this could be wrong. If you see a new pattern not noticed before you may be correct.&lt;br /&gt;
&lt;br /&gt;
*Field 5 - Never observed a packet with this length and subtype that wasn't all FF's&lt;br /&gt;
&lt;br /&gt;
*Field 6 - WAN Address - Oncor uses GPS coordinates, CoServ uses LAN with padding of some kind.  The open source [https://github.com/beroset/gpsdecode gpsdecode] library shows one way to translate between WAN Address and GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
*Field 7 - Increments some amount with each transmission and rolls over at 0xFF, always an even hex value&lt;br /&gt;
&lt;br /&gt;
*Field 8 - Value in seconds since meter powered on, '''easy way to see last time the meter experienced a power outage.'''&lt;br /&gt;
*Field 10 - LAN Address, Meter ID that's listed on the sticker on the front&lt;br /&gt;
&lt;br /&gt;
'''** NEW **'''&lt;br /&gt;
&lt;br /&gt;
'''Field 13''' - Timing in hundredths of a second, counts from 0 to 167.99 (0x419F) seconds then rolls over to 0 again. Credit for this discovery goes to an anonymous reader who examined the dataset at the bottom of the page!!&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+0x55 Captured packets from Meter 5021D005 (Coserv)&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Pkt&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
!9&lt;br /&gt;
!10&lt;br /&gt;
!11&lt;br /&gt;
!12&lt;br /&gt;
!13&lt;br /&gt;
!14&lt;br /&gt;
!15&lt;br /&gt;
!16&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |Not part of CRC calc&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; |Data&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
!Header&lt;br /&gt;
!Type&lt;br /&gt;
!Length&lt;br /&gt;
!SubType&lt;br /&gt;
!Unknown&lt;br /&gt;
!WAN Address&lt;br /&gt;
!Counter&lt;br /&gt;
!Uptime&lt;br /&gt;
!Unknown&lt;br /&gt;
!LAN Address&lt;br /&gt;
!Unknown&lt;br /&gt;
!Unknown&lt;br /&gt;
!Timing &lt;br /&gt;
(0.01 increments)&lt;br /&gt;
!Unknown&lt;br /&gt;
!Checksum&lt;br /&gt;
!Trailing&lt;br /&gt;
|-&lt;br /&gt;
!1&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|7C&lt;br /&gt;
|'''0003FB20'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''0100'''&lt;br /&gt;
|'''072001'''&lt;br /&gt;
|1E56&lt;br /&gt;
|7E00&lt;br /&gt;
|9032&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!2&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|AE&lt;br /&gt;
|'''0003FB9E'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''0100'''&lt;br /&gt;
|'''072001'''&lt;br /&gt;
|0DA8&lt;br /&gt;
|7E00&lt;br /&gt;
|83E8&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!3&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|B8&lt;br /&gt;
|'''0003FBC1'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''0100'''&lt;br /&gt;
|'''072001'''&lt;br /&gt;
|1B54&lt;br /&gt;
|7E00&lt;br /&gt;
|2924&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!4&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|C0&lt;br /&gt;
|'''0003FC30'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''0100'''&lt;br /&gt;
|'''072001'''&lt;br /&gt;
|052E&lt;br /&gt;
|7E00&lt;br /&gt;
|09FC&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!5&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|EA&lt;br /&gt;
|'''0003FC9F'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''0100'''&lt;br /&gt;
|'''072001'''&lt;br /&gt;
|3062&lt;br /&gt;
|7E00&lt;br /&gt;
|C69A&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;17&amp;quot; |Power restored after an outage&lt;br /&gt;
|-&lt;br /&gt;
!6&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|06&lt;br /&gt;
|'''0000000F'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''01EA'''&lt;br /&gt;
|'''6000FE'''&lt;br /&gt;
|26DA&lt;br /&gt;
|7E30&lt;br /&gt;
|90CE&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|0E&lt;br /&gt;
|'''0000000F'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''01EA'''&lt;br /&gt;
|'''6000FE'''&lt;br /&gt;
|26EF&lt;br /&gt;
|7E10&lt;br /&gt;
|2740&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!8&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|20&lt;br /&gt;
|'''00000011'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''01EA'''&lt;br /&gt;
|'''6000FE'''&lt;br /&gt;
|2801&lt;br /&gt;
|7E90&lt;br /&gt;
|8B23&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!9&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|2C&lt;br /&gt;
|'''00000013'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''01EA'''&lt;br /&gt;
|'''6000FE'''&lt;br /&gt;
|2883&lt;br /&gt;
|7E60&lt;br /&gt;
|1A1A&lt;br /&gt;
|04&lt;br /&gt;
|-&lt;br /&gt;
!10&lt;br /&gt;
|00FF2A&lt;br /&gt;
|55&lt;br /&gt;
|0023&lt;br /&gt;
|30&lt;br /&gt;
|FFFFFFFFFFFF&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|54&lt;br /&gt;
|'''00000017'''&lt;br /&gt;
|A403&lt;br /&gt;
|5021D005&lt;br /&gt;
|'''01EA'''&lt;br /&gt;
|'''6000FE'''&lt;br /&gt;
|2A72&lt;br /&gt;
|7E80&lt;br /&gt;
|E3CD&lt;br /&gt;
|04&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
====0xD5 Meter Data====&lt;br /&gt;
There appear to be multiple packet lengths and styles for the 0xD5 packet. Some samples shown below.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+0xD5 Captured packets&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Pkt&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
!9&lt;br /&gt;
!10&lt;br /&gt;
!11&lt;br /&gt;
!12&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |Not part of CRC calc&lt;br /&gt;
! colspan=&amp;quot;7&amp;quot; |Data&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
!Header&lt;br /&gt;
!Type&lt;br /&gt;
!Length&lt;br /&gt;
!SubType&lt;br /&gt;
!Meter ID #1&lt;br /&gt;
!Meter ID #2&lt;br /&gt;
!Unknown&lt;br /&gt;
!Unknown&lt;br /&gt;
!Unknown&lt;br /&gt;
!Unknown&lt;br /&gt;
!Checksum&lt;br /&gt;
!Trailing&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0016&lt;br /&gt;
|21&lt;br /&gt;
|F05FCB84&lt;br /&gt;
|F0FC4DB1&lt;br /&gt;
|E288&lt;br /&gt;
|0100&lt;br /&gt;
|273205&lt;br /&gt;
|00781930&lt;br /&gt;
|CB72&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0016&lt;br /&gt;
|21&lt;br /&gt;
|F0653657&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|7288&lt;br /&gt;
|0100&lt;br /&gt;
|1F3204&lt;br /&gt;
|2E241140&lt;br /&gt;
|B6B1&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0016&lt;br /&gt;
|21&lt;br /&gt;
|F0EF3BCE&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|6288&lt;br /&gt;
|0100&lt;br /&gt;
|1E3204&lt;br /&gt;
|23931730&lt;br /&gt;
|6DA6&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0016&lt;br /&gt;
|21&lt;br /&gt;
|F1419ADD&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|7C98&lt;br /&gt;
|0100&lt;br /&gt;
|1E3204&lt;br /&gt;
|332C1780&lt;br /&gt;
|BB3E&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0016&lt;br /&gt;
|21&lt;br /&gt;
|F07C5F0C&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|9A88&lt;br /&gt;
|0100&lt;br /&gt;
|1E3204&lt;br /&gt;
|018C1A80&lt;br /&gt;
|4FCF&lt;br /&gt;
|00&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+0xD5 Packets where actual time along with uptime is observed&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Pkt&lt;br /&gt;
!1&lt;br /&gt;
!2&lt;br /&gt;
!3&lt;br /&gt;
!4&lt;br /&gt;
!5&lt;br /&gt;
!6&lt;br /&gt;
!7&lt;br /&gt;
!8&lt;br /&gt;
!9&lt;br /&gt;
!10&lt;br /&gt;
!11&lt;br /&gt;
!12&lt;br /&gt;
!13&lt;br /&gt;
!14&lt;br /&gt;
!15&lt;br /&gt;
!16&lt;br /&gt;
!17&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; |Not part of CRC calc&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; |Data (Oncor Meter)&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
!Header&lt;br /&gt;
!Type&lt;br /&gt;
!Length&lt;br /&gt;
!SubType&lt;br /&gt;
!Meter ID1&lt;br /&gt;
!Meter ID2&lt;br /&gt;
!Counter&lt;br /&gt;
!Epoch Time&lt;br /&gt;
!Unknown&lt;br /&gt;
Reading?&lt;br /&gt;
!Uptime&lt;br /&gt;
!Unknown&lt;br /&gt;
!Unknown&lt;br /&gt;
!WAN Address&lt;br /&gt;
Meter ID2&lt;br /&gt;
!Meter ID2&lt;br /&gt;
!Unknown Data&lt;br /&gt;
!Checksum&lt;br /&gt;
!Trailing&lt;br /&gt;
|-&lt;br /&gt;
!1&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0047&lt;br /&gt;
|51&lt;br /&gt;
|F0C00020&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|18&lt;br /&gt;
|'''60378AB1'''&lt;br /&gt;
|00033D56&lt;br /&gt;
|0006C31A&lt;br /&gt;
|A483&lt;br /&gt;
|0101&lt;br /&gt;
|50CFB5D9E400&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|000103240602030705070704000000 04C2 C000 204C 0401 FA 2030208180 2163 1900&lt;br /&gt;
|75F3&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
!2&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0047&lt;br /&gt;
|51&lt;br /&gt;
|F10679DE&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|1E&lt;br /&gt;
|'''60378C72'''&lt;br /&gt;
|00023F96&lt;br /&gt;
|0006C4DB&lt;br /&gt;
|A483&lt;br /&gt;
|0101&lt;br /&gt;
|50CFB5D9E400&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|000103240602030705070704000000 0718 6800 204C 0401 FA 2030208180 0BF7 1D30&lt;br /&gt;
|CDB4&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
!3&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0047&lt;br /&gt;
|51&lt;br /&gt;
|F159CD44&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|B4&lt;br /&gt;
|'''603A627C'''&lt;br /&gt;
|00028F50&lt;br /&gt;
|00099AE5&lt;br /&gt;
|A483&lt;br /&gt;
|0101&lt;br /&gt;
|50CFB5D9E400&lt;br /&gt;
|F03B9FFB&lt;br /&gt;
|000103240602020705070805000000 02A3 C800 1E6C 0401 D9 2030208180 226A 1A10&lt;br /&gt;
|7330&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; |&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; |Data (CoServ Meter)&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
!4&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0047&lt;br /&gt;
|51&lt;br /&gt;
|F143250D&lt;br /&gt;
|5021D005&lt;br /&gt;
|1A&lt;br /&gt;
|'''603AD051'''&lt;br /&gt;
|000130D8&lt;br /&gt;
|000D10ED&lt;br /&gt;
|A403&lt;br /&gt;
|0101&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|5021D005&lt;br /&gt;
|000103200000000000000000000000 02C3 0800 0E20 0200 E3 20301F8180 22F0 1C40&lt;br /&gt;
|4FEB&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
!5&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0047&lt;br /&gt;
|51&lt;br /&gt;
|F143248A&lt;br /&gt;
|5021D005&lt;br /&gt;
|64&lt;br /&gt;
|'''603AD09C'''&lt;br /&gt;
|000133C6&lt;br /&gt;
|000D1138&lt;br /&gt;
|A403&lt;br /&gt;
|0101&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|5021D005&lt;br /&gt;
|000103200000000000000000000000 0BA0 9000 0E20 0200 E3 20301F8180 4076 1150&lt;br /&gt;
|73A7&lt;br /&gt;
|00&lt;br /&gt;
|-&lt;br /&gt;
!6&lt;br /&gt;
|00FF2A&lt;br /&gt;
|D5&lt;br /&gt;
|0047&lt;br /&gt;
|51&lt;br /&gt;
|500F0DD6&lt;br /&gt;
|5021D005&lt;br /&gt;
|80&lt;br /&gt;
|'''603AD0D3'''&lt;br /&gt;
|000135EC&lt;br /&gt;
|000D116F&lt;br /&gt;
|A403&lt;br /&gt;
|0101&lt;br /&gt;
|FE5021D00500&lt;br /&gt;
|5021D005&lt;br /&gt;
|000103200000000000000000000000 01D8 A800 0E20 0200 E3 20301F8180 1412 2E40&lt;br /&gt;
|ADC1&lt;br /&gt;
|00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Epoch time calculator and explanation can be found [https://www.epochconverter.com/ here], first convert time from hex to decimal then input into converter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A D5 0016 21 F073B577 F062363D FA88 0100 1F6C04 14E93E70 CF80 04&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A D5 0017 29 8073AEAC F0F28D56 1288 0100 1F3204 041CBB1930 2D2A 04&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A D5 001B 21 F10679E2 8073CE7D F498 0100 106C02 0A15F9055F06571A80 37C5 00&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A D5 001C 29 8073ADB3 8073CE7D 9088 0100 106C02 040A99CF055F3A4B1170 A696 04&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A D5 0021 22 F05A1A60 8073CE7D D8010100106C020520301D81800A99CF055F3ADD1410 A560 04&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A D5 0047 51 F05A4BCC F03D4CD7 5A 6032F37F 0001DA2E 00022BE9 A483 0101 50D075D9E2E0 F03D4CD7&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;000103240403030806080801000000036EE8001F6C0401E9203020818018C22930 9294 00&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Data captures===&lt;br /&gt;
'''''*Note: This file does not contain the trailing bytes shown in the captures above, it stops at the 16 bit Checksum.''''' &lt;br /&gt;
&lt;br /&gt;
[https://wiki.recessim.com/w/images/d/d3/F03B9FFB.txt Oncor Meter - F03B9FFB - 48 hours capture]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Data Requests from SmartMeterTexas (F03B9FFB)&lt;br /&gt;
!Date&lt;br /&gt;
!Time&lt;br /&gt;
!Meter Read&lt;br /&gt;
!On Demand Energy Usage&lt;br /&gt;
|-&lt;br /&gt;
|03/01/2021&lt;br /&gt;
|14:31:08&lt;br /&gt;
|37641.426&lt;br /&gt;
|79.415&lt;br /&gt;
|-&lt;br /&gt;
|03/01/2021&lt;br /&gt;
|16:44:40&lt;br /&gt;
|37648.598&lt;br /&gt;
|37.441&lt;br /&gt;
|-&lt;br /&gt;
|03/01/2021&lt;br /&gt;
|22:14:01&lt;br /&gt;
|37658.906&lt;br /&gt;
|47.749&lt;br /&gt;
|-&lt;br /&gt;
|03/02/2021&lt;br /&gt;
|21:17:07&lt;br /&gt;
|37705.09&lt;br /&gt;
|44.071&lt;br /&gt;
|-&lt;br /&gt;
|03/02/2021&lt;br /&gt;
|21:22:58&lt;br /&gt;
|37705.234&lt;br /&gt;
|44.215&lt;br /&gt;
|}&lt;br /&gt;
This table lists Real-time data requests from [https://www.smartmetertexas.com/home SmartMeterTexas.com] which allows customers to request current meter readings. You will see 0xD5 packets in the data file closely linked to the times above. When the request is made on the website the meter generally responds within 10-15 seconds meaning the system can send a message to the mesh network, traverse across the meters and return fairly quickly.&lt;br /&gt;
&lt;br /&gt;
===GPS Tagged Wardrive Files===&lt;br /&gt;
Format will likely change for the files as more is learned, currently the format is:&lt;br /&gt;
 Meter_ID, Uptime(seconds), Uptime(days), GPS_Data($GPGGA)&lt;br /&gt;
[https://wiki.recessim.com/w/images/a/a6/Wardrive-NTX_to_Highland-Park-03-09-2021.csv Wardrive-NTX_to_Highland-Park-03-09-2021.csv] &lt;br /&gt;
Raw capture data:&lt;br /&gt;
[[File:RAW Capture NJ.txt.txt]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aero</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.recessim.com/w/index.php?title=File:RAW_Capture_NJ.txt.txt&amp;diff=1464</id>
		<title>File:RAW Capture NJ.txt.txt</title>
		<link rel="alternate" type="text/html" href="https://wiki.recessim.com/w/index.php?title=File:RAW_Capture_NJ.txt.txt&amp;diff=1464"/>
		<updated>2021-05-14T01:25:06Z</updated>

		<summary type="html">&lt;p&gt;Aero: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Raw capture data&lt;/div&gt;</summary>
		<author><name>Aero</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.recessim.com/w/index.php?title=Gr-smart_meters_Setup_Guide&amp;diff=1463</id>
		<title>Gr-smart meters Setup Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.recessim.com/w/index.php?title=Gr-smart_meters_Setup_Guide&amp;diff=1463"/>
		<updated>2021-05-13T02:20:43Z</updated>

		<summary type="html">&lt;p&gt;Aero: Moved Python prereqs to proper section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following install guide details the steps from a fresh Ubuntu 20.04 install to a fully running GNU Radio + USRP B200, HackRF and RTL-SDR frequency hopping spread spectrum setup needed to capture smart meter data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot;&amp;gt;fUK8tcFQwpo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Ubuntu 20.04==&lt;br /&gt;
There is nothing special about Ubuntu, it was chosen because it works well across different computers and has a familiar interface. Likely these instructions can be used as a rough guide for what is needed with other distro's.&lt;br /&gt;
&lt;br /&gt;
For now, this step is to install a base version of Ubuntu 20.04, mine was a minimal install. After finishing your install ensure you update everything.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install dependencies===&lt;br /&gt;
The block at the top is standard from the GNU Radio install guide. The two additional below are vim so you get nice colors in your editor and liborc which is needed for the additional GNU Radio blocks that will be installed.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install git cmake g++ libboost-all-dev libgmp-dev swig python3-numpy python3-mako python3-sphinx python3-lxml doxygen libfftw3-dev libsdl1.2-dev libgsl-dev libqwt-qt5-dev libqt5opengl5-dev python3-pyqt5 liblog4cpp5-dev libzmq3-dev python3-yaml python3-click python3-click-plugins python3-zmq python3-scipy python3-gi python3-gi-cairo gobject-introspection gir1.2-gtk-3.0 xterm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sudo apt install liborc-0.4-dev vim&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install GNU Radio 3.8==&lt;br /&gt;
This guide and the blocks used here are all dependent on GNU Radio 3.8. As 3.9 has been released for a while more blocks and packages are getting support so this guide may be updated in the future to support 3.9.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:gnuradio/gnuradio-releases-3.8&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install gnuradio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For USRP B200 Support==&lt;br /&gt;
This is specific to the USRP B200 software defined radio, if you are using another SDR this will not be necessary.&lt;br /&gt;
&lt;br /&gt;
===Install necessary packages===&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt install libuhd-dev libuhd3.15.0 uhd-host&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download firmware needed for different USRP devices===&lt;br /&gt;
If this doesn't work your files may have been installed in /usr/local/lib instead of /usr/lib&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo /usr/lib/uhd/utils/uhd_images_downloader.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure USB and test USRP B200===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/lib/uhd/utils/&lt;br /&gt;
sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
sudo udevadm trigger&lt;br /&gt;
uhd_usrp_probe&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For HackRF Support==&lt;br /&gt;
===Install necessary packages===&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt install build-essential cmake libusb-1.0-0-dev pkg-config libfftw3-dev&amp;lt;/code&amp;gt;&lt;br /&gt;
===Install HackRF from source===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/mossmann/hackrf.git&lt;br /&gt;
cd hackrf/host/&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Install gr-osmosdr===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.osmocom.org/gr-osmosdr&lt;br /&gt;
cd gr-osmosdr/&lt;br /&gt;
git checkout gr3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ../&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For AirSpy Support==&lt;br /&gt;
&lt;br /&gt;
===Install necessary packages===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install libairspy0 libairspy-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install gr-osmosdr===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.osmocom.org/gr-osmosdr&lt;br /&gt;
cd gr-osmosdr/&lt;br /&gt;
git checkout gr3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ../&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==For RTL-SDR Support==&lt;br /&gt;
===Install RTL-SDR drivers===&lt;br /&gt;
Follow procedure to install RTL-SDR drivers: https://www.rtl-sdr.com/rtl-sdr-quick-start-guide/&lt;br /&gt;
Section: Getting Started on Linux&lt;br /&gt;
===Install gr-osmosdr===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.osmocom.org/gr-osmosdr&lt;br /&gt;
cd gr-osmosdr/&lt;br /&gt;
git checkout gr3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ../&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Frequency Hopping Utilities==&lt;br /&gt;
If you already have GNU Radio and your SDR setup you should start here to install the Sandia Laboratories out of tree (OOT) modules. Four different OOT modules are needed.&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/sandialabs/gr-pdu_utils PDU Utilities]&lt;br /&gt;
#[https://github.com/sandialabs/gr-fhss_utils FHSS Utilities]&lt;br /&gt;
#[https://github.com/sandialabs/gr-timing_utils Timing Utilities]&lt;br /&gt;
#[https://github.com/sandialabs/gr-sandia_utils Sandia Utilities]&lt;br /&gt;
&lt;br /&gt;
===Create a folder to organize them===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir FHSS_Utils&lt;br /&gt;
cd FHSS_Utils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install PDU Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-pdu_utils.git&lt;br /&gt;
cd gr-pdu_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install FHSS Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-fhss_utils.git&lt;br /&gt;
cd gr-fhss_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install Timing Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-timing_utils.git&lt;br /&gt;
cd gr-timing_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install Sandia Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-sandia_utils.git&lt;br /&gt;
cd gr-sandia_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Setup PYTHONPATH==&lt;br /&gt;
gnuradio-companion will give you errors if it can't find your python libraries that were just installed. Also highly suggest starting gnuradio-companion from a terminal as opposed to the icon in Ubuntu. It gives you a nice way to see console output and you have to configure path variables in other places to run gnuradio-companion with the icon.&lt;br /&gt;
&lt;br /&gt;
#Figure out where your dist-packages is located&lt;br /&gt;
#Open your .bashrc file and add that path&lt;br /&gt;
#close all open terminals and re-open them&lt;br /&gt;
&lt;br /&gt;
===Figure out where dist-packages is located===&lt;br /&gt;
If your system is like mine they will be in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/lib/python3/dist-packages&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can easily confirm by using &amp;quot;ls&amp;quot; to show all the files there, if you see folder names corresponding to the packages installed above you have the correct folder. If not, try searching for other occurrences of &amp;quot;dist-packages&amp;quot; on your system where they may have been placed.&lt;br /&gt;
&lt;br /&gt;
===Edit .bashrc and add PYTHONPATH===&lt;br /&gt;
Add the following to the end of your .bashrc if there is no PYTHONPATH variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;export PYTHONPATH=/usr/local/lib/python3/dist-packages/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Finish up====&lt;br /&gt;
Close all open terminal windows and then open a new one.&lt;br /&gt;
&lt;br /&gt;
==Setup gr-smart_meters==&lt;br /&gt;
This contains the GridStream block that will be used to decode Landis+Gyr Smart Meter data along with pre-configured flowgraphs for USRP B200, HackRF and RTL-SDR and a script to decode GPS data transmitted in some cases. &lt;br /&gt;
===Python 2.7 dependencies===&lt;br /&gt;
Current version of script which does GPS coordinates extraction requires Python 2.7 and numpy library installed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py&lt;br /&gt;
python2 get-pip.py&lt;br /&gt;
pip2 install numpy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Install gr-smart_meters===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/BitBangingBytes/gr-smart_meters.git&lt;br /&gt;
cd gr-smart_meters/&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Start GNU Radio from a terminal window===&lt;br /&gt;
&amp;lt;code&amp;gt;gnuradio-companion&amp;lt;/code&amp;gt;&lt;br /&gt;
===Open flowgraph for your SDR===&lt;br /&gt;
In GNU Radio open a flowgraph and navigate to the gr-smart_meters/flowgraph folder. If you have installed everything above you should be able to run it and see smart meter data!&lt;br /&gt;
==Determining your power providers CRC==&lt;br /&gt;
CRC check is set to false in the sample flowgraphs so you will see data but can't be sure there aren't any errors. Every power provider is assigned a unique CRC so neighboring smart meter systems do not interfere with each other. To determine this you need to capture at least 4 good packets and use reveng to reverse the CRC.&lt;br /&gt;
===Install reveng===&lt;br /&gt;
It's on sourceforge: https://reveng.sourceforge.io/&lt;br /&gt;
Documentation is at: https://reveng.sourceforge.io/readme.htm&lt;br /&gt;
Download the .zip in the latest releases folder: https://sourceforge.net/projects/reveng/files/2.1.1/&lt;br /&gt;
Follow instructions to make&lt;br /&gt;
===Provide reveng four good packets===&lt;br /&gt;
I find the easiest way to do this is to limit the '''Packet Type''' to 0x55 and '''Packet Length''' to 0x23. Edit the GridStream block and make those changes then run the flowgraph making sure '''CRC Enable''' is set to False. &lt;br /&gt;
&lt;br /&gt;
You will get data that looks like this below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A55002330FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to remove the first 6 bytes and provide the rest as inputs to reveng, CRC isn't calculated on those bytes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A550023 &amp;lt;-- Discard | 30FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now provide four samples to reveng&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./reveng -w 16 -s 30FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286 30FFFFFFFFFFFF50CF2DD9E560560065F5D5A483F0C000650100176C033FF77E901766 30FFFFFFFFFFFF50CF95D9E5E01A0065F5D9A483F0515A0201001E6C042A177E90BDA4 30FFFFFFFFFFFF50CF8DD9E6A0F00065F5EBA483F0EBFD4A0100206C0433A97E90B04C&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should get the following output below if you used this data to test&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;width=16  poly=0x1021  init=0x5fd6  refin=false  refout=false  xorout=0x0000  check=0x139e  residue=0x0000  name=(none)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The init value is what you enter into the GridStream block, you can now enable the CRC and know you have correct data!&lt;/div&gt;</summary>
		<author><name>Aero</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.recessim.com/w/index.php?title=Gr-smart_meters_Setup_Guide&amp;diff=1462</id>
		<title>Gr-smart meters Setup Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.recessim.com/w/index.php?title=Gr-smart_meters_Setup_Guide&amp;diff=1462"/>
		<updated>2021-05-12T23:32:43Z</updated>

		<summary type="html">&lt;p&gt;Aero: 1. xterm is needed for gnuradio (not included in basic 20.04 install) 2. directory change need to be done twice to get out from build and project folders 3. numpy installation for Python 2.7 4. RTL-SDR drivers (should be installed before gr-osmosdr)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following install guide details the steps from a fresh Ubuntu 20.04 install to a fully running GNU Radio + USRP B200, HackRF and RTL-SDR frequency hopping spread spectrum setup needed to capture smart meter data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot;&amp;gt;fUK8tcFQwpo&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Ubuntu 20.04==&lt;br /&gt;
There is nothing special about Ubuntu, it was chosen because it works well across different computers and has a familiar interface. Likely these instructions can be used as a rough guide for what is needed with other distro's.&lt;br /&gt;
&lt;br /&gt;
For now, this step is to install a base version of Ubuntu 20.04, mine was a minimal install. After finishing your install ensure you update everything.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install dependencies===&lt;br /&gt;
The block at the top is standard from the GNU Radio install guide. The two additional below are vim so you get nice colors in your editor and liborc which is needed for the additional GNU Radio blocks that will be installed.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install git cmake g++ libboost-all-dev libgmp-dev swig python3-numpy python3-mako python3-sphinx python3-lxml doxygen libfftw3-dev libsdl1.2-dev libgsl-dev libqwt-qt5-dev libqt5opengl5-dev python3-pyqt5 liblog4cpp5-dev libzmq3-dev python3-yaml python3-click python3-click-plugins python3-zmq python3-scipy python3-gi python3-gi-cairo gobject-introspection gir1.2-gtk-3.0 xterm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;sudo apt install liborc-0.4-dev vim&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install GNU Radio 3.8==&lt;br /&gt;
This guide and the blocks used here are all dependent on GNU Radio 3.8. As 3.9 has been released for a while more blocks and packages are getting support so this guide may be updated in the future to support 3.9.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:gnuradio/gnuradio-releases-3.8&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install gnuradio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For USRP B200 Support==&lt;br /&gt;
This is specific to the USRP B200 software defined radio, if you are using another SDR this will not be necessary.&lt;br /&gt;
&lt;br /&gt;
===Install necessary packages===&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt install libuhd-dev libuhd3.15.0 uhd-host&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Download firmware needed for different USRP devices===&lt;br /&gt;
If this doesn't work your files may have been installed in /usr/local/lib instead of /usr/lib&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo /usr/lib/uhd/utils/uhd_images_downloader.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configure USB and test USRP B200===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /usr/lib/uhd/utils/&lt;br /&gt;
sudo cp uhd-usrp.rules /etc/udev/rules.d/&lt;br /&gt;
sudo udevadm control --reload-rules&lt;br /&gt;
sudo udevadm trigger&lt;br /&gt;
uhd_usrp_probe&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For HackRF Support==&lt;br /&gt;
===Install necessary packages===&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt install build-essential cmake libusb-1.0-0-dev pkg-config libfftw3-dev&amp;lt;/code&amp;gt;&lt;br /&gt;
===Install HackRF from source===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/mossmann/hackrf.git&lt;br /&gt;
cd hackrf/host/&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Install gr-osmosdr===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.osmocom.org/gr-osmosdr&lt;br /&gt;
cd gr-osmosdr/&lt;br /&gt;
git checkout gr3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ../&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==For AirSpy Support==&lt;br /&gt;
&lt;br /&gt;
===Install necessary packages===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install libairspy0 libairspy-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install gr-osmosdr===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.osmocom.org/gr-osmosdr&lt;br /&gt;
cd gr-osmosdr/&lt;br /&gt;
git checkout gr3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ../&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==For RTL-SDR Support==&lt;br /&gt;
===Install RTL-SDR drivers===&lt;br /&gt;
Follow procedure to install RTL-SDR drivers: https://www.rtl-sdr.com/rtl-sdr-quick-start-guide/&lt;br /&gt;
Section: Getting Started on Linux&lt;br /&gt;
===Install gr-osmosdr===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.osmocom.org/gr-osmosdr&lt;br /&gt;
cd gr-osmosdr/&lt;br /&gt;
git checkout gr3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ../&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install Frequency Hopping Utilities==&lt;br /&gt;
If you already have GNU Radio and your SDR setup you should start here to install the Sandia Laboratories out of tree (OOT) modules. Four different OOT modules are needed.&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/sandialabs/gr-pdu_utils PDU Utilities]&lt;br /&gt;
#[https://github.com/sandialabs/gr-fhss_utils FHSS Utilities]&lt;br /&gt;
#[https://github.com/sandialabs/gr-timing_utils Timing Utilities]&lt;br /&gt;
#[https://github.com/sandialabs/gr-sandia_utils Sandia Utilities]&lt;br /&gt;
&lt;br /&gt;
===Create a folder to organize them===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd&lt;br /&gt;
mkdir FHSS_Utils&lt;br /&gt;
cd FHSS_Utils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install PDU Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-pdu_utils.git&lt;br /&gt;
cd gr-pdu_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install FHSS Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-fhss_utils.git&lt;br /&gt;
cd gr-fhss_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install Timing Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-timing_utils.git&lt;br /&gt;
cd gr-timing_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Install Sandia Utilities===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/sandialabs/gr-sandia_utils.git&lt;br /&gt;
cd gr-sandia_utils/&lt;br /&gt;
git checkout maint-3.8&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
cd ../..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Setup PYTHONPATH==&lt;br /&gt;
gnuradio-companion will give you errors if it can't find your python libraries that were just installed. Also highly suggest starting gnuradio-companion from a terminal as opposed to the icon in Ubuntu. It gives you a nice way to see console output and you have to configure path variables in other places to run gnuradio-companion with the icon.&lt;br /&gt;
&lt;br /&gt;
#Figure out where your dist-packages is located&lt;br /&gt;
#Open your .bashrc file and add that path&lt;br /&gt;
#close all open terminals and re-open them&lt;br /&gt;
&lt;br /&gt;
===Figure out where dist-packages is located===&lt;br /&gt;
If your system is like mine they will be in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/usr/local/lib/python3/dist-packages&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can easily confirm by using &amp;quot;ls&amp;quot; to show all the files there, if you see folder names corresponding to the packages installed above you have the correct folder. If not, try searching for other occurrences of &amp;quot;dist-packages&amp;quot; on your system where they may have been placed.&lt;br /&gt;
&lt;br /&gt;
===Edit .bashrc and add PYTHONPATH===&lt;br /&gt;
Add the following to the end of your .bashrc if there is no PYTHONPATH variable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;export PYTHONPATH=/usr/local/lib/python3/dist-packages/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Finish up====&lt;br /&gt;
Close all open terminal windows and then open a new one.&lt;br /&gt;
&lt;br /&gt;
==Setup gr-smart_meters==&lt;br /&gt;
This contains the GridStream block that will be used to decode Landis+Gyr Smart Meter data along with pre-configured flowgraphs for USRP B200, HackRF and RTL-SDR and a script to decode GPS data transmitted in some cases. &lt;br /&gt;
===Install gr-smart_meters===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/BitBangingBytes/gr-smart_meters.git&lt;br /&gt;
cd gr-smart_meters/&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build/&lt;br /&gt;
cmake ..&lt;br /&gt;
make -j8&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Start GNU Radio from a terminal window===&lt;br /&gt;
&amp;lt;code&amp;gt;gnuradio-companion&amp;lt;/code&amp;gt;&lt;br /&gt;
===Open flowgraph for your SDR===&lt;br /&gt;
In GNU Radio open a flowgraph and navigate to the gr-smart_meters/flowgraph folder. If you have installed everything above you should be able to run it and see smart meter data!&lt;br /&gt;
==Determining your power providers CRC==&lt;br /&gt;
CRC check is set to false in the sample flowgraphs so you will see data but can't be sure there aren't any errors. Every power provider is assigned a unique CRC so neighboring smart meter systems do not interfere with each other. To determine this you need to capture at least 4 good packets and use reveng to reverse the CRC.&lt;br /&gt;
===Install reveng===&lt;br /&gt;
It's on sourceforge: https://reveng.sourceforge.io/&lt;br /&gt;
Documentation is at: https://reveng.sourceforge.io/readme.htm&lt;br /&gt;
Download the .zip in the latest releases folder: https://sourceforge.net/projects/reveng/files/2.1.1/&lt;br /&gt;
Follow instructions to make&lt;br /&gt;
===Provide reveng four good packets===&lt;br /&gt;
I find the easiest way to do this is to limit the '''Packet Type''' to 0x55 and '''Packet Length''' to 0x23. Edit the GridStream block and make those changes then run the flowgraph making sure '''CRC Enable''' is set to False. &lt;br /&gt;
&lt;br /&gt;
You will get data that looks like this below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A55002330FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to remove the first 6 bytes and provide the rest as inputs to reveng, CRC isn't calculated on those bytes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;00FF2A550023 &amp;lt;-- Discard | 30FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now provide four samples to reveng&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./reveng -w 16 -s 30FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286 30FFFFFFFFFFFF50CF2DD9E560560065F5D5A483F0C000650100176C033FF77E901766 30FFFFFFFFFFFF50CF95D9E5E01A0065F5D9A483F0515A0201001E6C042A177E90BDA4 30FFFFFFFFFFFF50CF8DD9E6A0F00065F5EBA483F0EBFD4A0100206C0433A97E90B04C&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should get the following output below if you used this data to test&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;width=16  poly=0x1021  init=0x5fd6  refin=false  refout=false  xorout=0x0000  check=0x139e  residue=0x0000  name=(none)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The init value is what you enter into the GridStream block, you can now enable the CRC and know you have correct data!&lt;br /&gt;
&lt;br /&gt;
===Python 2.7 dependencies===&lt;br /&gt;
Current version of script which does GPS coordinates extraction requires Python 2.7 and numpy library installed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py&lt;br /&gt;
python2 get-pip.py&lt;br /&gt;
pip2 install numpy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aero</name></author>
		
	</entry>
</feed>