In the previous post I told about the 16 kbps data stream on FM broadcast frequencies, and my suspicion that it's being used by the bus and tram stop display system here in Helsinki. Now it's time to find out the truth.
I had the opportunity to observe a display stuck in the middle of its bootup sequence, displaying a version string. This revealed that the system is called IBus and it's made by the Swedish company Axentia. Sure enough, their website talks about DARC and how it requires no return channel, making it possible to use battery-powered displays in remote areas.
Not much else is said about the system, though; there are no specs for the proprietary protocol. So I implemented the five-layer DARC protocol stack in Perl and was left with a stream of fully error-corrected packets on top of Layer 5, separated into hundreds of subchannels. Some of these contained human-readable ISO-8859-1 strings with names of terminal stations. They seemed like an easy starting point for reverse engineering.
Here's one such packet after dissection:
Each display seems to store in its memory a list of buses that can be expected to pass the stop, along with their destinations in both official languages. The above "bus & destination packets" are used to update the memory. This is done once a day for each display on a narrow-band subchannel, so that updating all the displays takes the whole day. The mapping of the bus stop ID to actual bus stops is not straightforward, and had to be guessed from the lists of buses, on a case-by-case basis.
A different kind of packet updates the remaining waiting time for each bus in minutes. This "minutes packet" is sent three times per minute for every display in the system.
These packets may contain waiting times for several displays using the same subchannel; the "bus & destination packet" contains an address to the correct minutes slot. (The subchannel address is signaled on a lower protocol layer.) A special flag is used to signify an unused slot; another flag indicates that the bus has no working GPS and that the time is an approximation based on timetables. This causes a tilde "~" to appear before the minutes field. This means all calculation is done centrally and the displays only show numbers they hear on the radio.
There's also an announcement packet that's used to sent text messages to the displays. Often these will be about traffic disruptions and diverted routes. It's up to the displays to decide how to display the message; in the low-end battery-powered ones, the actual minutes function is (annoyingly) blanked for the duration of the slowly scrolling message.
I have yet to figure out the meaning of some packet types with non-changing data.
A special subchannel contains test packets with messages such as "Tämä on Mono-Axentia-testiä... Toimiiko tää ees..." and "Määritykset ja tiedotteet tehty vain Monolla - ei mitään IBus:lla" suggesting that they're planning to migrate from IBus to something called Mono. Interestingly, there's also a repeating test message in German – "Bus 61 nach Flughafen aus Haltestelle 1".
What good is it, you ask? Well, who wouldn't want a personal display repeater at home, telling when it's time to go?
 
![[Image: Photo of a liquid crystal display showing the text: 8589 IBUS 6.5.70d]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxM06NvCn-6lRmadmoMFcAWaqAavrEczgpsNUyaTOdyggRTKBZ02VA3WlsjrbEZCpeF0mv41i8SWRCeDbVTrmtpXB_bkhKf-u6MVRgvm2YlN0m2Q1gOGzvMpiNDLFEypPVXpops-wZwdd/s400/IMG_0541a.jpg)
![[Image: An infographic titled 'Bus & Destination Packet', showing the hex bytes of a 64-byte packet, divided into fields that are labeled according to their apparent purpose. There are counters, size fields, the bus stop identifier, bus line identifiers, and apparent references to other types of packets. Several fields containing Latin-1 text are also transcribed. The text in them reads '23N RUSKEASUO BRUNAKÄRR'.]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCvBNi49Nq5EFwmA6gAkOYbH07bMg5E6msCtUvwxmilZ-tj-sSZS6n8Wu8x2QUO0Iy2JY4JxUJaNuKHUuJGAMilZjjKaTxVdUbLiSzwMpYLDwx4rgbUIG6V-IsSZlGXEMmZeaTmLMBlLfp/s540/bus_dest_packet.png)
![[Image: An infographic titled 'Minutes Packet', showing another type of labeled packet. Most fields are one byte long and they contain the number of minutes until the next bus arrives, in 7 bits, and one bit telling whether this estimate is based on positioning or time tables. Information about which number belongs to which bus is contained in the references from other types of packets.]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBvGn07zM_WjPnJ3xMxBC5nqWxFzzazr7EZ_4WJUtUyEUTBAej0QaWDrZBTnav9z_IEfim9Agvfqu2C9TJGztJogAVRYDJBEJRpU22Fb-1ILjJTIaRzzFlpNQ8j9jnwRaxiKttXRljdm0L/s540/bus_min_packet.png)
![[Image: Photo of a small liquid crystal display kit with its PCB showing, obviously home-soldered to a bunch of wires, and displaying the text: '72 TAPANILA ~12'.]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3pZBIJ8IT_tPSlezjPW8g1z8DDJGNqexgODiPD4ZOeXUNMQ1AhRFyPuXFTzAOj8rFdq98Ks3MyOZ6gwrx8MdfDnXTJy8iokN2csJIJmCcOJ0I0kqX1Yw7yRyIMd1XreSoVAgwxEIS6jpW/s400/FScOI7G.jpg)
![[Image: A spectrogram showing a signal at the audible frequency range, labeled 'mono', and four carriers centered at 19, 38, 57, and 76 kHz, labeled pilot, 2f, 3f, and 4f, respectively. Pilot is a pure sinusoid; 2f and 3f are several kHz wide signals with mirrored sidebands; and 4f is 20 kHz wide and resembles wideband noise.]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi59H46xOh66oRU-x29wkkCwEQ-6if2ELMxo-a2ofHBE6Z1_kZRU4iYGDUD1j9435-Y00GZKsFZI6XhgBl8DG4i_sSjLVXh0s5FCfi8Ob2cM6y8AiajWeSI7tPbfm7Nqm_ltro3nZliKm7E/s540/darc.png)
![[Image: Three oscillograms followed by a stream of 1s and 0s. The first oscillogram is quite nondescript; the second one actually shows two waveforms, red and blue, in the same graph, with the red dominating in envelope power where blue is suppressed and vice versa. The third oscillograms shows a graph apparently following their envelope power difference, with sample points at regular intervals. The sign of this plot at sample points dictates whether a 0 or 1 is shown below that sample.]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi57Su6_LISIEe_8jUatXSGTZvtYa_9cb7yKvTzGwso8ymHmzwhgIPD4wkf8cwfFeP14mnS3H7ExkwoWf-0wUsMqxgtJAqGxbuhUUYgiUvL3k992I_JdW63tM31ONXk0kUlva3_kC_58xlc/s540/DARCb.png)
![[Image: Photo of a rugged LCD display mounted on a metal pole, displaying the text '55K FORSBY ~6' and stamped with the logo 'HSL HRT'.]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPqX6IrlRSG8OliEhfo6AW4ma7KL3jNu6GKt5JbDbHTGWhw6v9taZwWj4-HWXwdW69y3aUXnDArh668ChdtU52o4mSEjEUPzwVoVYJonPyIb-nGahkE9plqtnvA45Aa3PF3Cm6y-y5XJCx/s400/IMG_6102.jpg)