【Mr.chen|开发日记Nov.10】语音交互智能物联网小车设计(7)
Mr.chen 发布于2017-12-13 15:56 浏览:969 回复:0
0
收藏

首先要明白,什么是json格式,json格式用在什么场合,为什么物联网设备层要对             json格式进行解析以及c语言库对json格式解析的原理。

      JSON,全称是JavaScript Object Notation。它是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换格式,主要用于跟服务器进行交换数据

JSON建构有两种结构:

  1. “名称/对的集合,可以理解为对象

2.值的有序列表,可以理解为数组。

 

表示名称 / 值对

  最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对"

  { "firstName": "Brett" } 

  表示 firstName=Brett 

  当将多个"名称 / 值对"串在一起时,创建包含多个"名称 / 值对" 记录,例如:

{ "firstName": "Brett", "lastName":"hah", "data": "15646" } 

 

 

表示数组

  当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。

  如果使用 JSON,就只需将多个带花括号的记录分组在一起:

  { "people": [ 

  { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, 

  { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"}, 

  { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } 

  ]} 

       简单了解下json结构,回归正题(如若想深入接触,请上网查阅官方资料),既然json主要用于和服务器进行数据交互,那么物联网设备必然要完成对发送数据进行json格式的封装,和接收到json数据对其进行解析的任务。

      我们首先来看下本次要解析的json数据。如下:

 

{"results":[{"location":{"id":"WW8P3NH2TPDT","name":"太原","country":"CN","path":"太原,太原,山西,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"小雨","code":"13","temperature":"21"},"last_update":"2017-08-19T01:00:00+08:00"}]}

这是在心知天气网获取的太原地区的实时气象资料,我们来看下麒麟v2.4例程是如何做EDP服务器下发命令解析的(中移的 web应用端下发的控制指令好像并不是json结构,但我们试着看看能否得到启发)

blob.png

可以看出在硬件收到平台命令后,会执行一次NET_DEVICE_GetIPD(0);函数   并把返回值赋值给dataPtr dataPtr明显是个char型指针。所以NET_DEVICE_GetIPD(0);函数是命令解析的核心,打开此函数:

                                             

blob.png

 函数开始定义了 char型数组sByte[],这个数组是用来存放C库解析出来的字符串数据的, *ptrIPD是一个数据指针,在调试时候可以通过打印这个指针内容来查看实际解析到的数据。  在源码467行,执行了一次搜索IPD 头的动作(因为8266接收到的数据 格式为+IPD,XX : XXXXXXXX ”  )首先在接收缓存区的字符串中寻找“IPD”字符 如果能找到 说明有正常接收的数据; 这里用C库的方式进行解析,主要用的是strstr()函数,它的头文件为   string.h

 函数原型strstr(str1,str2)

 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2str1中首次出现的地址;否则,返回NULL

                                             

blob.png

    找到IPD后 找“,”逗号和冒号“:”之间的XX就是接收到的数据长度(xx是字符型数据),将XX读取出来存入sByte【】数组中, 利用atoi函数 将字符转为数值形式,并赋值给byte,通过for循环(483行)将剩余数据(除去”+IPD,XX :”)重新写入缓存区Buf内,这时就去掉了8266 的“IPD”数据头.

blob.png

blob.png

模仿去 IPD头的方式,用C库进行 读取 name,text,code,temperature的值,存入自己定义的数组里面 (num是用来演示而定义的结构)

typedef struct

{

      

 

unsigned  char name[16];

unsigned       char code[16];

unsigned       char text[16];

unsigned       char temperature [8];

             

}NUM;


收藏
点赞
0
个赞
TOP