"Hacking" a Bluetooth dartboard

From the date on I created Dutch Darts Revelation, which is more then 20 years ago, I always had the wish to connect it to a real dartboard. With the availability of some relatively cheap electronic bluetooth dartboards, it was time to see if this wish could come true. Last month i bought a Smartness Arcadia 4.0 dartboard and started my journey to "hack" the bluetooth protocol. 

Smartness Arcadia 4.0

Somehow when doing things for fun, i always grab visual studio and some Microsoft examples to get started. For this task, without any bluetooth knowledge, i downloaded the Bluetooth LE example solution to see how it works from here https://docs.microsoft.com/en-us/samples/microsoft/windows-universal-samples/bluetoothle/ It proved to be a good start for trying out something like this.

I just started the example and in the first step the app looks for nearby bluetooth devices. A device called "Smartness1" looked like a good candidate.

Then with Bluetooth LE you ask the device for available services and for every service you can ask for available characteristics of the service. See that as some kind of sub-services.

The Smartness1 has 7 Services, i choose the SimpleKeyService as most promising looking candidate.

The SimpleKeyService has one characteristic (subservice) and that is the SimpleKeyState.  I choose to subscribe to value changes for that characteristic.

So now the app is waiting for some kind of input from the board and the moment is there to see if anything happens when you press a number on the board. To do that put a breakpoint in the Scenario2_Client.xaml.cs in the  FormatValueByPresentation(IBuffer buffer, GattPresentationFormat format) method on the if (data!=null) line. If anything comes in this way the breakpoint should be hit.

Then i pressed the 16 on the board.....and yes!!!!! We got an incoming byte..also with value 16...this is too easy 😊 


When pressing other parts of the board it seems the board gives a different number for every part of the board that is pressed. The upper part of the singles are from 0-20 then the lower part of the singles have 20-40. The doubles have 40-60 and the triples have 60-80. Then for the bull 81, double bull 82 and the next button 101. Here is some code which might explain better how i quickly decoded the byte value into something meaningful:

 

     switch (data[0])
                {
                    case 82: return data[0]+" Double Bull";
                    case 81: return data[0] + " Single Bull";
                    case 101: return data[0] + " Next";
                    default:
                        if (data[0] <= 20)
                        {
                            return data[0] + " Single (Upper)" + data[0];
                        }
                        else if (data[0] <= 40 && data[0] > 20)
                        {
                            return data[0] + " Single (Lower)" + (data[0]-20);
                        }
                        else if(data[0]<=60 && data[0] > 40)
                        {
                            return data[0] + " Double " + (data[0] - 40);
                        }
                        else if (data[0] <= 80 && data[0] > 60)
                        {
                            return data[0] + " Triple " + (data[0] - 60);
                        }
                        else
                        {
                            return "Unknown "+data[0];
                        }
                        break;
                }

So voila, there you have it. The idea is to create a game/trainer in the line of "Dutch Darts Revelation", that runs on windows, and can connect to multiple electronic dartboards. Ofcourse every board will have its own protocol but we'll see. I'll give some more info screens and videos of the app development and its features in a later post. 

Hope you like this one! KCFLIWSD !

Regards,

GMR