54#define LOG_MODULE "lwm2m-json"
55#define LOG_LEVEL LOG_LEVEL_NONE
72lwm2m_json_next_token(lwm2m_context_t *ctx,
struct json_data *json)
74 int pos = ctx->inbuf->pos;
75 uint8_t type = T_NONE;
78 unsigned int vpos_start = 0;
79 unsigned int vpos_end = 0;
81 unsigned int wscount = 0;
90 while(pos < ctx->inbuf->size && cont) {
91 uint8_t c = ctx->inbuf->buffer[pos++];
93 case '{': type = T_OBJ;
break;
96 if(type == T_VAL || type == T_STRING) {
97 json->value = &ctx->inbuf->buffer[vpos_start];
100 json->value_len = (vpos_end > vpos_start + wscount) ?
101 (vpos_end - vpos_start - wscount) : 0;
109 if(pos < ctx->inbuf->size) {
115 if(type == T_STRING_B) {
125 if(type == T_STRING) {
126 json->name = &ctx->inbuf->buffer[vpos_start];
127 json->name_len = (vpos_end > vpos_start) ? (vpos_end - vpos_start) : 0;
128 vpos_start = vpos_end = pos;
132 if(type != T_STRING_B) {
133 LOG_DBG(
"ERROR - illegal ':'\n");
141 if(type != T_STRING_B) {
142 if(vpos_start == pos - 1) {
153 if(cont == 0 && pos < ctx->inbuf->size) {
154 ctx->inbuf->pos = pos;
157 return cont == 0 && pos < ctx->inbuf->size;
161init_write(lwm2m_context_t *ctx)
163 int len = snprintf((
char *)&ctx->outbuf->buffer[ctx->outbuf->len],
164 ctx->outbuf->size - ctx->outbuf->len,
"{\"bn\":\"/%u/%u/\",\"e\":[",
165 ctx->object_id, ctx->object_instance_id);
166 ctx->writer_flags = 0;
167 if((len < 0) || (len >= ctx->outbuf->size)) {
174end_write(lwm2m_context_t *ctx)
176 int len = snprintf((
char *)&ctx->outbuf->buffer[ctx->outbuf->len],
177 ctx->outbuf->size - ctx->outbuf->len,
"]}");
178 if((len < 0) || (len >= ctx->outbuf->size - ctx->outbuf->len)) {
185enter_sub(lwm2m_context_t *ctx)
188 LOG_DBG(
"Enter sub-resource rsc=%d\n", ctx->resource_id);
189 ctx->writer_flags |= WRITER_RESOURCE_INSTANCE;
194exit_sub(lwm2m_context_t *ctx)
197 LOG_DBG(
"Exit sub-resource rsc=%d\n", ctx->resource_id);
198 ctx->writer_flags &= ~WRITER_RESOURCE_INSTANCE;
203write_boolean(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
206 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
208 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
209 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"bv\":%s}", sep, ctx->resource_id, ctx->resource_instance_id,
value ?
"true" :
"false");
211 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"bv\":%s}", sep, ctx->resource_id,
value ?
"true" :
"false");
213 if((len < 0) || (len >= outlen)) {
216 LOG_DBG(
"JSON: Write bool:%s\n", outbuf);
218 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
223write_int(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
226 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
228 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
229 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"v\":%"PRId32
"}", sep, ctx->resource_id, ctx->resource_instance_id,
value);
231 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"v\":%"PRId32
"}", sep, ctx->resource_id,
value);
233 if((len < 0) || (len >= outlen)) {
236 LOG_DBG(
"Write int:%s\n", outbuf);
238 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
243write_float32fix(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
244 int32_t
value,
int bits)
246 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
249 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
250 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"v\":", sep, ctx->resource_id, ctx->resource_instance_id);
252 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"v\":", sep, ctx->resource_id);
254 if(res <= 0 || res >= outlen) {
259 res = lwm2m_plain_text_write_float32fix(&outbuf[len], outlen,
value, bits);
260 if((res <= 0) || (res >= outlen)) {
265 res = snprintf((
char *)&outbuf[len], outlen,
"}");
266 if((res <= 0) || (res >= outlen)) {
270 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
275write_string(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
276 const char *
value,
size_t stringlen)
278 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
282 LOG_DBG(
"{\"n\":\"%u\",\"sv\":\"", ctx->resource_id);
283 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
284 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"sv\":\"", sep,
285 ctx->resource_id, ctx->resource_instance_id);
287 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"sv\":\"", sep,
290 if(res < 0 || res >= outlen) {
294 for (i = 0; i < stringlen && len < outlen; ++i) {
297 if(
value[i] <
'\x20') {
298 LOG_DBG_(
"\\x%x",
value[i]);
299 res = snprintf((
char *)&outbuf[len], outlen - len,
"\\x%x",
value[i]);
300 if((res < 0) || (res >= (outlen - len))) {
305 }
else if(
value[i] ==
'"' ||
value[i] ==
'\\') {
313 LOG_DBG_(
"%c",
value[i]);
314 outbuf[len] =
value[i];
321 res = snprintf((
char *)&outbuf[len], outlen - len,
"\"}");
322 if((res < 0) || (res >= (outlen - len))) {
326 LOG_DBG(
"JSON: Write string:%s\n", outbuf);
329 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
333const lwm2m_writer_t lwm2m_json_writer = {
static int value(int type)
Header file for the Contiki OMA LWM2M JSON writer.
Header file for the LWM2M object API.
Header file for the Contiki OMA LWM2M plain text reader / writer.