Difference between revisions of "Gr-smart meters Setup Guide"

From RECESSIM, A Reverse Engineering Community
Jump to navigation Jump to search
(Updated for GNURadio 3.10 and Ubuntu 22.04)
Line 3: Line 3:
 
<youtube width="320" height="240">fUK8tcFQwpo</youtube>
 
<youtube width="320" height="240">fUK8tcFQwpo</youtube>
  
==Install Ubuntu 20.04==
+
==Install Ubuntu 22.04==
 
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.
 
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.
  
Line 13: Line 13:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Install dependencies===
+
==Install GNU Radio 3.10==
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.<syntaxhighlight lang="bash">
+
The version packaged with Ubuntu (3.10.1 as of 12-30-2022) works fine, has been tested up to 3.10.5<syntaxhighlight lang="bash">
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
+
sudo apt-get install gnuradio
</syntaxhighlight><code>sudo apt install liborc-0.4-dev vim libsndfile1-dev graphviz curl</code>
 
 
 
==Install GNU Radio 3.9==
 
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.<syntaxhighlight lang="bash">
 
sudo add-apt-repository ppa:gnuradio/gnuradio-releases-3.9
 
sudo apt update
 
sudo apt-get install gnuradio python3-packaging
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==For USRP B200 Support==
+
==SDR Hardware Support==
This is specific to the USRP B200 software defined radio, if you are using another SDR this will not be necessary.
 
 
 
===Install necessary packages===
 
<code>sudo apt install libuhd-dev uhd-host</code>
 
 
 
===Download firmware needed for different USRP devices===
 
If this doesn't work your files may have been installed in /usr/local/lib instead of /usr/lib
 
 
 
<code>sudo /usr/lib/uhd/utils/uhd_images_downloader.py</code>
 
  
===Configure USB and test USRP B200===
+
=== All support is now native in GNURadio 3.10. ===
<syntaxhighlight lang="bash">
 
cd /usr/lib/uhd/utils/
 
sudo cp uhd-usrp.rules /etc/udev/rules.d/
 
sudo udevadm control --reload-rules
 
sudo udevadm trigger
 
uhd_usrp_probe
 
</syntaxhighlight>
 
  
==For HackRF Support==
+
* UHD can be used for Ettus USRP hardware
===Install necessary packages===
+
* Soapy Custom Source is used for HackRF, AirSpy, BladeRF and RTL-SDR
<code>sudo apt install build-essential cmake libusb-1.0-0-dev pkg-config libfftw3-dev</code>
 
===Install HackRF from source===
 
<syntaxhighlight lang="bash">
 
git clone https://github.com/mossmann/hackrf.git
 
cd hackrf/host/
 
mkdir build
 
cd build
 
cmake ..
 
make -j8
 
sudo make install
 
sudo ldconfig
 
</syntaxhighlight>
 
===Install gr-osmosdr===
 
<syntaxhighlight lang="bash">
 
git clone git://git.osmocom.org/gr-osmosdr
 
cd gr-osmosdr/
 
git checkout master
 
mkdir build
 
cd build/
 
cmake ../
 
make
 
sudo make install
 
sudo ldconfig
 
</syntaxhighlight>
 
 
 
==For AirSpy Support==
 
 
 
===Install necessary packages===
 
<syntaxhighlight lang="bash">
 
sudo apt install libairspy0 libairspy-dev
 
</syntaxhighlight>
 
 
 
===Install gr-osmosdr===
 
<syntaxhighlight lang="bash">
 
git clone git://git.osmocom.org/gr-osmosdr
 
cd gr-osmosdr/
 
git checkout master
 
mkdir build
 
cd build/
 
cmake ../
 
make
 
sudo make install
 
sudo ldconfig
 
</syntaxhighlight>
 
==For RTL-SDR Support==
 
===Install RTL-SDR drivers===
 
Follow procedure to install RTL-SDR drivers: https://www.rtl-sdr.com/rtl-sdr-quick-start-guide/
 
Section: Getting Started on Linux
 
===Install gr-osmosdr===
 
<syntaxhighlight lang="bash">
 
git clone git://git.osmocom.org/gr-osmosdr
 
cd gr-osmosdr/
 
git checkout master
 
mkdir build
 
cd build/
 
cmake ../
 
make
 
sudo make install
 
sudo ldconfig
 
</syntaxhighlight>
 
  
 
==Install Frequency Hopping Utilities==
 
==Install Frequency Hopping Utilities==
Line 112: Line 29:
  
 
#[https://github.com/sandialabs/gr-pdu_utils PDU Utilities]
 
