From 932c0479ee7c501bc224435943c73a368001845e Mon Sep 17 00:00:00 2001 From: JF Date: Sun, 5 Apr 2020 17:03:06 +0200 Subject: [PATCH] Add documentation about BLE connection and services. --- README.md | 6 +++++- doc/ble.md | 27 +++++++++++++++++++++++++++ doc/ble/ans_sequence.png | Bin 0 -> 36606 bytes doc/ble/ans_sequence.puml | 29 +++++++++++++++++++++++++++++ doc/ble/connection_sequence.png | Bin 0 -> 17958 bytes doc/ble/connection_sequence.puml | 14 ++++++++++++++ 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 doc/ble.md create mode 100644 doc/ble/ans_sequence.png create mode 100644 doc/ble/ans_sequence.puml create mode 100644 doc/ble/connection_sequence.png create mode 100644 doc/ble/connection_sequence.puml diff --git a/README.md b/README.md index 57b95aab..790e3de1 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,11 @@ I've tested this project on the actual PineTime hardware. * Rich user interface (using [LittleVGL](https://littlevgl.com/)) via display, touchpanel and push button. * Digital watch face and 4 demo applications (spinning meter, analog gauche, push button and message box); * Watchdog (automatic reset in case of firmware crash) and reset support (push and hold the button for 7 - 10s); - * BLE Notification support (still Work-In-Progress, companion app needed). + * BLE Notification support (still Work-In-Progress, [companion app](https://github.com/JF002/gobbledegook) needed). + +## Documentation + + * [BLE implementation and API](./doc/ble.md) ## Stub using NRF52-DK ![Pinetime stub](./images/pinetimestub1.jpg "PinetimeStub") diff --git a/doc/ble.md b/doc/ble.md new file mode 100644 index 00000000..0302b471 --- /dev/null +++ b/doc/ble.md @@ -0,0 +1,27 @@ +# Bluetooth Low-Energy : +## Introduction +This page describes the BLE implementation and API built in this firmware. + +**Note** : I'm a beginner in BLE related technologies and the information of this document reflect my current knowledge and understanding of the BLE stack. These informations might be erroneous or incomplete. Feel free to submit a PR if you think you can improve these. + +## BLE Connection +When starting the firmware start a BLE advertising : it send small messages that can be received by any *central* device in range. This allows the device to announce its presence to other devices. + +A companion application (running on a PC, RasberryPi, smartphone) which received this avertising packet can request a connection to the device. This connection procedure allows the 2 devices to negociate communication parameters, security keys,... + +When the connection is established, the pinetime will try to discover services running on the companion application. For now **CTS** (**C**urrent **T**ime **S**ervice) and **ANS** (**A**lert **N**otification **S**ervice) are supported. + +If **CTS** is detected, it'll request the current time to the companion application. If **ANS** is detected, it will listen to new notifications coming from the companion application. + +![BLE connection sequence diagram](ble/connection_sequence.png "BLE connection sequence diagram") + +## BLE services +[List of standard BLE services](https://www.bluetooth.com/specifications/gatt/services/) + +### CTS +[Current Time Service](https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Services/org.bluetooth.service.alert_notification.xml) + +### ANS +[Alert Notification Service](https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Services/org.bluetooth.service.current_time.xml) + +![ANS sequence diagram](./ble/ans_sequence.png "ANS sequence diagram") \ No newline at end of file diff --git a/doc/ble/ans_sequence.png b/doc/ble/ans_sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..99cf8493b20710bb79aa48452ac9614d36decb7c GIT binary patch literal 36606 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

k+T{K1dzX`qS_|(af;&}1 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 CompanionApp : Read request (Supported 'new' notification categories - 0x2A47) +CompanionApp --> Pinetime: Response (0xff = all categories) + +Pinetime -> CompanionApp : Read request (Supported 'unread' notification categories - 0x2A48) +CompanionApp --> Pinetime: Response (0xff = all categories) +end + +group Configure the server +Pinetime -> CompanionApp : Configure 'new' notifications categories : Accept all (Write [0, 0xFF] to Control Point - 0x2A44) +activate CompanionApp +deactivate CompanionApp +Pinetime -> CompanionApp : Configure 'unread' notifications categories : Accept all (Write [1, 0xFF] to Control Point - 0x2A44) +activate CompanionApp +deactivate CompanionApp +end + +group Server sends a notification +CompanionApp -> Pinetime : Notify new_alert (0x2A46) +activate Pinetime +note over Pinetime + Pinetime FW handles the + notification (display on UI) +end note +deactivate Pinetime +end + +@enduml \ No newline at end of file diff --git a/doc/ble/connection_sequence.png b/doc/ble/connection_sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8babcb2867cb845abd23fc9dd6bcc977229c43 GIT binary patch literal 17958 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 AH2?qr literal 0 HcmV?d00001 diff --git a/doc/ble/connection_sequence.puml b/doc/ble/connection_sequence.puml new file mode 100644 index 00000000..55531829 --- /dev/null +++ b/doc/ble/connection_sequence.puml @@ -0,0 +1,14 @@ +@startuml +Pinetime --> CompanionApp: Start advertising + +group BLE Connection +CompanionApp -> Pinetime: Connection request +CompanionApp <-> Pinetime: Connection parameters negociation, security procedure,... +end + +group Service Discovery +CompanionApp <-> Pinetime: Discover service 0x1805 (CTS) +CompanionApp <-> Pinetime: Discover service 0x1811 (ANS) +end + +@enduml \ No newline at end of file