Paul Tagliamonte: Reverse Engineering a Restaurant Pager system
It s been a while since I played with something new been stuck in a bit of a
rut with radios recently - working on refining and debugging stuff I mostly
understand for the time being. The other day, I was out getting some food and I
idly wondered how the restaurant pager system worked. Idle curiosity gave way
to the realization that I, in fact, likely had the means and ability to answer
this question, so I bought the first set of the most popular looking restaurant
pagers I could find on eBay, figuring it d be a fun multi-week adventure.
Order up!
I wound up buying a Retekess brand TD-158 Restaurant Pager System (they looked
like ones I d seen before and seemed to be low-cost and popular), and quickly
after, had a pack of 10 pagers and a base station in-hand. The manual stated
that the radios operated at 433 MHz (cool! can do! Love a good ISM band
device), and after taking an inital read through the manual for tips on the
PHY, I picked out a few interesting things. First is that the base station ID
was limited to 0-999, which is weird because it means the limiting factor is
likely the base-10 display on the base station, not the protocol we need
enough bits to store 999 at least 10 bits. Nothing else seemed to catch my
eye, so I figured may as well jump right to it.
Not being the type to mess with success, I did exactly the same thing as I did
in my christmas tree post, and took a capture at 433.92MHz
since it was in the middle of the band, and immediately got deja-vu. Not only
was the signal at 433.92MHz, but throwing the packet into inspectrum gave
me the identical plot of the OOK encoding scheme.
Not just similar identical. The only major difference was the baud rate and
bit structure of the packets, and the only minor difference was the existence
of what I think is a wakeup preamble packet (of all zeros), rather than a
preamble symbol that lasted longer than usual PHY symbol (which makes this
pager system a bit easier to work with than my tree, IMHO).
Getting down to work, I took some measurements to determine what the symbol
duration was over the course of a few packets, I was able to determine the
symbol rate was somewhere around 858 microseconds (0.000858 seconds per
symbol), which is a weird number, but maybe I m slightly off or there s some
larger math I m missing that makes this number satisfyingly round (internal
low cost crystal clock or something? I assume this is some hardware constrait
with the pager?)
Anyway, good enough. Moving along, let s try our hand at a demod let s just
assume it s all the same as the chrismas tree post and demod ones and zeros
the same way here. That gives us 26 bits:
00001101110000001010001000
Now, I know we need at least 10 bits for the base station ID, some number
of bits for the pager ID, and some bits for the command. This was a capture
of me hitting call from a base station ID of 55 to a pager with the ID of
10, so let s blindly look for 10 bit chunks with the numbers we re looking for:
0000110111 0000001010 001000
Jeez. First try. 10 bits for the base station ID (55 in binary is
0000110111), 10 bits for the pager ID (10 in binary is 0000001010), which
leaves us with 6 bits for a command (and maybe something else too?) which is
8 here. Great, cool, let s work off that being the case and revisit it if
we hit bugs.
Besides our data packet, there s also a preamble packet that I ll add in,
in case it s used for signal detection or wakeup or something which is
fairly easy to do since it s the same packet structure as the above, just
all zeros. Very kind of them to leave it with the same number of bits and
encoding scheme it s nice that it can live outside the PHY.
Once I got here, I wrote a quick and dirty modulator, and was able to ring up
pagers! Unmitigated success and good news only downside was that it took me
a single night, and not the multi-week adventure I was looking for. Well, let s
finish the job and document what we ve found for the sake of completeness.
Boxing everything up
My best guess on the packet structure is as follows:
base id
argument
command
For a call or F2 operation, the argument is the Pager s ID code,
but for other commands it s a value or an enum, depending. Here s a table
of my by-hand demodulation of all the packet types the base station
produces:
00001101110000001010001000
0000110111 0000001010 001000
base id
argument
command
call or F2 operation, the argument is the Pager s ID code,
but for other commands it s a value or an enum, depending. Here s a table
of my by-hand demodulation of all the packet types the base station
produces:
| Type | Cmd Id | Description |
| Call | 8 | Call the pager identified by the id in argument |
| Off | 60 | Request any pagers on the charger power off when power is removed, argument is all zero |
| F2 | 40 | Program a pager to the specified Pager ID (in argument) and base station |
| F3 | 44 | Set the reminder duration in seconds specified in argument |
| F4 | 48 | Set the pager's beep mode to the one in argument (0 is disabled, 1 is slow, 2 is medium, 3 is fast) |
| F5 | 52 | Set the pager's vibration mode to the one in argument (0 is disabled, 1 is enabled) |
A while back I wrote about some issues with converting
a two-disk RAID system to a one-disk system, but just to recap: