一、序言
借助 TI 公司的 CC3200 我们可以通过 http 轻松的完成与服务器之间的数据交互,体验CC3200的开箱即用的感觉,下面借助 http_client_demo 这个历程来实现从服务器 get 数据。实现我们从服务器得到用户的浇水信息。
CC3200的SDK 里面提供了所有的关于CC3200的资料,真的非常重要。 如:API文档、例程、例程使用文档、数据手册、原理图 … 等等。
二、CC3200 连接到路由器(AP)
此时CC3200 作为站点,即工作在 Sta(station)模式。简单理解就好比我们手机连上路由器或者数据才能上网一样,所需配置的地方如下:在common.h 中
- SSID_NAME :填入路由器所设置的名字。
- SECURITY_TYPE :安全方式,路由器设置为有密码时一般为 SL_SEC_TYPE_WPA_WPA2;没有密码时,定义为 SL_SEC_TYPE_OPEN。
- 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作为客户端时需要连接的路由器的相关信息 所以要根据所连接的路由器进行修改--*/
仿真报错时可以参考下面这篇博客:
https://blog.csdn.net/CSDN_X_W/article/details/86676351三、从服务器 get 数据
首先需要将上一节的服务器端运行起来,根据服务器去更改CC3200这边的相应请求,再贴上上一节后台服务器的代码一起参考:
3.1、后台代码:3.2、CC3200 相关配置:1
2
3
4
5
6
7
8
9
10
11
12/**
* 处理CC3200 发送过来的 GET 请求 ->查询花卉的浇水量返回给CC3200 @TODO
*/
//用于将数据写出去
"/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;
} - 更改 main.c 中如下配置: ip根据自己的实际更改
1
2
3
4
5
/*--HOST_NAME HTTP服务器的IP地址或者域名 如我的服务器的IP地址为......--*/
/*--HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如tomcat的默认端口是8080 http://localhost:8080/--*/- ==重点:更改所 get 的数据的长度== (没找到相关博客和TI教程我看代码研究了好久,可能C基础较差吧。)
①. len的长度决定了最终放到 g_buff 中数据的个数,否则g_buf中存放的是当前时间。
②. 最终get到的数据就存放再 g_buff 这个静态变量中,可以直接打印到控制台。1
2
3
4
5
6
7
8
9
10
11static 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;
//.......
} - 再程序的最后把 get 到的数据打印到控制台。这样就可以在控制台打印出如下数据:
1
2
3
4
5
6
7
8
9
10
11
12UART_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 的下载地址如下,直接复制 cJSON.c 和 cJSON.h 到工程中使用即可。1
2
3
4
5
6
7
8cJSON *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); //打印到控制台查看
https://sourceforge.net/projects/cjson/
- ==重点:更改所 get 的数据的长度== (没找到相关博客和TI教程我看代码研究了好久,可能C基础较差吧。)
四、学习方法
1.TI SDK 中提供了大量的例程,而直接导入例程稍作修改就能够实现我们想要的目的,是一个很好的参考,在看例程的过程中也可以加强编写程序的规范性。
2.如果项目中应用到了更多的功能,也可以将相关的例程融合到一起,对于 CC3200 主要的用到的是 driverlib 这个库,各个功能都封装成了API供我们快速开发,很方便。
...
...
00:00
00:00
本文为作者原创文章,未经作者允许不得转载。