您的位置:首页 > Web前端 > JavaScript

CC3200跟服务器的通信格式及解析json数据方法

2015-07-12 09:49 816 查看
阿汤哥

序:

能力有限,难免有错,有问题请联系我,

QQ1519256298hytga@163.com

Pdf下载http://pan.baidu.com/s/1hqiWB56

请采用邮件联系的方式:谢谢。

一、我们采用http+json的通信格式

二、创建设备的json语句

{

"id":"设备的mac",

"name":"测试",

"point":[

{

"id":”2”,

"name":"温度",

"type":"浮点型",

"unit":"C"

},

{

"id":“1”,

"name":"LED1",

"type":"开关型",

"unit":"none"

}

]

}

我觉得创建设备的时候需要有一个设备id,设备的名字,节点的id,节点的名字,节点的类型,节点的单位,应该就可以了

三、提交数据的json语句

{

"id":"设备的mac",

"point":[

{

"id":2,

"value":"12.2"

},

{

"id":1,

"value":"On"

}

]

}

我觉得提交设备的时候应该有设备的id,节点的编号,节点的值

四、获取数据

直接用get获取。参数就填上id=设备的mac,然后服务器返回一下的数据,服务器就直接更改value就好了。

{

"id":"设备的mac",

"point":[

{

"id":2,

"value":"?"

},

{

"id":1,

"value":"?"

}

]

}

五、cc3200合成json数据,采用cjson开源代码

这里的代码主要是合成创建设备时的代码,并发送到服务器。关于cjson怎么使用,你可以自行百度,使用cjson有点要注意的,就是要释放内存,我认为json有两种格式:一种是用于传输的字符串格式,一种是程序用的结构体格式,字符串就没必要说了吧??结构体格式就是程序自己内部的格式(就像是链表,数组等等),通常我们是先创建结构体格式,然后转换成字符串格式,结构体格式的释放采用cJSON_Delete这个函数,我的下面代码自己都忘记加这个函数了。。。字符串格式采用free函数,cjson的内存分配默认采用的是malloc和free,当然这个是可以改的。每次当我们用PrintUnformatted把结构体格式转成字符串格式,都需要用free把内存释放掉,不然会导致内存不够用。这是经验。具体的用法自己参照百度及头文件,一般应用就没问题了。

staticvoidvCreateDevice(void){ unsignedintip,temp=0; siIp_StrToInt("103.44.145.245",&ip); cJSON*root=cJSON_CreateObject(); cJSON_AddStringToObject(root,"id","cc3200Test"); cJSON_AddStringToObject(root,"name","cc3200Test"); cJSON*pointArr=cJSON_CreateArray(); cJSON*pointOne=cJSON_CreateObject(); cJSON_AddStringToObject(pointOne,"id","1"); cJSON_AddStringToObject(pointOne,"name","wendu"); cJSON_AddStringToObject(pointOne,"type","float"); cJSON_AddStringToObject(pointOne,"unit","C"); cJSON*pointTwo=cJSON_CreateObject(); cJSON_AddStringToObject(pointTwo,"id","2"); cJSON_AddStringToObject(pointTwo,"name","Led"); cJSON_AddStringToObject(pointTwo,"type","switch"); cJSON_AddStringToObject(pointTwo,"unit","none"); cJSON_AddItemToArray(pointArr,pointOne); cJSON_AddItemToArray(pointArr,pointTwo); cJSON_AddItemToObject(root,"point",pointArr); unsignedchar*text=NULL; text=cJSON_PrintUnformatted(root); if(text!=NULL){ //这个主要就是合成HTTP协议 //这个具体可以看g_cPostData snprintf(g_buffer,500,g_cCreatePostData,strlen(text),(unsignedchar*)text); UART_PRINT("\r\nSend:\r\n%s\r\n",g_buffer); //发送数据,参数:数据,,数据长度,ip,端口 vSendOneDataWithIpPort(g_buffer,strlen(g_buffer),ip,mainSMARTHARDWARE); free(text); } }
结果如下:




六、服务器解析json数据

我采用的是fastjson开源代码,这是阿里巴巴做的,号称速度最快,不管他有没有真的最快,现在能用就好了。
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setContentType("text/html");
PrintWriterout=response.getWriter();
System.out.println("设备发送了数据");
BufferedReaderreader=request.getReader();
Stringline=null;
Stringtext=null;
//先读一行数据,为什么需要先这样做?因为text的初始值是null,
//执行text+=line;后会导致text=“null”+line,所以需要先读一行
//这里可能会有bug存在,请注意
text=reader.readLine();
while((line=reader.readLine())!=null){

text+=line;

}
//按照下列方法可以解析我们的json,
System.out.println("text"+text);
//解析json的数据-》JSONObject
JSONObjectroot=JSON.parseObject(text);
//获取json里面的数据
Stringid=(String)root.get("id");
System.out.println("设备id:"+id);
Stringname=(String)root.get("name");
System.out.println("设备名称:"+name);
ObjectpointArr=root.get("point");
List<PointBean>pointList=JSON.parseArray(pointArr+"",PointBean.class);
for(PointBeanpoint:pointList){
System.out.println("节点id"+point.getId());
System.out.println("节点设备"+point.getDeviceId());
System.out.println("节点名称"+point.getName());
System.out.println("节点类型"+point.getType());
System.out.println("节点单位"+point.getUnit());

}

}



结果:完美解析


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: