Dawn Framework 1.0
Universal data acquisition framework for embedded systems
wakaama.hxx
1// dawn/include/dawn/proto/wakaama/wakaama.hxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#pragma once
7
8#include <atomic>
9#include <cstddef>
10#include <cstdint>
11#include <mutex>
12#include <string>
13#include <vector>
14
15#include "dawn/common/thread.hxx"
16#include "dawn/io/common.hxx"
17#include "dawn/porting/config.hxx"
18#include "dawn/proto/common.hxx"
19
20namespace dawn
21{
22namespace wakaama_internal
23{
24class ClientRuntime;
25class ObjectBinding;
26class Transport;
27}
28
34{
35 uint16_t objectId;
36 uint16_t instanceId;
37 uint16_t resourceId;
38 uint16_t access;
40};
41
50 : public CProtoCommon
51 , protected CThreadedObject
52{
53public:
54 enum
55 {
56 PROTO_WAKAAMA_ACCESS_READ = (1 << 0),
57 PROTO_WAKAAMA_ACCESS_WRITE = (1 << 1),
58 PROTO_WAKAAMA_ACCESS_EXECUTE = (1 << 2),
59 PROTO_WAKAAMA_ACCESS_RW = 3,
60 PROTO_WAKAAMA_ACCESS_RWE = 7,
61 };
62
63 static constexpr size_t RX_BUFFER_SIZE = 2048;
64 static constexpr size_t IO_CHUNK_CAP = RX_BUFFER_SIZE;
65
66 enum
67 {
68 WAKAAMA_OBJECT_DEVICE = 3,
69 WAKAAMA_OBJECT_CONNECTIVITY_MONITORING = 4,
70 WAKAAMA_OBJECT_FIRMWARE_UPDATE = 5,
71 WAKAAMA_OBJECT_SOFTWARE_MANAGEMENT = 9,
72 WAKAAMA_OBJECT_CELLULAR_CONNECTIVITY = 10,
73 WAKAAMA_OBJECT_BINARY_APP_DATA_CONTAINER = 19,
74 WAKAAMA_OBJECT_DIGITAL_INPUT = 3200,
75 WAKAAMA_OBJECT_DIGITAL_OUTPUT = 3201,
76 WAKAAMA_OBJECT_ANALOG_INPUT = 3202,
77 WAKAAMA_OBJECT_ANALOG_OUTPUT = 3203,
78 WAKAAMA_OBJECT_GENERIC_SENSOR = 3300,
79 WAKAAMA_OBJECT_ILLUMINANCE = 3301,
80 WAKAAMA_OBJECT_LIGHT = 3301,
81 WAKAAMA_OBJECT_TEMPERATURE = 3303,
82 WAKAAMA_OBJECT_HUMIDITY = 3304,
83 WAKAAMA_OBJECT_ACTUATION = 3306,
84 WAKAAMA_OBJECT_LIGHT_CONTROL = 3311,
85 WAKAAMA_OBJECT_ACCELEROMETER = 3313,
86 WAKAAMA_OBJECT_MAGNETOMETER = 3314,
87 WAKAAMA_OBJECT_BAROMETER = 3315,
88 WAKAAMA_OBJECT_VOLTAGE = 3316,
89 WAKAAMA_OBJECT_CURRENT = 3317,
90 WAKAAMA_OBJECT_PRESSURE = 3323,
91 WAKAAMA_OBJECT_GYROMETER = 3334,
92 };
93
94 enum
95 {
96 WAKAAMA_DEVICE_RESOURCE_MANUFACTURER = 0,
97 WAKAAMA_DEVICE_RESOURCE_MODEL_NUMBER = 1,
98 WAKAAMA_DEVICE_RESOURCE_SERIAL_NUMBER = 2,
99 WAKAAMA_DEVICE_RESOURCE_FIRMWARE_VERSION = 3,
100 WAKAAMA_DEVICE_RESOURCE_POWER_SOURCE_VOLTAGE = 7,
101 WAKAAMA_DEVICE_RESOURCE_BATTERY_LEVEL = 9,
102 WAKAAMA_DEVICE_RESOURCE_ERROR_CODE = 11,
103 WAKAAMA_DEVICE_RESOURCE_CURRENT_TIME = 13,
104 WAKAAMA_DEVICE_RESOURCE_BINDING_MODES = 16,
105 WAKAAMA_DEVICE_RESOURCE_BATTERY_STATUS = 20,
106 };
107
108 enum
109 {
110 WAKAAMA_RESOURCE_BINARY_APP_DATA = 0,
111 WAKAAMA_RESOURCE_BINARY_APP_DATA_PRIORITY = 1,
112 WAKAAMA_RESOURCE_BINARY_APP_DATA_CREATION_TIME = 2,
113 WAKAAMA_RESOURCE_BINARY_APP_DATA_DESCRIPTION = 3,
114 WAKAAMA_RESOURCE_BINARY_APP_DATA_FORMAT = 4,
115 WAKAAMA_RESOURCE_BINARY_APP_ID = 5,
116
117 WAKAAMA_RESOURCE_FIRMWARE_PACKAGE = 0,
118 WAKAAMA_RESOURCE_FIRMWARE_PACKAGE_URI = 1,
119 WAKAAMA_RESOURCE_FIRMWARE_UPDATE = 2,
120 WAKAAMA_RESOURCE_FIRMWARE_STATE = 3,
121 WAKAAMA_RESOURCE_FIRMWARE_UPDATE_RESULT = 5,
122 WAKAAMA_RESOURCE_FIRMWARE_PACKAGE_NAME = 6,
123 WAKAAMA_RESOURCE_FIRMWARE_PACKAGE_VERSION = 7,
124 WAKAAMA_RESOURCE_FIRMWARE_PROTOCOL_SUPPORT = 8,
125 WAKAAMA_RESOURCE_FIRMWARE_DELIVERY_METHOD = 9,
126 WAKAAMA_RESOURCE_FIRMWARE_CANCEL = 10,
127
128 WAKAAMA_RESOURCE_SOFTWARE_PACKAGE_NAME = 0,
129 WAKAAMA_RESOURCE_SOFTWARE_PACKAGE_VERSION = 1,
130 WAKAAMA_RESOURCE_SOFTWARE_PACKAGE = 2,
131 WAKAAMA_RESOURCE_SOFTWARE_PACKAGE_URI = 3,
132 WAKAAMA_RESOURCE_SOFTWARE_INSTALL = 4,
133 WAKAAMA_RESOURCE_SOFTWARE_UNINSTALL = 6,
134 WAKAAMA_RESOURCE_SOFTWARE_UPDATE_STATE = 7,
135 WAKAAMA_RESOURCE_SOFTWARE_UPDATE_RESULT = 9,
136 WAKAAMA_RESOURCE_SOFTWARE_ACTIVATE = 10,
137 WAKAAMA_RESOURCE_SOFTWARE_DEACTIVATE = 11,
138 WAKAAMA_RESOURCE_SOFTWARE_ACTIVATION_STATE = 12,
139
140 WAKAAMA_RESOURCE_DIGITAL_INPUT_STATE = 5500,
141 WAKAAMA_RESOURCE_DIGITAL_INPUT_COUNTER = 5501,
142 WAKAAMA_RESOURCE_DIGITAL_INPUT_POLARITY = 5502,
143 WAKAAMA_RESOURCE_DIGITAL_INPUT_DEBOUNCE = 5503,
144 WAKAAMA_RESOURCE_DIGITAL_INPUT_EDGE_SELECTION = 5504,
145 WAKAAMA_RESOURCE_DIGITAL_INPUT_COUNTER_RESET = 5505,
146 WAKAAMA_RESOURCE_DIGITAL_OUTPUT_STATE = 5550,
147 WAKAAMA_RESOURCE_DIGITAL_OUTPUT_POLARITY = 5551,
148 WAKAAMA_RESOURCE_ANALOG_INPUT_CURRENT_VALUE = 5600,
149 WAKAAMA_RESOURCE_ANALOG_OUTPUT_CURRENT_VALUE = 5650,
150 WAKAAMA_RESOURCE_SENSOR_VALUE = 5700,
151 WAKAAMA_RESOURCE_UNITS = 5701,
152 WAKAAMA_RESOURCE_SENSOR_UNITS = 5701,
153 WAKAAMA_RESOURCE_COLOUR = 5706,
154 WAKAAMA_RESOURCE_COLOR = 5706,
155 WAKAAMA_RESOURCE_APPLICATION_TYPE = 5750,
156 WAKAAMA_RESOURCE_SENSOR_TYPE = 5751,
157 WAKAAMA_RESOURCE_MIN_MEASURED_VALUE = 5601,
158 WAKAAMA_RESOURCE_MAX_MEASURED_VALUE = 5602,
159 WAKAAMA_RESOURCE_MIN_RANGE_VALUE = 5603,
160 WAKAAMA_RESOURCE_MAX_RANGE_VALUE = 5604,
161 WAKAAMA_RESOURCE_RESET_MIN_MAX_MEASURED_VALUES = 5605,
162 WAKAAMA_RESOURCE_X_VALUE = 5702,
163 WAKAAMA_RESOURCE_Y_VALUE = 5703,
164 WAKAAMA_RESOURCE_Z_VALUE = 5704,
165 WAKAAMA_RESOURCE_TIMESTAMP = 5518,
166 WAKAAMA_RESOURCE_ON_OFF = 5850,
167 WAKAAMA_RESOURCE_DIMMER = 5851,
168 WAKAAMA_RESOURCE_ON_TIME = 5852,
169 };
170
171 enum
172 {
173 PROTO_WAKAAMA_CFG_FIRST = 0,
174 PROTO_WAKAAMA_CFG_ENDPOINT = 1,
175 PROTO_WAKAAMA_CFG_SERVER_HOST = 2,
176 PROTO_WAKAAMA_CFG_SERVER_PORT = 3,
177 PROTO_WAKAAMA_CFG_LOCAL_PORT = 4,
178 PROTO_WAKAAMA_CFG_LIFETIME = 5,
179 PROTO_WAKAAMA_CFG_IOBIND = 6,
180 PROTO_WAKAAMA_CFG_DEVICE_MANUFACTURER = 7,
181 PROTO_WAKAAMA_CFG_DEVICE_MODEL_NUMBER = 8,
182 PROTO_WAKAAMA_CFG_DEVICE_SERIAL_NUMBER = 9,
183 PROTO_WAKAAMA_CFG_DEVICE_FIRMWARE_VERSION = 10,
184 PROTO_WAKAAMA_CFG_SERVER = 11,
185 PROTO_WAKAAMA_CFG_DEVICE_BATTERY_VOLTAGE = 12,
186 PROTO_WAKAAMA_CFG_DEVICE_BATTERY_LEVEL = 13,
187 PROTO_WAKAAMA_CFG_DEVICE_BATTERY_STATUS = 14,
188 PROTO_WAKAAMA_CFG_QUEUE_MODE = 15,
189 PROTO_WAKAAMA_CFG_LAST = 31
190 };
191
192 enum
193 {
194 WAKAAMA_SERVER_SCHEME_COAP = 0,
195 WAKAAMA_SERVER_SCHEME_COAPS = 1,
196 };
197
198 explicit CProtoWakaama(CDescObject &desc);
199 ~CProtoWakaama() override;
200
201#ifdef CONFIG_DAWN_OBJECT_HAS_NAME
202 const char *getClassNameStr() const override
203 {
204 return "wakaama";
205 }
206#endif
207
208 int configure() override;
209 int init() override;
210 int deinit() override;
211 int doStart() override;
212 int doStop() override;
213 bool hasThread() const override;
214
215 const char *deviceManufacturer() const
216 {
217 return manufacturer.c_str();
218 }
219
220 const char *deviceModelNumber() const
221 {
222 return modelNumber.c_str();
223 }
224
225 const char *deviceSerialNumber() const
226 {
227 return serialNumber.c_str();
228 }
229
230 const char *deviceFirmwareVersion() const
231 {
232 return firmwareVersion.c_str();
233 }
234
235 void regObject(SObjectId::ObjectId id)
236 {
237 this->setObjectMapItem(id, nullptr);
238 }
239
240 CIOCommon *getIOObject(SObjectId::ObjectId id)
241 {
242 return this->getIO(id);
243 }
244
248 {
249 SObjectId::ObjectId objid{0};
250 CIOCommon *io{nullptr};
251 io_ddata_t *data{nullptr};
252 };
253
256 void setDeviceBatteryBind(uint16_t resourceId, SObjectId::ObjectId objid);
257
260 SDeviceIoBind *deviceBatteryBind(uint16_t resourceId);
261
262#ifdef CONFIG_DAWN_IO_NOTIFY
263 void queueResourceChanged(uint16_t objectId, uint16_t instanceId, uint16_t resourceId);
264#endif
265
266 constexpr static SObjectId::ObjectId objectId(uint16_t id)
267 {
268 return SObjectId::objectId(
270 }
271
272 constexpr static SObjectCfg::ObjectCfgId cfgId(bool rw, uint8_t dtype, uint8_t size, uint8_t id)
273 {
276 }
277
278 constexpr static SObjectCfg::ObjectCfgId cfgIdEndpoint(uint16_t size)
279 {
280 return cfgId(false, SObjectId::DTYPE_CHAR, size, PROTO_WAKAAMA_CFG_ENDPOINT);
281 }
282
283 constexpr static SObjectCfg::ObjectCfgId cfgIdServerHost(uint16_t size)
284 {
285 return cfgId(false, SObjectId::DTYPE_CHAR, size, PROTO_WAKAAMA_CFG_SERVER_HOST);
286 }
287
288 constexpr static SObjectCfg::ObjectCfgId cfgIdServerPort()
289 {
290 return cfgId(false, SObjectId::DTYPE_UINT16, 1, PROTO_WAKAAMA_CFG_SERVER_PORT);
291 }
292
293 constexpr static SObjectCfg::ObjectCfgId cfgIdLocalPort()
294 {
295 return cfgId(false, SObjectId::DTYPE_UINT16, 1, PROTO_WAKAAMA_CFG_LOCAL_PORT);
296 }
297
298 constexpr static SObjectCfg::ObjectCfgId cfgIdLifetime()
299 {
300 return cfgId(false, SObjectId::DTYPE_UINT32, 1, PROTO_WAKAAMA_CFG_LIFETIME);
301 }
302
303 constexpr static SObjectCfg::ObjectCfgId cfgIdQueueMode()
304 {
305 return cfgId(false, SObjectId::DTYPE_UINT16, 1, PROTO_WAKAAMA_CFG_QUEUE_MODE);
306 }
307
308 constexpr static SObjectCfg::ObjectCfgId cfgIdIOBind(uint16_t size)
309 {
310 return cfgId(false, SObjectId::DTYPE_ANY, size, PROTO_WAKAAMA_CFG_IOBIND);
311 }
312
313 constexpr static SObjectCfg::ObjectCfgId cfgIdDeviceManufacturer(uint16_t size)
314 {
315 return cfgId(false, SObjectId::DTYPE_CHAR, size, PROTO_WAKAAMA_CFG_DEVICE_MANUFACTURER);
316 }
317
318 constexpr static SObjectCfg::ObjectCfgId cfgIdDeviceModelNumber(uint16_t size)
319 {
320 return cfgId(false, SObjectId::DTYPE_CHAR, size, PROTO_WAKAAMA_CFG_DEVICE_MODEL_NUMBER);
321 }
322
323 constexpr static SObjectCfg::ObjectCfgId cfgIdDeviceSerialNumber(uint16_t size)
324 {
325 return cfgId(false, SObjectId::DTYPE_CHAR, size, PROTO_WAKAAMA_CFG_DEVICE_SERIAL_NUMBER);
326 }
327
328 constexpr static SObjectCfg::ObjectCfgId cfgIdDeviceFirmwareVersion(uint16_t size)
329 {
330 return cfgId(false, SObjectId::DTYPE_CHAR, size, PROTO_WAKAAMA_CFG_DEVICE_FIRMWARE_VERSION);
331 }
332
333 constexpr static SObjectCfg::ObjectCfgId cfgIdServer(uint16_t size)
334 {
335 return cfgId(false, SObjectId::DTYPE_ANY, size, PROTO_WAKAAMA_CFG_SERVER);
336 }
337
338 /* Device object (3) battery resources backed by descriptor IOs. The value is
339 * one IO object-id word, mirroring nimble's services.bas.battery_level bind.
340 */
341
342 constexpr static SObjectCfg::ObjectCfgId cfgIdDeviceBatteryVoltage()
343 {
344 return cfgId(false, SObjectId::DTYPE_ANY, 1, PROTO_WAKAAMA_CFG_DEVICE_BATTERY_VOLTAGE);
345 }
346
347 constexpr static SObjectCfg::ObjectCfgId cfgIdDeviceBatteryLevel()
348 {
349 return cfgId(false, SObjectId::DTYPE_ANY, 1, PROTO_WAKAAMA_CFG_DEVICE_BATTERY_LEVEL);
350 }
351
352 constexpr static SObjectCfg::ObjectCfgId cfgIdDeviceBatteryStatus()
353 {
354 return cfgId(false, SObjectId::DTYPE_ANY, 1, PROTO_WAKAAMA_CFG_DEVICE_BATTERY_STATUS);
355 }
356
357private:
358 friend class wakaama_internal::ClientRuntime;
359 friend class wakaama_internal::ObjectBinding;
360 friend class wakaama_internal::Transport;
361
362 struct ServerConfig
363 {
364 std::string host;
365 std::string pskIdentity;
366 std::vector<uint8_t> pskKey;
367 uint16_t port;
368 uint32_t lifetime;
369 uint16_t shortServerId;
370 uint16_t securityInstanceId;
371 uint16_t serverInstanceId;
372 uint32_t holdoff;
373 uint32_t bootstrapTimeout;
374 uint8_t scheme;
375 uint8_t securityMode;
376 uint8_t binding;
377 bool bootstrap;
378 };
379
380#ifdef CONFIG_DAWN_IO_NOTIFY
381 struct ChangedResource
382 {
383 uint16_t objectId;
384 uint16_t instanceId;
385 uint16_t resourceId;
386 };
387#endif
388
389 wakaama_internal::ClientRuntime *runtime;
390 wakaama_internal::Transport *transport;
391 std::vector<wakaama_internal::ObjectBinding *> objects;
392 SDeviceIoBind devBattVoltage;
393 SDeviceIoBind devBattLevel;
394 SDeviceIoBind devBattStatus;
395 std::string endpoint;
396 std::string serverHost;
397 std::string manufacturer;
398 std::string modelNumber;
399 std::string serialNumber;
400 std::string firmwareVersion;
401 uint16_t serverPort;
402 uint16_t localPort;
403 uint32_t lifetime;
404 uint16_t shortServerId;
405 bool queueMode;
406 std::vector<ServerConfig> servers;
407#ifdef CONFIG_DAWN_IO_NOTIFY
408 std::mutex changedResourcesMutex;
409 std::vector<ChangedResource> changedResources;
410 size_t changedResourcesCapacity;
411 std::atomic_bool acceptChangedResources;
412#endif
413
414 int configureDesc(const CDescObject &desc);
415 int configureServer(const SObjectCfg::SObjectCfgItem *item);
416 void addDefaultServer();
417 int buildObjects();
418 void destroyObjects();
419 int initConnectionPool();
420 int initDtls();
421 void destroyDtls();
422 int openSocket();
423 void closeAllConnections();
424 void destroyConnectionPool();
425 void thread();
426 size_t serverPoolCapacity() const;
427 std::string serverUri(const ServerConfig &server) const;
428 const ServerConfig *findServer(uint16_t securityInstanceId) const;
429#ifdef CONFIG_DAWN_IO_NOTIFY
430 void processChangedResources();
431#endif
432};
433
434} // Namespace dawn
CIOCommon * getIO(SObjectId::ObjectId id)
Get an I/O object by ID.
Definition bindable.cxx:41
void setObjectMapItem(SObjectId::ObjectId id, CObject *obj)
Set an item in the object map.
Definition bindable.cxx:23
Descriptor wrapper for individual object configuration.
Base class for all I/O objects.
Definition common.hxx:27
Base class for all protocol implementations.
Definition common.hxx:23
@ PROTO_CLASS_WAKAAMA
LwM2M protocol using Eclipse Wakaama.
Definition common.hxx:87
Wakaama LwM2M client protocol implementation.
Definition wakaama.hxx:52
void setDeviceBatteryBind(uint16_t resourceId, SObjectId::ObjectId objid)
Record a battery IO binding for a Device resource (7/9/20).
Definition wakaama.cxx:464
int doStop()
Stop implementation hook.
Definition wakaama.cxx:599
int deinit()
De-initialize object.
Definition wakaama.cxx:569
int doStart()
Start implementation hook.
Definition wakaama.cxx:578
int init()
One-time initialize object after bindings are resolved.
Definition wakaama.cxx:511
SDeviceIoBind * deviceBatteryBind(uint16_t resourceId)
Return the battery binding for a Device resource id, or nullptr.
Definition wakaama.cxx:449
int configure()
Configure object from descriptor data.
Definition wakaama.cxx:213
bool hasThread() const
Check if a background thread is active.
Definition wakaama.cxx:606
Portable thread owner abstraction for Dawn components.
Definition thread.hxx:32
static ObjectCfgId objectCfg(uint8_t type, uint16_t cls, uint8_t dtype, bool rw, uint16_t size, uint8_t id)
Construct 32-bit ConfigID from component fields.
uint32_t ObjectCfgId
ConfigID type - single 32-bit value.
Definition objectcfg.hxx:60
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13
Device-object resource backed by a descriptor IO.
Definition wakaama.hxx:248
@ OBJTYPE_PROTO
Protocol object type.
Definition objectid.hxx:193
@ DTYPE_ANY
Wildcard data type (matches any actual type).
Definition objectid.hxx:68
@ DTYPE_UINT16
Unsigned 16-bit integer (0 to 65535).
Definition objectid.hxx:88
@ DTYPE_CHAR
Character/string type (null-terminated, 4-byte aligned).
Definition objectid.hxx:144
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
Definition objectid.hxx:96
uint32_t ObjectId
ObjectID type - single 32-bit value.
Definition objectid.hxx:44
static ObjectId objectId(uint8_t type, uint16_t cls, uint8_t dtype, uint8_t flags, uint16_t priv)
Construct 32-bit ObjectID from component fields.
Definition objectid.hxx:290
Descriptor binding for one LwM2M resource.
Definition wakaama.hxx:34
Heap-allocated dynamic I/O data buffer.
Definition ddata.hxx:21