#[https://github.com/sandialabs/gr-pdu_utils PDU Utilities]
#[https://github.com/sandialabs/gr-fhss_utils FHSS Utilities]
 
 
#[https://github.com/sandialabs/gr-timing_utils Timing Utilities]
 
#[https://github.com/sandialabs/gr-timing_utils Timing Utilities]
 
#[https://github.com/sandialabs/gr-sandia_utils Sandia Utilities]
 
#[https://github.com/sandialabs/gr-sandia_utils Sandia Utilities]
 +
#[https://github.com/sandialabs/gr-fhss_utils FHSS Utilities]
  
 
===Create a folder to organize them===
 
===Create a folder to organize them===
Line 127: Line 44:
 
git clone https://github.com/sandialabs/gr-pdu_utils.git
 
git clone https://github.com/sandialabs/gr-pdu_utils.git
 
cd gr-pdu_utils/
 
cd gr-pdu_utils/
git checkout maint-3.9
+
git checkout maint-3.10
 
mkdir build
 
mkdir build
 
cd build
 
cd build
Line 137: Line 54:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Install FHSS Utilities===
+
===Install Sandia Utilities===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
git clone https://github.com/sandialabs/gr-fhss_utils.git
+
git clone https://github.com/sandialabs/gr-sandia_utils.git
cd gr-fhss_utils/
+
cd gr-sandia_utils/
git checkout master
+
git checkout maint-3.10
 
mkdir build
 
mkdir build
 
cd build/
 
cd build/
Line 155: Line 72:
 
git clone https://github.com/sandialabs/gr-timing_utils.git
 
git clone https://github.com/sandialabs/gr-timing_utils.git
 
cd gr-timing_utils/
 
cd gr-timing_utils/
git checkout master
+
git checkout maint-3.10
 
mkdir build
 
mkdir build
 
cd build
 
cd build
Line 165: Line 82:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Install Sandia Utilities (Possibly not needed for GR-3.9)===
+
===Install FHSS Utilities===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
git clone https://github.com/sandialabs/gr-sandia_utils.git
+
git clone https://github.com/sandialabs/gr-fhss_utils.git
cd gr-sandia_utils/
+
cd gr-fhss_utils/
git checkout master
+
git checkout maint-3.10
 
mkdir build
 
mkdir build
 
cd build/
 
cd build/
Line 179: Line 96:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Setup PYTHONPATH==
+
===Finish up===
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.
 
 
 
#Figure out where your dist-packages is located
 
#Open your .bashrc file and add that path
 
#close all open terminals and re-open them
 
 
 
===Figure out where dist-packages is located===
 
If your system is like mine they will be in:
 
 
 
<code>/usr/local/lib/python3/dist-packages</code>
 
 
 
You can easily confirm by using "ls" 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 "dist-packages" on your system where they may have been placed.
 
 
 
===Edit .bashrc and add PYTHONPATH===
 
Add the following to the end of your .bashrc if there is no PYTHONPATH variable.
 
 
 
<code>export PYTHONPATH=/usr/local/lib/python3.8/dist-packages/</code>
 
 
 
====Finish up====
 
 
Close all open terminal windows and then open a new one.
 
Close all open terminal windows and then open a new one.
  
 
==Setup gr-smart_meters==
 
==Setup gr-smart_meters==
 
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.  
 
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.  
===Python 2.7 dependencies===
 
Current version of script which does GPS coordinates extraction requires Python 2.7 and numpy library installed.
 
<syntaxhighlight lang="bash">
 
sudo apt-get install python2
 
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
 
sudo python2 get-pip.py
 
sudo pip2 install numpy
 
</syntaxhighlight>
 
 
===Install gr-smart_meters===
 
===Install gr-smart_meters===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
git clone https://github.com/BitBangingBytes/gr-smart_meters.git
 
git clone https://github.com/BitBangingBytes/gr-smart_meters.git
 
cd gr-smart_meters/
 
cd gr-smart_meters/
git checkout master
+
git checkout main
 
mkdir build
 
mkdir build
 
cd build/
 
cd build/
Line 225: Line 115:
 
===Start GNU Radio from a terminal window===
 
===Start GNU Radio from a terminal window===
 
<code>gnuradio-companion</code>
 
<code>gnuradio-companion</code>
 
 
 
If you get an error when you start GNU Radio "The xterm executable 'x-terminal-emulator' is missing, edit the following file:<syntaxhighlight lang="bash">
 
sudo nano /etc/gnuradio/conf.d/grc.conf
 
