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() 入口
    1. 创建任务 http_test_start

  • http_test_start 函数流程
    1. 通过 wifi_get_sta_connect_state 函数检测是否通过dhcp成功获取到ip

    2. 成功通过dhcp获取到ip后,创建任务 http_test_task,退出 http_test_start

  • http_test_task 任务流程
    1. 根据定义的请求方法,初始化http相关参数

    2. 向服务端发送对应请求

自定义头部:

#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() 入口
    1. 创建任务 http_download_start

  • tcp_client_start 函数流程
    1. 通过 wifi_get_sta_connect_state 函数检测是否通过dhcp成功获取到ip

    2. 成功通过dhcp获取到ip后,调用 net_file_download_test,退出 http_download_start

  • net_file_download_test 函数流程
    1. 通过 storage_device_ready 对存储设备状态进行检测,如果存储设备未就绪,会直接退出应用程序

    2. 调用 create_download_task

  • create_download_task 函数流程
    1. 初始化http相关参数

    2. 创建任务 download_task

  • download_task 任务流程
    1. 初始化http相关参数

    2. 发起连接请求,建立socket连接

    3. 建立连接成功后,读取网络文件数据,并将数据存储到指定路径下


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() 入口
    1. 创建任务 http_user_header_test

  • http_user_header_test 函数流程
    1. 通过 wifi_get_sta_connect_state 函数检测是否通过dhcp成功获取到ip

    2. 通过 storage_device_ready 对存储设备状态进行检测

    3. 成功通过dhcp获取到ip并存储设备就绪后,创建任务 http_test_task

  • http_test_task 任务流程
    1. 设置自定义http头部信息和http连接的相关参数

    2. 通过文件系统读取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() 入口
    1. 创建任务 http_server_start

  • http_server_start 函数流程
    1. 延时一段时间等待ap wifi稳定后,创建任务http_server_task

  • http_test_task 任务流程
    1. 通过 http_virfile_reg 注册资源

    2. http_get_server_init 初始化http服务器,并等待客户端连接。

8.2.7. 常见问题

  • 如何进行http通信调试?

答:由于自定义http头部需要开发者对http协议有一定程度的理解,很多时候无法进行http通信都是由于http通信协议格式错误, 因此调试时需要先借助其他软件,如:postman等,将http通信调通,然后仿照其头部协议格式进行程序编写。