CC3200上传数据到服务器(实现一个简单的物联网系统-4)

Posted by Beyonderwei on 2018-05-02
Words 920 and Reading Time 3 Minutes
Viewed Times

一、序言

  上篇文章已经完成了从服务器 get 数据,这篇将通过 post 的方式,将通过CC3200测得的花卉状态信息(如土壤湿度、光照强度)上传到服务器。其实post的方式也实现了接收服务器返回的数据,所以只发送一个post请求就可以完成数据的上传和获取,具体在下面说明。

二、CC3200 连接到路由器(AP)

  这里已经在上篇文章说过了,具体可以参照:
  https://blog.csdn.net/CSDN_X_W/article/details/86756675

三、CC3200 post 数据到服务器

   同样是将后台代码和CC3200的相关配置一起列出来。
3.1 后台代码: 这里解析的数据是CC3200发送过来的花卉状态信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 处理CC3200 POST 给服务器的数据 ->更新花卉的状态信息
*/

@ResponseBody //用于接收CC3200 post 过来的数据
@PostMapping("/cc3200Post") //这个方法用来处理CC3200Post请求
public void CC3200PostResponse(@RequestBody String flower_info) throws JSONException {
/*--更新花卉的状态信息--*/
int monitorID;
float co2;
float temperature;
float humidity;
System.out.println(flower_info);
//1.解析post过来的数据
JSONObject jsonObject = new JSONObject(flower_info);
monitorID = jsonObject.getInt("monitorID");
co2 = (float) jsonObject.getDouble("co2");
temperature = (float) jsonObject.getDouble("temperature");
humidity = (float) jsonObject.getDouble("humidity");

//2.根据花卉监测系统ID更新数据库的数据
String updateSql =
"update flowers set co2 =" + "'" + co2 + "'" +","+
"temperature ="+"'" + temperature + "'" +","+
"humidity ="+"'" + humidity + "'" +
" WHERE monitor_id ="+ "'" + monitorID + "'";
jdbcTemplate.update(updateSql);
}

3.2 CC3200 代码:

  1. CC3200 的相关配置,在main.c 中 , IP 和端口配置不再赘述,参考上篇文章。
    1
    2
    3
    #define POST_REQUEST_URI  "/cc3200Post"         //请求方式 即发送什么样的请求
    /*--Post过去的数据--*/
    #define POST_DATA "{\n\"name\":\"xyz\",\n\"address\":\n{\n\"plot#\":12,\n\"street\":\"abc\",\n\"city\":\"ijk\"\n},\n\"age\":30\n}"
  2. 在 CC3200 中post数据的具体实现通过调用 static int HTTPPostMethod(HTTPCli_Handle httpClient) 函数中调用的 TTPCli_sendRequestBody(httpClient, POST_DATA , (sizeof(POST_DATA )-1)); 来实现的,这样运行后就能在后台接收到 POST_DATA 当中的数据。这样我们就已经实现了将数据 post 到服务器。

    四、疑问(重要)

      1.==需要思考这样一个问题== :我们 post 过去的数据是要有变量的,如温度(temperature),可是如何将这样一些变量拼接 JSON 形式的字符串当中去呢?早就有人帮我们写好了这样的库,即-> cJSON , 需要引入 cJSON 的 .c 和 .h 文件后可参考下面这样一段代码:
      2.定义 flowerStatusData 代替原来的 POST_DATA,则原来的 TTPCli_sendRequestBody函数的形参也要相应修改:
    1
    2
     char *outData;
    char flowerStatusData[63]={0}; //数组长度应该是 strlen 得到的字符串长度加一 这个值根据上传的数据量经调试打印得到
      3.具体post数据的部分可以参考如下代码,main.c 中:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /*--根据测得的数据信息,post数据到服务器,从而更新花卉的状态数据--*/
    //创建一个cJSON结构体指针并分配空间,然后赋值给root
    cJSON *root = cJSON_CreateObject();

    //在root结构体中创建一组健为"key",值为" value" 的键值对。
    cJSON_AddNumberToObject(root,"monitorID",monitor_id);
    cJSON_AddNumberToObject(root,"co2",co2);
    cJSON_AddNumberToObject(root,"temperature",temperature);
    cJSON_AddNumberToObject(root,"humidity",humidity);

    /*--得到无格式形式的json字符串,即输出无回车和空格分离的键值对--*/
    outData = cJSON_PrintUnformatted(root);

    strncpy(flowerStatusData, outData, strlen(outData));
    UART_PRINT("\n\r");
    UART_PRINT("HTTP Post Begin:\n\r");
    lRetVal = HTTPPostMethod(&httpClient);
    if(lRetVal < 0)
    {
    UART_PRINT("HTTP Post failed.\n\r");
    }
    UART_PRINT("HTTP Post End:\n\r");
    free(outData);//释放malloc分配的空间
    cJSON_Delete(root);//释放cJSON结构体指针

注:具体 cJSON 的使用可以百度到很多博客,cJSON 的下载网址为:
  https://sourceforge.net/projects/cjson/
  直接将cJSON.c 和 cJOSN.h 添加到工程调用即可。


本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00