CC3200从服务器获取数据(实现一个简单的物联网系统-3)

Posted by Beyonderwei on 2018-04-28
Words 1.4k and Reading Time 5 Minutes
Viewed Times

一、序言

  借助 TI 公司的 CC3200 我们可以通过 http 轻松的完成与服务器之间的数据交互,体验CC3200的开箱即用的感觉,下面借助 http_client_demo 这个历程来实现从服务器 get 数据。实现我们从服务器得到用户的浇水信息。
  CC3200的SDK 里面提供了所有的关于CC3200的资料,真的非常重要。 如:API文档、例程、例程使用文档、数据手册、原理图 … 等等。

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

  此时CC3200 作为站点,即工作在 Sta(station)模式。简单理解就好比我们手机连上路由器或者数据才能上网一样,所需配置的地方如下:在common.h 中

  1. SSID_NAME :填入路由器所设置的名字。
  2. SECURITY_TYPE :安全方式,路由器设置为有密码时一般为 SL_SEC_TYPE_WPA_WPA2;没有密码时,定义为 SL_SEC_TYPE_OPEN。
  3. SECURITY_KEY :有密码时这里填入密码。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Values for below macros shall be modified as per access-point(AP) properties// Values for below macros shall be modified as per access-point(AP) properties
    // SimpleLink device will connect to following AP when application is executed
    //
    /*--下面的设置为CC3200作为客户端时需要连接的路由器的相关信息 所以要根据所连接的路由器进行修改--*/
    #define SSID_NAME " " /* AP SSID */
    #define SECURITY_TYPE SL_SEC_TYPE_WPA_WPA2 /* Security type (OPEN or WEP or WPA*/
    #define SECURITY_KEY " " /* Password of the secured AP */
    #define SSID_LEN_MAX 32
    #define BSSID_LEN_MAX 6
      运行程序仿真运行,可以登录路由器网关查看连接状态。或者直接用串口打印出来看连接是否成功,如下图:

      仿真报错时可以参考下面这篇博客:
      https://blog.csdn.net/CSDN_X_W/article/details/86676351

    三、从服务器 get 数据

      首先需要将上一节的服务器端运行起来,根据服务器去更改CC3200这边的相应请求,再贴上上一节后台服务器的代码一起参考:
      3.1、后台代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * 处理CC3200 发送过来的 GET 请求 ->查询花卉的浇水量返回给CC3200 @TODO
    */
    @ResponseBody //用于将数据写出去
    @GetMapping("/cc3200Query") //这个方法用来处理query请求
    public Map<String, Object> cc3200GetResponse(@RequestParam int monitor_id) { //这个字符串拼接的方法来实现sql语句中嵌套变量好嘛?
    String querySql = "select * From flowers where monitor_id =" + "'" + monitor_id + "'";
    //这样返回的是一个map 而不是 list 的形式更方便CC3200那边去解析
    Map<String, Object> map =jdbcTemplate.queryForMap(querySql);
    System.out.println(map);
    return map;
    }
      3.2、CC3200 相关配置:
  4. 更改 main.c 中如下配置:    ip根据自己的实际更改
    1
    2
    3
    4
    5
    #define GET_REQUEST_URI  "/cc3200Query?monitor_id=1"	//请求方式 即发送什么样的请求  请求参数为monitor_id
    /*--HOST_NAME HTTP服务器的IP地址或者域名 如我的服务器的IP地址为......--*/
    #define HOST_NAME "192.168.43.148" //"<host name>"
    /*--HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如tomcat的默认端口是8080 http://localhost:8080/--*/
    #define HOST_PORT 8080
    1. ==重点:更改所 get 的数据的长度== (没找到相关博客和TI教程我看代码研究了好久,可能C基础较差吧。)
        ①. len的长度决定了最终放到 g_buff 中数据的个数,否则g_buf中存放的是当前时间。
        ②. 最终get到的数据就存放再 g_buff 这个静态变量中,可以直接打印到控制台。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      static int readResponse(HTTPCli_Handle httpClient)
      {
      long lRetVal = 0;
      int bytesRead = 0;
      int id = 0;
      unsigned long len = 114; //@TODO 重要:这里决定了收到的数据的长度 数值靠数 包括外面的大括号
      int json = 0;
      char *dataBuffer=NULL;
      bool moreFlags = 1;
      //.......
      }
    2. 再程序的最后把 get 到的数据打印到控制台。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      UART_PRINT("\n\r");
      UART_PRINT("HTTP Get Begin:\n\r");
      lRetVal = HTTPGetMethod(&httpClient);
      if(lRetVal < 0)
      {
      UART_PRINT("HTTP Post Get failed.\n\r");
      }
      UART_PRINT("HTTP Get End:\n\r");
      UART_PRINT("\n\r");
      /*--根据得到的json数据进行解析 Start--*/
      printf("g_buff:%s\n",g_buff);
      printf("size:%d\n",strlen(g_buff));
        这样就可以在控制台打印出如下数据:

        注意:
          ①. ==在用printf(“”); 打印时一定要加上换行“\n” ;不然数据是打印不出来的。==
          ②. 现在得到的数据为 JSON 格式,如果想得到某一项数据,需要对得到的 JSON 数据进行解析,最好的办法是使用 cJSON 库,具体可参照下面一段代码:
      1
      2
      3
      4
      5
      6
      7
      8
      cJSON *root;
      cJSON *ret;
      root = cJSON_Parse(g_buff); //将cJSON字符串转换为cJSON结构体指针
      ret = cJSON_GetObjectItem(root, "bulk"); //在root结构体中查找"key"这个键(一个字符串),成功返回一个cJSON结构体,失败返回NULL。
      bulk=ret->valueint; //获取到浇水量
      cJSON_Delete(ret); //释放cJSON结构体指针
      cJSON_Delete(root); //释放cJSON结构体指针
      printf("%d\n",bulk); //打印到控制台查看
      ==注:== cJSON 的下载地址如下,直接复制 cJSON.c 和 cJSON.h 到工程中使用即可。
        https://sourceforge.net/projects/cjson/

四、学习方法

  1.TI SDK 中提供了大量的例程,而直接导入例程稍作修改就能够实现我们想要的目的,是一个很好的参考,在看例程的过程中也可以加强编写程序的规范性。

  2.如果项目中应用到了更多的功能,也可以将相关的例程融合到一起,对于 CC3200 主要的用到的是 driverlib 这个库,各个功能都封装成了API供我们快速开发,很方便。


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

...

...

00:00
00:00