8.2. HTTP
8.2.1. 概述
HTTP(超文本传输协议)是应用最为广泛的应用层协议,SDK的http库 中提供了能满足大部分嵌入式开发需求的api接口供开发者使用。
HTTP常用请求方法的使用如:POST、GET等。
通过HTTP协议下载文件流数据。
借助其他存储介质(如:flash、SD卡等)POST大文件数据流。
作为http服务端使用。
8.2.2. DEMO工程
apps/demo/demo_DevkitBoard
8.2.3. HTTP请求
示例说明
展示HTTP常用请求方法的使用
示例
示例代码见 apps/common/example/network_protocols/http/http_post_get_put/main.c
,测试时需要在 apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏 USE_HTTP_POST_GET_TEST
。
操作说明
示例需要运行在STA模式 (注:如何进行sta和ap切换,请参考 Wi-Fi部分 )
选择工程其中一种请求方法进行测试。
编译工程,烧录镜像,复位启动
系统启动并成功联网后,应用程序会向服务端发送对应请求,可通过串口软件看到打印信息
示例流程如下:
c_main()
入口创建任务
http_test_start
http_test_start
函数流程通过
wifi_get_sta_connect_state
函数检测是否通过dhcp成功获取到ip成功通过dhcp获取到ip后,创建任务
http_test_task
,退出http_test_start
http_test_task
任务流程根据定义的请求方法,初始化http相关参数
向服务端发送对应请求
自定义头部:
#define HTTP_DEMO_URL "http://www.baidu.com/search/error.html"
#define LOG_HTTP_HEAD_OPTION \
"POST /search/error.html HTTP/1.1\r\n"\
"Host: www.baidu.com\r\n"\
"Connection: close\r\n"\
"Cache-Control: no-store\r\n"\
"Content-type: application/json\r\n"\
"Content-length: 30\r\n"\
"Accept: */*\r\n"\
"Accept-Language: zh-CN,zh,q=0.8\r\n"\
"Cookie: loginType=hardware; appId=1000000001; deviceSN=A4W0H02B000001; credential=56fb1f8df901f13fea8bf12ac2109c58; randNum=2dcf4629\r\n\r\n"
ctx->user_http_header = LOG_HTTP_HEAD_OPTION; //添加该参数, 则自定义申请头部内容
LOG_HTTP_HEAD_OPTION
为自定义的头部信息, Cookie
为自行添加的信息, 格式如上, 最后一行需多一个 \r\n
作为结尾.
POST
字段所跟的是url的后缀, Host
字段所跟的是url的域名, 其他的信息, 可以自行在postman软件中Code找到HTTP选项自行填写.
8.2.4. HTTP下载文件
示例说明
通过HTTP协议,下载URL指定的网络文件存储至指定路径,并具有断点重载的功能
示例实例
示例代码见 apps/common/example/network_protocols/http/http_download/main.c
,测试时需要在 apps/demo/demo_DevkitBoard/include/demo_config.h
中开启宏 USE_HTTP_DOWNLOAD_TEST
。
操作说明
示例需要运行在STA模式 (注:如何进行sta和ap切换,请参考 Wi-Fi部分 )
设置好下载链接(注:修改HTTP_DOWNLOAD_URL定义),网络文件存储路径(注:修改HTTP_STORAGE_PATH定义)
编译工程,烧录镜像,复位启动
系统启动,成功联网并且存储设备就绪后,会对指定网络文件进行下载并保存在指定的存储路径下
示例流程如下:
c_main()
入口创建任务
http_download_start
tcp_client_start
函数流程通过
wifi_get_sta_connect_state
函数检测是否通过dhcp成功获取到ip成功通过dhcp获取到ip后,调用
net_file_download_test
,退出http_download_start
net_file_download_test
函数流程通过
storage_device_ready
对存储设备状态进行检测,如果存储设备未就绪,会直接退出应用程序调用
create_download_task
create_download_task
函数流程初始化http相关参数
创建任务
download_task
download_task
任务流程初始化http相关参数
发起连接请求,建立socket连接
建立连接成功后,读取网络文件数据,并将数据存储到指定路径下
8.2.5. HTTP POST SD卡中的文件数据
示例说明
出于一些开发需要,开发者需要自定义http头部信息,同时需要post数据量较大的文件数据到http服务器, 但是由于板载的资源不足,当存在sd卡等存储设备时,可借助文件系统将大文件数据post到http服务器。
示例
示例代码见 apps/common/example/network_protocols/http/user_http_head/post_sd/main.c
,测试时需要在 apps/demo/demo_DevkitBoard/include/demo_config.h
中开启宏 USE_HTTP_POST_SD_DATA_TEST
。
操作说明
示例需要运行在STA模式 (注:如何进行sta和ap切换,请参考 Wi-Fi部分 )
定义需要post到的HTTP_DEMO_URL
编译工程,烧录镜像,复位启动
系统启动并成功连接网络后,可通过串口软件看到相关打印
示例流程如下:
c_main()
入口创建任务
http_user_header_test
http_user_header_test
函数流程通过
wifi_get_sta_connect_state
函数检测是否通过dhcp成功获取到ip通过
storage_device_ready
对存储设备状态进行检测成功通过dhcp获取到ip并存储设备就绪后,创建任务
http_test_task
http_test_task
任务流程设置自定义http头部信息和http连接的相关参数
通过文件系统读取SD卡中的文件数据到临时缓存,再通过http接口将文件数据流发送到http服务器
Note
该示例为了展示默认的http 报文头部信息无法满足需求,需要用户自定义http 报文头的情况。
8.2.6. HTTP Server
示例说明
展示了http服务器的使用,通过手机连接http服务器获取服务器资源。注意:sdk工程中http server只提供了get请求,其他请求方式暂时不提供。
示例实例
示例代码见 apps/common/example/network_protocols/http/server/main.c
,测试时需要在 apps/demo/demo_DevkitBoard/include/demo_config.h
中开启宏 USE_HTTP_SERVER_TEST
。
操作说明
示例需要运行在AP模式 (注:如何进行sta和ap切换,请参考 Wi-Fi部分 )
编译工程,烧录镜像,复位启动
系统启动后,连接AP wifi,成功连接AP wifi后,在手机浏览器中输入网址192.168.1.1:9080/index.html,跳转到该网址后手机上就会获取到http服务器的网页页面数据。
示例流程如下:
c_main()
入口创建任务
http_server_start
http_server_start
函数流程延时一段时间等待ap wifi稳定后,创建任务http_server_task
http_test_task
任务流程通过
http_virfile_reg
注册资源http_get_server_init
初始化http服务器,并等待客户端连接。
8.2.7. 常见问题
如何进行http通信调试?(使用http通信失败?)
答:由于自定义http头部需要开发者对http协议有一定程度的理解,很多时候无法进行http通信都是由于http通信协议格式错误, 因此调试时需要先借助其他软件,如:postman等,将http通信调通,然后仿照其头部协议格式进行程序编写。同时详细对比例程中的自定义http头部与开发者自行编写的http头部是否存在错误。
如何使用https添加证书?
答: 参考 示例代码 apps\common\example\network_protocols\mqtts\main.c
下https请求的证书添加。
如何查看设备发送的http内容
- 答:
1.可以利用WIFI抓包(注:如何使用WIFI抓包,请参考 WIFI抓包使用说明 );
2.以http post为例,正常情况下,当开发者自定义了http头部并添加
ctx->user_http_header = LOG_HTTP_HEAD_OPTION;
后,调用httpcli_post(ctx)
,将会发送宏LOG_HTTP_HEAD_OPTION
的内容,httpcli_post() ``;会进行判断 ``user_http_header ``中是否为 ``NULL
,NULL
则执行发送固定的http头部,否则发送user_http_header
内的数据。因此确保宏LOG_HTTP_HEAD_OPTION
没有写错即可。