Here's a quick update on my multipurpose receiver project for the 433 MHz ISM band.
I've managed to get the noise problem somewhat under control. The interference from the USB module is mostly gone now that I have a RF shield around that part. However it still takes some practice to get a clear signal from the receiver module. As it is, I still can't use the full length λ/4 antenna or all I get from the receiver is noise. So I usually reduce the sensitivity by using somewhat shorter lengths of wire. Finding the right location for the receiver also seems to be important, which suggests that the noise I receive comes from localized sources and isn't inherent to the receiver or the ambient. Anyway, I now mostly use the receiver with a 1 m USB extension cable that allows me to find the quietest spot on the table.
From the software side I now have a pretty useful system that consists of several layers:
- Stand-alone process that reads a baseband stream from hardware, automatically detects several kinds of digital modulations (PWM, FSK, manchester and some weird ones I saw in the wild) and outputs a decoded binary packet plus some physical-level header that includes the modulation data, timestamp and so on.
- Patched libpcap that reads packets from this process and provides a standard packet-capture interface on top of it.
- Patched tcpdump with dissectors for packets produced by popular encoder ICs (such as MC145026 and Superstar TX-13) and some heuristics for determining the actual meaning behind the encoded bits.
The final result then looks somewhat like this:
$ tcpdump -X -i am433_1_0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on am433_1_0, link-type 254, capture size 65535 bytes 02:42:56.101249 technoline weather dev 15 chan 3 [22.3 C inc 60 % RH] 0 1 0x0000: bf2f b01b 80 ./...
Meaning that there's a weather monitor somewhere in range that reports a balmy 22.3°C with 60% relative humidity.
All this actually turned out to be a quite useful diagnostic tool. So far I used it to repair Kiberpipa's door remote and take some measurements with my own remote weather sensor. And just running it at different locations and observing various packets flying around is fun on its own.
Actually, my first idea was to use Wireshark instead of tcpdump, because I wanted to write dissectors in one of the high-level languages it supports and because its GUI offers some quite convenient filtering functions. However that beast turned out to be somewhat complicated and I didn't found the patience to deal with it. Actually, libpcap and tcpdump themselves were more messy than I expected, but I guess supporting all those combinations of OS and networks comes with a cost.
I'll be publishing most of this work under an open license shortly in some public git repository. I would have done that sooner, but from the start my private repository has accumulated a large number of packet captures for testing purposes and those might include packets that I can't make public. For those interested in knowing more I will also be giving a talk on all of this in Kiberpipa in December.