</syntaxhighlight>Edit the line to read 'xterm_executable = /usr/bin/gnome-terminal"
 
 
===Open flowgraph for your SDR===
 
===Open flowgraph for your SDR===
 
In GNU Radio open a flowgraph and navigate to the gr-smart_meters/examples folder. If you have installed everything above you should be able to run it and see smart meter data!
 
In GNU Radio open a flowgraph and navigate to the gr-smart_meters/examples folder. If you have installed everything above you should be able to run it and see smart meter data!

Revision as of 20:26, 30 December 2022

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.

Install Ubuntu 22.04

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.

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.

sudo apt update
sudo apt upgrade

Install GNU Radio 3.10

The version packaged with Ubuntu (3.10.1 as of 12-30-2022) works fine, has been tested up to 3.10.5

sudo apt-get install gnuradio

SDR Hardware Support

All support is now native in GNURadio 3.10.

  • UHD can be used for Ettus USRP hardware
  • Soapy Custom Source is used for HackRF, AirSpy, BladeRF and RTL-SDR

Install Frequency Hopping Utilities

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.

  1. PDU Utilities
  2. Timing Utilities
  3. Sandia Utilities
  4. FHSS Utilities

Create a folder to organize them

cd
mkdir FHSS_Utils
cd FHSS_Utils

Install PDU Utilities

git clone https://github.com/sandialabs/gr-pdu_utils.git
cd gr-pdu_utils/
git checkout maint-3.10
mkdir build
cd build
cmake ..
make -j8
sudo make install
sudo ldconfig
cd ../..

Install Sandia Utilities

git clone https://github.com/sandialabs/gr-sandia_utils.git
cd gr-sandia_utils/
git checkout maint-3.10
mkdir build
cd build/
cmake ..
make -j8
sudo make install
sudo ldconfig
cd ../..

Install Timing Utilities

git clone https://github.com/sandialabs/gr-timing_utils.git
cd gr-timing_utils/
git checkout maint-3.10
mkdir build
cd build
cmake ..
make -j8
sudo make install
sudo ldconfig
cd ../..

Install FHSS Utilities

git clone https://github.com/sandialabs/gr-fhss_utils.git
cd gr-fhss_utils/
git checkout maint-3.10
mkdir build
cd build/
cmake ..
make -j8
sudo make install
sudo ldconfig
cd ../..

Finish up

Close all open terminal windows and then open a new one.

Setup gr-smart_meters

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.

Install gr-smart_meters

git clone https://github.com/BitBangingBytes/gr-smart_meters.git
cd gr-smart_meters/
git checkout main
mkdir build
cd build/
cmake ..
make -j8
sudo make install
sudo ldconfig

Start GNU Radio from a terminal window

gnuradio-companion

Open flowgraph for your SDR

In GNU Radio open a flowgraph and navigate to the gr-smart_meters/examples folder. If you have installed everything above you should be able to run it and see smart meter data!

Determining your power providers CRC

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.

Install reveng

It's on sourceforge: https://reveng.sourceforge.io/ Documentation is at: https://reveng.sourceforge.io/readme.htm Download the .zip in the latest releases folder: https://sourceforge.net/projects/reveng/files/2.1.1/ Follow instructions to make

Provide reveng four good packets

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.

You will get data that looks like this below.

00FF2A55002330FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286

You need to remove the first 6 bytes and provide the rest as inputs to reveng, CRC isn't calculated on those bytes.

00FF2A550023 <-- Discard | 30FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286

Now provide four samples to reveng

./reveng -w 16 -s 30FFFFFFFFFFFF50CF5DD9E2C0B80065F5D1A483F0FBBC6F01001E6C043B517E90B286 30FFFFFFFFFFFF50CF2DD9E560560065F5D5A483F0C000650100176C033FF77E901766 30FFFFFFFFFFFF50CF95D9E5E01A0065F5D9A483F0515A0201001E6C042A177E90BDA4 30FFFFFFFFFFFF50CF8DD9E6A0F00065F5EBA483F0EBFD4A0100206C0433A97E90B04C

You should get the following output below if you used this data to test

width=16 poly=0x1021 init=0x5fd6 refin=false refout=false xorout=0x0000 check=0x139e residue=0x0000 name=(none)

The init value is what you enter into the GridStream block, you can now enable the CRC and know you have correct data!

GridStream CRC Prefix Calculator by L0scher

CRC Prefix Calculator by L0scher

Enter a string of hex bytes in the box and hit the Find CRC init button searches for the initial CRC value which would make the calculated CRC equal to zero. It uses the 0x1021 polynomial value. If it cannot find such a value, it will leave the value unchanged.