TinyCTS
Bluetooth Current Time Service client and server for Arduino
Loading...
Searching...
No Matches
TinyCTSClientNimBLE.h
Go to the documentation of this file.
1
6
7#pragma once
8#include <NimBLEDevice.h>
9
11
12namespace tiny_cts {
13
32class TinyCTSClient : public TinyCTSClientBase {
33 public:
39 explicit TinyCTSClient(const char* device = nullptr, uint32_t scanMs = 5000)
40 : _scanMs(scanMs) {
41 if (device != nullptr) _device = device;
42 }
43
49 bool begin() {
50 if (!NimBLEDevice::isInitialized()) NimBLEDevice::init("");
51 return update();
52 }
53
59 bool update() {
60 NimBLEClient* client = connect();
61 if (client == nullptr) return false;
62 bool ok = false;
63 NimBLERemoteService* service = client->getService(NimBLEUUID(CTS_SERVICE_UUID));
64 if (service != nullptr) {
65 readInfo(service);
66 NimBLERemoteCharacteristic* chr =
67 service->getCharacteristic(NimBLEUUID(CTS_CURRENT_TIME_UUID));
68 if (chr != nullptr && chr->canRead()) {
69 uint32_t t0 = TINY_CTS_MILLIS();
70 NimBLEAttValue v = chr->readValue();
71 uint32_t t1 = TINY_CTS_MILLIS();
72 ok = storeCurrentTime(v.data(), v.size(), t0, t1);
73 }
74 }
75 release(client);
76 return ok;
77 }
78
84 bool setTimeMs(uint64_t unixMs) override {
85 NimBLEClient* client = connect();
86 if (client == nullptr) return false;
87 bool ok = false;
88 NimBLERemoteService* service = client->getService(NimBLEUUID(CTS_SERVICE_UUID));
89 NimBLERemoteCharacteristic* chr =
90 service != nullptr ? service->getCharacteristic(NimBLEUUID(CTS_CURRENT_TIME_UUID))
91 : nullptr;
92 if (chr != nullptr && chr->canWrite()) {
93 uint8_t data[TinyCTSCurrentTime::Size];
94 ok = chr->writeValue(data, timeToWrite(unixMs, data), true);
95 }
96 release(client);
97 return ok;
98 }
99
100 protected:
101 NimBLEClient* connect() {
102 NimBLEScan* scan = NimBLEDevice::getScan();
103 scan->setActiveScan(true);
104 NimBLEScanResults results = scan->getResults(_scanMs, false);
105 const NimBLEAdvertisedDevice* found = nullptr;
106 for (int i = 0; i < results.getCount() && found == nullptr; i++) {
107 const NimBLEAdvertisedDevice* d = results.getDevice(i);
108 if (_device.empty()) {
109 if (d->isAdvertisingService(NimBLEUUID(CTS_SERVICE_UUID))) found = d;
110 } else if (isWanted(d->getAddress().toString(), d->getName())) {
111 found = d;
112 }
113 }
114 if (found == nullptr) return nullptr;
115 NimBLEClient* client = NimBLEDevice::createClient();
116 if (client == nullptr) return nullptr;
117 if (!client->connect(found)) {
118 NimBLEDevice::deleteClient(client);
119 return nullptr;
120 }
121 _name = found->getName();
122 _address = found->getAddress().toString();
123 return client;
124 }
125
127 static void release(NimBLEClient* client) {
128 client->disconnect();
129 NimBLEDevice::deleteClient(client);
130 }
131
132 void readInfo(NimBLERemoteService* service) {
133 NimBLERemoteCharacteristic* chr =
134 service->getCharacteristic(NimBLEUUID(CTS_LOCAL_TIME_INFO_UUID));
135 if (chr != nullptr && chr->canRead()) {
136 NimBLEAttValue v = chr->readValue();
137 storeLocalInfo(v.data(), v.size());
138 }
139 chr = service->getCharacteristic(NimBLEUUID(CTS_REFERENCE_TIME_INFO_UUID));
140 if (chr != nullptr && chr->canRead()) {
141 NimBLEAttValue v = chr->readValue();
142 storeReferenceInfo(v.data(), v.size());
143 }
144 }
145
146 uint32_t _scanMs;
147};
148
149} // namespace tiny_cts
The logic of the Current Time Service client, independent of the Bluetooth stack: decoding of the cha...
constexpr uint16_t CTS_CURRENT_TIME_UUID
16 bit UUID of the Current Time characteristic (read, notify, write)
Definition TinyCTSTypes.h:19
constexpr uint16_t CTS_SERVICE_UUID
16 bit UUID of the Current Time Service
Definition TinyCTSTypes.h:17
constexpr uint16_t CTS_LOCAL_TIME_INFO_UUID
16 bit UUID of the Local Time Information characteristic (read, write)
Definition TinyCTSTypes.h:21
The data of a TinyCTSClient. Use TinyCTSClient, which adds the Bluetooth part.
Definition TinyCTSClientBase.h:25
size_t timeToWrite(uint64_t unixMs, uint8_t *out) const
Definition TinyCTSClientBase.h:111
bool isWanted(const std::string &address, const std::string &name) const
Definition TinyCTSClientBase.h:117
bool storeCurrentTime(const uint8_t *data, size_t len, uint32_t startMs, uint32_t endMs)
Definition TinyCTSClientBase.h:91
Reads the time from a BLE device that offers the Current Time Service (a phone, a watch,...
Definition TinyCTSClientDesktop.h:30
static void release(NimBLEClient *client)
Definition TinyCTSClientNimBLE.h:127
bool begin()
Find the device and read the time. NimBLEDevice::init() is called, if the NimBLE stack is not initial...
Definition TinyCTSClientNimBLE.h:49
TinyCTSClient(const char *device=nullptr, uint32_t scanMs=5000)
Definition TinyCTSClientNimBLE.h:39
bool setTimeMs(uint64_t unixMs) override
Set the time of the device by writing the Current Time. It works if the device allows it (and the con...
Definition TinyCTSClientNimBLE.h:84
std::vector< TinyCTSScanEntry > scan(uint32_t timeoutMs)
List the devices that are in range.
Definition TinyCTSClientDesktop.h:126
bool update()
Read the time (and the other characteristics) again: the device is connected, read and disconnected.
Definition TinyCTSClientDesktop.h:58
static constexpr size_t Size
Size of the encoded characteristic.
Definition TinyCTSTypes.h:70