Skip to content

Commit b5e70ed

Browse files
committed
Add support for multi value properties
1 parent 6ff416b commit b5e70ed

File tree

2 files changed

+109
-1
lines changed

2 files changed

+109
-1
lines changed

src/index.js

+81-1
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,44 @@ const sendProperty = (thingId, name, value, timestamp) => {
404404
throw new Error('Name must be a valid string');
405405
}
406406

407+
if (typeof value === 'object') {
408+
const objectKeys = Object.keys(value);
409+
const cborValues = objectKeys.map((key, i) => {
410+
const cborValue = {
411+
n: `${name}:${key}`,
412+
};
413+
414+
if (i === 0) {
415+
cborValue.bt = timestamp || new Date().getTime();
416+
}
417+
418+
switch (typeof value[key]) {
419+
case 'string':
420+
cborValue.vs = value[key];
421+
break;
422+
case 'number':
423+
cborValue.v = value[key];
424+
break;
425+
case 'boolean':
426+
cborValue.vb = value[key];
427+
break;
428+
default:
429+
break;
430+
}
431+
432+
return cborValue;
433+
})
434+
.map((cborValue) => {
435+
if (connectionOptions.useCloudProtocolV2) {
436+
return toCloudProtocolV2(cborValue);
437+
}
438+
439+
return cborValue;
440+
});
441+
442+
return sendMessage(propertyInputTopic, CBOR.encode(cborValues, true));
443+
}
444+
407445
let cborValue = {
408446
bt: timestamp || new Date().getTime(),
409447
n: name,
@@ -439,6 +477,49 @@ const getSenml = (deviceId, name, value, timestamp) => {
439477
throw new Error('Name must be a valid string');
440478
}
441479

480+
481+
if (typeof value === 'object') {
482+
const objectKeys = Object.keys(value);
483+
const senMls = objectKeys.map((key, i) => {
484+
const senMl = {
485+
n: `${name}:${key}`,
486+
};
487+
488+
if (i === 0) {
489+
senMl.bt = timestamp || new Date().getTime();
490+
491+
if (deviceId) {
492+
senMl.bn = `urn:uuid:${deviceId}`;
493+
}
494+
}
495+
496+
switch (typeof value[key]) {
497+
case 'string':
498+
senMl.vs = value[key];
499+
break;
500+
case 'number':
501+
senMl.v = value[key];
502+
break;
503+
case 'boolean':
504+
senMl.vb = value[key];
505+
break;
506+
default:
507+
break;
508+
}
509+
510+
return senMl;
511+
})
512+
.map((senMl) => {
513+
if (connectionOptions.useCloudProtocolV2) {
514+
return toCloudProtocolV2(senMl);
515+
}
516+
517+
return senMl;
518+
});
519+
520+
return senMls;
521+
}
522+
442523
const senMl = {
443524
bt: timestamp || new Date().getTime(),
444525
n: name,
@@ -462,7 +543,6 @@ const getSenml = (deviceId, name, value, timestamp) => {
462543
break;
463544
}
464545

465-
466546
if (connectionOptions.useCloudProtocolV2) {
467547
return toCloudProtocolV2(senMl);
468548
}

test/cbor.test.js

+28
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,34 @@ describe('Test CBOR encoding using CloudProtocol v1', () => {
187187
expect(cborHex).toStrictEqual(output);
188188
});
189189

190+
it('Generate a valid cbor for a senml complex property with basename', () => {
191+
const output = '0x81,0x82,0xA4,0x61,0x6E,0x6D,0x74,0x65,0x73,0x74,0x5F,0x62,0x6F,0x6F,0x6C,0x3A,0x6C,0x61,0x74,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x62,0x62,0x6E,0x78,0x2D,0x75,0x72,0x6E,0x3A,0x75,0x75,0x69,0x64,0x3A,0x31,0x66,0x34,0x63,0x65,0x64,0x37,0x30,0x2D,0x35,0x33,0x61,0x64,0x2D,0x34,0x62,0x32,0x39,0x2D,0x62,0x32,0x32,0x31,0x2D,0x31,0x62,0x30,0x61,0x62,0x62,0x64,0x66,0x63,0x37,0x35,0x37,0x61,0x76,0xFB,0x40,0x4E,0x0A,0x32,0xA0,0x66,0x3C,0x75,0xA2,0x61,0x6E,0x6D,0x74,0x65,0x73,0x74,0x5F,0x62,0x6F,0x6F,0x6C,0x3A,0x6C,0x6F,0x6E,0x61,0x76,0xFB,0x40,0x38,0x4E,0x68,0x5D,0xB7,0x6B,0x3C,';
192+
const senMl = ArduinoCloud.getSenml(deviceId, 'test_bool', {
193+
lat: 60.07967,
194+
lon: 24.30628,
195+
}, timestamp, false);
196+
console.log([senMl]);
197+
const cborbase64 = ArduinoCloud.getCborValue([senMl], false);
198+
console.log(cborbase64);
199+
const cborHex = base64toHEX(cborbase64);
200+
console.log(cborHex);
201+
expect(cborHex).toStrictEqual(output);
202+
});
203+
204+
it('Generate a valid cbor for a senml complex property without basename', () => {
205+
const output = '0x81,0x82,0xA3,0x61,0x6E,0x6D,0x74,0x65,0x73,0x74,0x5F,0x62,0x6F,0x6F,0x6C,0x3A,0x6C,0x61,0x74,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x61,0x76,0xFB,0x40,0x4E,0x0A,0x32,0xA0,0x66,0x3C,0x75,0xA2,0x61,0x6E,0x6D,0x74,0x65,0x73,0x74,0x5F,0x62,0x6F,0x6F,0x6C,0x3A,0x6C,0x6F,0x6E,0x61,0x76,0xFB,0x40,0x38,0x4E,0x68,0x5D,0xB7,0x6B,0x3C,';
206+
const senMl = ArduinoCloud.getSenml(null, 'test_bool', {
207+
lat: 60.07967,
208+
lon: 24.30628,
209+
}, timestamp, false);
210+
console.log([senMl]);
211+
const cborbase64 = ArduinoCloud.getCborValue([senMl], false);
212+
console.log(cborbase64);
213+
const cborHex = base64toHEX(cborbase64);
214+
console.log(cborHex);
215+
expect(cborHex).toStrictEqual(output);
216+
});
217+
190218

191219
it('Generate a valid cbor for multiple properties with basename', () => {
192220
const output = '0x86,0xA4,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x61,0x6E,0x69,0x74,0x65,0x73,0x74,0x5F,0x75,0x69,0x6E,0x74,0x62,0x62,0x6E,0x78,0x2D,0x75,0x72,0x6E,0x3A,0x75,0x75,0x69,0x64,0x3A,0x31,0x66,0x34,0x63,0x65,0x64,0x37,0x30,0x2D,0x35,0x33,0x61,0x64,0x2D,0x34,0x62,0x32,0x39,0x2D,0x62,0x32,0x32,0x31,0x2D,0x31,0x62,0x30,0x61,0x62,0x62,0x64,0x66,0x63,0x37,0x35,0x37,0x61,0x76,0x04,0xA4,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x61,0x6E,0x69,0x74,0x65,0x73,0x74,0x5F,0x73,0x69,0x6E,0x74,0x62,0x62,0x6E,0x78,0x2D,0x75,0x72,0x6E,0x3A,0x75,0x75,0x69,0x64,0x3A,0x31,0x66,0x34,0x63,0x65,0x64,0x37,0x30,0x2D,0x35,0x33,0x61,0x64,0x2D,0x34,0x62,0x32,0x39,0x2D,0x62,0x32,0x32,0x31,0x2D,0x31,0x62,0x30,0x61,0x62,0x62,0x64,0x66,0x63,0x37,0x35,0x37,0x61,0x76,0x23,0xA4,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x61,0x6E,0x6A,0x74,0x65,0x73,0x74,0x5F,0x66,0x6C,0x6F,0x61,0x74,0x62,0x62,0x6E,0x78,0x2D,0x75,0x72,0x6E,0x3A,0x75,0x75,0x69,0x64,0x3A,0x31,0x66,0x34,0x63,0x65,0x64,0x37,0x30,0x2D,0x35,0x33,0x61,0x64,0x2D,0x34,0x62,0x32,0x39,0x2D,0x62,0x32,0x32,0x31,0x2D,0x31,0x62,0x30,0x61,0x62,0x62,0x64,0x66,0x63,0x37,0x35,0x37,0x61,0x76,0xFB,0x40,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x61,0x6E,0x6B,0x74,0x65,0x73,0x74,0x5F,0x73,0x74,0x72,0x69,0x6E,0x67,0x62,0x62,0x6E,0x78,0x2D,0x75,0x72,0x6E,0x3A,0x75,0x75,0x69,0x64,0x3A,0x31,0x66,0x34,0x63,0x65,0x64,0x37,0x30,0x2D,0x35,0x33,0x61,0x64,0x2D,0x34,0x62,0x32,0x39,0x2D,0x62,0x32,0x32,0x31,0x2D,0x31,0x62,0x30,0x61,0x62,0x62,0x64,0x66,0x63,0x37,0x35,0x37,0x62,0x76,0x73,0x6A,0x74,0x65,0x73,0x74,0x20,0x76,0x61,0x6C,0x75,0x65,0xA4,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x61,0x6E,0x69,0x74,0x65,0x73,0x74,0x5F,0x62,0x6F,0x6F,0x6C,0x62,0x62,0x6E,0x78,0x2D,0x75,0x72,0x6E,0x3A,0x75,0x75,0x69,0x64,0x3A,0x31,0x66,0x34,0x63,0x65,0x64,0x37,0x30,0x2D,0x35,0x33,0x61,0x64,0x2D,0x34,0x62,0x32,0x39,0x2D,0x62,0x32,0x32,0x31,0x2D,0x31,0x62,0x30,0x61,0x62,0x62,0x64,0x66,0x63,0x37,0x35,0x37,0x62,0x76,0x62,0xF5,0xA4,0x62,0x62,0x74,0x1A,0x5B,0x98,0xD7,0x80,0x61,0x6E,0x6B,0x74,0x65,0x73,0x74,0x5F,0x64,0x6F,0x75,0x62,0x6C,0x65,0x62,0x62,0x6E,0x78,0x2D,0x75,0x72,0x6E,0x3A,0x75,0x75,0x69,0x64,0x3A,0x31,0x66,0x34,0x63,0x65,0x64,0x37,0x30,0x2D,0x35,0x33,0x61,0x64,0x2D,0x34,0x62,0x32,0x39,0x2D,0x62,0x32,0x32,0x31,0x2D,0x31,0x62,0x30,0x61,0x62,0x62,0x64,0x66,0x63,0x37,0x35,0x37,0x61,0x76,0xFB,0x7F,0xEF,0xFF,0xFC,0x57,0xCA,0x82,0xAE,';

0 commit comments

Comments
 (0)