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

文章目录

    • 一、序言
    • 二、CC3200 连接到路由器(AP)
    • 三、从服务器 get 数据
    • 四、学习方法
    • 五、专栏地址

一、序言

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

二、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 :有密码时这里填入密码。
// 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

  运行程序仿真运行,可以登录路由器网关查看连接状态。或者直接用串口打印出来看连接是否成功,如下图:
CC3200 从服务器 get 数据 ( 实现一个简单的物联网系统-3 )_第2张图片
  仿真报错时可以参考下面这篇博客:
  https://blog.csdn.net/CSDN_X_W/article/details/86676351

三、从服务器 get 数据

  首先需要将上一节的服务器端运行起来,根据服务器去更改CC3200这边的相应请求,再贴上上一节后台服务器的代码一起参考:
  3.1、后台代码:

/**
* 处理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 相关配置:

  1. 更改 main.c 中如下配置:    ip根据自己的实际更改
#define GET_REQUEST_URI  "/cc3200Query?monitor_id=1"	//请求方式 即发送什么样的请求  请求参数为monitor_id
/*--HOST_NAME HTTP服务器的IP地址或者域名  如我的服务器的IP地址为......--*/
#define HOST_NAME        "192.168.43.148" //""
/*--HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如tomcat的默认端口是8080 http://localhost:8080/--*/
#define HOST_PORT           8080
  1. 重点:更改所 get 的数据的长度 (没找到相关博客和TI教程我看代码研究了好久,可能C基础较差吧。)
      ①. len的长度决定了最终放到 g_buff 中数据的个数,否则g_buf中存放的是当前时间。
      ②. 最终get到的数据就存放再 g_buff 这个静态变量中,可以直接打印到控制台。
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;
 //.......
 }
  1. 再程序的最后把 get 到的数据打印到控制台。
        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 库,具体可参照下面一段代码:

	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供我们快速开发,很方便。

五、专栏地址

  https://blog.csdn.net/CSDN_X_W/column/info/33567

你可能感兴趣的:(IOT-CC3200,云服务器,CC3200))