On Wednesday 15 July 2015 13:14:35 Keane, Erich wrote:
> Ive put together a BNF inspired document, attached to here!
> 
> You'll note that it is actually a bit wasteful, which is a result of
> trying to make it look as close to the JSON as possible without being
> overly-wasteful.  Even so, we are at 1/3 to 1/2 package size for the
> same data.

Thanks Erich, this is very good!

Some comments:

> PAYLOAD_REP_ITEM_VALUE  =   nullValue                                   Cbor
> NULL type: The value is a 'NULL' type as defined in the IoTivity
> specification> 
>                             | intValue                                  Cbor
>                             | Int type: The value is an integer doubleValue
>                             |                               Cbor Double
>                             | Type
>                             | booleanValue                              Cbor
>                             | Boolean Type
>                             | stringValue                               Cbor
>                             | String
>                             | PAYLOAD_REPRESENTATION                    A
>                             | child-representation
>                             | PAYLOAD_ARRAY                             An
>                             | array of values, contains a subset of these
>                             | values> 

> ARRAY_CONTENT_TYPE      =   OC_REP_PROP_INT (1)
> 
>                             | OC_REP_PROP_DOUBLE (2)
>                             | OC_REP_PROP_BOOL (3)
>                             | OC_REP_PROP_STRING (4)
>                             
>                             OC_REP_PROP_OBJECT (5)

I'd check if the (int64_t)value == value for the double case and encode as 
integer instead of double. That saves a lot on the receiver side.

Or, better yet, I'd make sure that we don't use floating point, at all. Drop 
support for doubles. Small devices with no FPU would have to carry a huge FP 
emulation library in order to interpret them properly.

> -- Dimensions list, a zero in a place means that the dimension is not used. 
> So a 1D 5 element array is 5,0,0, and a 2D 3x5 array is: 3,5,0

Instead of 0, you should use 1, which makes the size multiplication work 
without special casing. An 1D 5-element array is 5x1x1 = 5, whereas 5*0*0 = 0.

I also don't understand why we need 3 dimensions, no more. Or why this array 
has a fixed type (are you checking or coercing the type?). This array feature 
seems like a overdesigned for the needs of the protocol. Just allow 
PAYLOAD_ARRAY to contain PAYLOAD_REP_ITEM_VALUE [PAYLOAD_REP_ITEM_VALUE, ...].

> Many of the string-keys could easily be replaced by integers (making the
> maps INT->val rather than String->val), which would save a ton of space.

Agreed. String-variant maps should only be used when expansion is necessary 
and the map is type-constrained.

CBOR allows for heterogeneous keys, so I'd advise using integers for OIC-
standardised types, but still allowing strings for vendor-specific extensions

And here's a nifty trick. For example, for the following map entries:

   "pi"                                Cbor String (map tag)
         platformID                      Cbor String: Configured platform 
identifier
   "mnmn"                              Cbor String (map tag)
         ManufacturerName                Cbor String: Configured name of the 
manufacturer of the platform

Use instead
#define OIC_PLATFORM_PID                                        0x7069
#define OIC_PLATFORM_MANUFACTURER_NAME          0x6d6e6d6e

Before, the keys would be encoded
        62 70 69                                        string length 2 "pi"
        64 6d 6e 6d 6e                          string length 4 "mnmn"

Now they'd be encoded:
        19 70 69
        1a 6d 6e 6d 6e

Or with a macro:
#define ITVT_TO_NUM2(a, b)         ((a) << 8) | (b)
#define ITVT_TO_NUM4(a, b, c, d)   ((a) << 24) | ((b) << 16) | ((c) << 8) | (d)
#define OIC_PLATFORM_PID                                        
ITVT_TO_NUM2('p', 'i')
#define OIC_PLATFORM_MANUFACTURER_NAME          ITVT_TO_NUM4('m', 'n', 'm', 'n')


-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

Reply via email to