54 #define LOG_MODULE "lwm2m-json" 55 #define LOG_LEVEL LOG_LEVEL_NONE 72 lwm2m_json_next_token(lwm2m_context_t *ctx,
struct json_data *json)
74 int pos = ctx->inbuf->pos;
75 uint8_t type = T_NONE;
76 uint8_t vpos_start = 0;
86 while(pos < ctx->inbuf->size && cont) {
87 uint8_t c = ctx->inbuf->buffer[pos++];
89 case '{': type = T_OBJ;
break;
92 if(type == T_VAL || type == T_STRING) {
93 json->value = &ctx->inbuf->buffer[vpos_start];
94 json->value_len = vpos_end - vpos_start - wscount;
102 if(pos < ctx->inbuf->size) {
108 if(type == T_STRING_B) {
118 if(type == T_STRING) {
119 json->name = &ctx->inbuf->buffer[vpos_start];
120 json->name_len = vpos_end - vpos_start;
121 vpos_start = vpos_end = pos;
125 if(type != T_STRING_B) {
126 LOG_DBG(
"ERROR - illegal ':'\n");
134 if(type != T_STRING_B) {
135 if(vpos_start == pos - 1) {
146 if(cont == 0 && pos < ctx->inbuf->size) {
147 ctx->inbuf->pos = pos;
150 return cont == 0 && pos < ctx->inbuf->size;
154 init_write(lwm2m_context_t *ctx)
156 int len = snprintf((
char *)&ctx->outbuf->buffer[ctx->outbuf->len],
157 ctx->outbuf->size - ctx->outbuf->len,
"{\"bn\":\"/%u/%u/\",\"e\":[",
158 ctx->object_id, ctx->object_instance_id);
159 ctx->writer_flags = 0;
160 if((len < 0) || (len >= ctx->outbuf->size)) {
167 end_write(lwm2m_context_t *ctx)
169 int len = snprintf((
char *)&ctx->outbuf->buffer[ctx->outbuf->len],
170 ctx->outbuf->size - ctx->outbuf->len,
"]}");
171 if((len < 0) || (len >= ctx->outbuf->size - ctx->outbuf->len)) {
178 enter_sub(lwm2m_context_t *ctx)
181 LOG_DBG(
"Enter sub-resource rsc=%d\n", ctx->resource_id);
182 ctx->writer_flags |= WRITER_RESOURCE_INSTANCE;
187 exit_sub(lwm2m_context_t *ctx)
190 LOG_DBG(
"Exit sub-resource rsc=%d\n", ctx->resource_id);
191 ctx->writer_flags &= ~WRITER_RESOURCE_INSTANCE;
196 write_boolean(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
199 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
201 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
202 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"bv\":%s}", sep, ctx->resource_id, ctx->resource_instance_id, value ?
"true" :
"false");
204 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"bv\":%s}", sep, ctx->resource_id, value ?
"true" :
"false");
206 if((len < 0) || (len >= outlen)) {
209 LOG_DBG(
"JSON: Write bool:%s\n", outbuf);
211 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
216 write_int(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
219 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
221 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
222 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"v\":%"PRId32
"}", sep, ctx->resource_id, ctx->resource_instance_id, value);
224 len = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"v\":%"PRId32
"}", sep, ctx->resource_id, value);
226 if((len < 0) || (len >= outlen)) {
229 LOG_DBG(
"Write int:%s\n", outbuf);
231 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
236 write_float32fix(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
237 int32_t value,
int bits)
239 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
242 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
243 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"v\":", sep, ctx->resource_id, ctx->resource_instance_id);
245 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"v\":", sep, ctx->resource_id);
247 if(res <= 0 || res >= outlen) {
252 res = lwm2m_plain_text_write_float32fix(&outbuf[len], outlen, value, bits);
253 if((res <= 0) || (res >= outlen)) {
258 res = snprintf((
char *)&outbuf[len], outlen,
"}");
259 if((res <= 0) || (res >= outlen)) {
263 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
268 write_string(lwm2m_context_t *ctx, uint8_t *outbuf,
size_t outlen,
269 const char *value,
size_t stringlen)
271 char *sep = (ctx->writer_flags & WRITER_OUTPUT_VALUE) ?
"," :
"";
275 LOG_DBG(
"{\"n\":\"%u\",\"sv\":\"", ctx->resource_id);
276 if(ctx->writer_flags & WRITER_RESOURCE_INSTANCE) {
277 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u/%u\",\"sv\":\"", sep,
278 ctx->resource_id, ctx->resource_instance_id);
280 res = snprintf((
char *)outbuf, outlen,
"%s{\"n\":\"%u\",\"sv\":\"", sep,
283 if(res < 0 || res >= outlen) {
287 for (i = 0; i < stringlen && len < outlen; ++i) {
290 if(value[i] <
'\x20') {
291 LOG_DBG_(
"\\x%x", value[i]);
292 res = snprintf((
char *)&outbuf[len], outlen - len,
"\\x%x", value[i]);
293 if((res < 0) || (res >= (outlen - len))) {
298 }
else if(value[i] ==
'"' || value[i] ==
'\\') {
306 LOG_DBG_(
"%c", value[i]);
307 outbuf[len] = value[i];
314 res = snprintf((
char *)&outbuf[len], outlen - len,
"\"}");
315 if((res < 0) || (res >= (outlen - len))) {
319 LOG_DBG(
"JSON: Write string:%s\n", outbuf);
322 ctx->writer_flags |= WRITER_OUTPUT_VALUE;
326 const lwm2m_writer_t lwm2m_json_writer = {
Header file for the LWM2M object API
Header file for the Contiki OMA LWM2M plain text reader / writer
Header file for the Contiki OMA LWM2M JSON writer