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());
}
}
结果:完美解析
序:
能力有限,难免有错,有问题请联系我,
QQ1519256298
Pdf下载
请采用邮件联系的方式:谢谢。
一、我们采用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把内存释放掉,不然会导致内存不够用。这是经验。具体的用法自己参照百度及头文件,一般应用就没问题了。
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());
}
}
相关文章推荐
- kkpager仿淘宝js分页控件
- ubuntu下部署jsp开发环境
- JS中变量名作为if条件的真/假
- 最全面的JS表单验证
- js电话号码正则校验--座机和手机号
- Js间断/连续的文字滚动代码
- js实现完美身份证号有效性验证
- jS实现文本框在点击时变色
- JS动态构建一棵目录树
- JavaScript中需要注意的几个问题
- JavaScript模板引擎原理,几行代码的事儿
- [解惑]JavaScript事件机制
- 你所不知道的JavaScript数组
- 如何让你的JavaScript代码更加语义化
- js默认编码方式
- Javascript数据类型转换规则
- JS DOM编程艺术——图片库优化—— JS学习笔记2015-7-11(第82天)
- Introduction to Json
- js面向对象
- Javascript与Ajax