17 Star 58 Fork 24

Talkweb_OpenHarmony / Niobe

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 8.88 KB
一键复制 编辑 原始数据 按行查看 历史
xiang 提交于 2021-12-15 14:23 . add HttpClient Demo

Niobe开发板http客户端联网演示

本案例程序将演示怎么在拓维Niobe WiFi IoT Core开发板上编写一个基于cmcc-oneos HttpClient开源库,连接http服务器的业务程序,实现开发板联网上报数据到http服务器。由于https依赖第三方库,待适配,目前不支持https。

简述

HTTP(Hypertext Transfer Protocol)协议,即超文本传输协议,HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP协议实现主要运用在浏览器访问网页,根据请求的内容,服务器返回相应的请求内容为B/S模式,而嵌入式操作系统中主要运用的式C/S模式,即客户端与服务器的方式,通过系统客户端构造请求的消息,访问服务器,然后服务器返回相应的内容.HTTP协议工作于C/S(客户端/服务器)架构之上。HTTP协议协议最新版本是 HTTP 2.0,目前是用最广泛的是 HTTP 1.1。因为HTTP 1.1已经能满足我们基本需求了。HTTP协议目前有两种传输模式分别是HTTP和HTTPS,其中HTTPS = HTTP + SSL(或TLS)。HTTP传输方式访问的服务器默认端口为80端口。HTTPS传输方式访问的服务器默认端口为443。

结构体详解

typedef struct {
    int socket;                     /**< socket ID                 */
    int remote_port;                /**< hTTP or HTTPS port        */
    int response_code;              /**< response code             */
    char *header;                   /**< request custom header     */
    char *auth_user;                /**< username for basic authentication         */
    char *auth_password;            /**< password for basic authentication         */
    bool is_http;                   /**< http connection? if 1, http; if 0, https  */
#ifdef CONFIG_HTTP_SECURE
    const char *server_cert;        /**< server certification      */
    const char *client_cert;        /**< client certification      */
    const char *client_pk;          /**< client private key        */
    int server_cert_len;            /**< server certification lenght, server_cert buffer size  */
    int client_cert_len;            /**< client certification lenght, client_cert buffer size  */
    int client_pk_len;              /**< client private key lenght, client_pk buffer size      */
    void *ssl;                      /**< ssl content               */
#endif
} http_client_t;

描述:

客户端信息

参数:

名字 描述
socket 套接字id
remote_port 服务端的端口号
response_code 响应编码
header 请求头
auth_user 用户名
auth_password 密码
is_http http服务标志位,true表示http,false表示https
server_cert 服务器认证
client_cert 客户端认证
client_pk 客户端私钥
server_cert_len server_cert字符串长度
client_cert_len client_cert字符串长度
client_pk_len client_pk字符串长度
ssl 安全套接字协议

示例代码如下:

	struct sockaddr_in server_addr;
	bzero(&server_addr,sizeof(server_addr)); // 初始化服务器地址
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(_PROT_);
	//server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	inet_pton(AF_INET, _SERVER_IP_, &server_addr.sin_addr);

函数详解

HTTP_RESULT_CODE http_client_get(http_client_t *client, const char *url, http_client_data_t *client_data);

描述: 在指定的URL上执行GET请求,它会阻塞直到完成

参数:

名字 描述
client 存放客户端数据
url 待请求的网址
client_data 用于收集请求返回的数据,它还包含要发布的数据。

软件设计

主要代码分析

static void http_get_task(void)
{
    //
    http_client_t client = {0};
    http_client_data_t clientData = {0};
    char *url = NULL;
    url = str_dup(baiduurl);
    if (url == NULL)
    {
        printf("no memory for create url buffer\n");
        return ;
    }
    unsigned char *buf = NULL; 
    int maxPackageLen = 4097;
	int maxLen = 0;
	unsigned int offset = 0x0;

    buf = malloc(maxPackageLen);
    if (buf == NULL)
    {
        return ;
    }
    memset(buf, 0, maxPackageLen);
    clientData.response_buf = buf;
    clientData.response_buf_len = maxPackageLen; 

    int ret = http_client_get(&client, (const char *)url, &clientData);
    if(ret >=0 )
    {
        printf("success\n");
    }
    else
    {
        printf("faild\n");
    }

    if(buf) {
        free(buf);
        buf=NULL;
    }
    if(url){
        free(url);
        url=NULL;
    }

    return;
}

编译调试

修改对接热点的账号密码

修改tcp_client.c第30行和31行的WiFi热点SSID和密码,改成自己环境中的WiFi热点。

// 默认WiFi名和密码
#define WIFI_SSID "openharmony"
#define WIFI_PASSWORD "talkweb1996"

修改 BUILD.gn 文件

修改 applications/app/BUILD.gn 路径中的 BUILD.gn 文件,指定 network_httpclient_demo 参与编译。

        # "TW303_Network_mqttclient:network_mqttclient_example",
        # "TW402_APP_oled_u8g2:app_oled_u8g2_example",
        # "TW304_Network_tcpserver:network_tcpserver_demo",
        # "TW304_Network_tcpclient:network_tcpclient_demo",
        # "TW305_Network_udpclient:network_udpclient_demo",
		 "TW306_Network_httpclient:network_httpclient_demo",

运行结果

示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,会打印连接到的Wifi热点信息,以及向服务端请求信息,和服务端返回的信息

链接wifi成功,并打印IP信息

callback function for wifi connect

WaitConnectResult:wait success[1]s
WiFi connect succeed!
begain to dhcp<-- DHCP state:Inprogress -->

<-- DHCP state:Inprogress -->

<-- DHCP state:Inprogress -->

<-- DHCP state:OK -->
server :
	server_id : 192.168.1.1
	mask : 255.255.255.0, 1
	gw : 192.168.1.1
	T0 : 7200
	T1 : 3600
	T2 : 6300
clients <1> :
	mac_idx mac             addr            state   lease   tries   rto     
	0       b4c9b9af6afe    192.168.1.114   10      0       1       3       

客户端请求头的信息

request header is GET / HTTP/1.1
User-Agent: OneOS-HTTP-Client/1.0
Cache-Control: no-cache
Host: www.baidu.com

连接http服务端并得到响应

Written 99 bytes, socket = 0
httpclient_send() result:0, client:0xee7ac

Bdpagetype: 1
Bdqid: 0x8683b44000036337
Cache-Control: private
Connection: keep-alive
Content-Type: text/html;charset=utf-8
Date: Thu, 09 Dec 2021 06:23:39 GMT
Expires: Thu, 09 Dec 2021 06:23:09 GMT
P3p: CP=" OTI DS
Read header : Bdpagetype: 1
Read header : Bdqid: 0x8683b44000036337
Read header : Cache-Control: private
Read header : Connection: keep-alive
Read header : Content-Type: text/html;charset=utf-8
Read header : Date: Thu, 09 Dec 2021 06:23:39 GMT
Read header : Expires: Thu, 09 Dec 2021 06:23:09 GMT
Read header : P3p: CP=" OTI DSP COR IVA OUR IND COM "
Read header : P3p: CP=" OTI DSP COR IVA OUR IND COM "
Read header : Server: BWS/1.1
Read header : Set-Cookie: BAIDUID=4173C1FA2ED483853AF56AB4819135AC:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Read header : Set-Cookie: BIDUPSID=4173C1FA2ED483853AF56AB4819135AC; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Read header : Set-Cookie: PSTM=1639031019; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Read header : Set-Cookie: BAIDUID=4173C1FA2ED48385DDB272E52F1F187B:FG=1; max-age=31536000; expires=Fri, 09-Dec-22 06:23:39 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Read header : Set-Cookie: BDSVRTM=0; path=/
Read header : Set-Cookie: BD_HOME=1; path=/
Read 943 chars; In buf: [Set-Cookie: H_PS_PSSID=34445_35105_31254_34584_34517_35233_34606_35329_35324_26350_35209; path=/; domain=.baidu.com
Traceid: 163903101904392514669692789010002567991
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Frame-Options: s
in loop http_client_response_parse 880 ret 0 len 1023
Read header : Set-Cookie: H_PS_PSSID=34445_35105_31254_34584_34517_35233_34606_35329_35324_26350_35209; path=/; domain=.baidu.com
Read header : Traceid: 163903101904392514669692789010002567991
Read header : Vary: Accept-Encoding
Read header : Vary: Accept-Encoding
Read header : X-Frame-Options: sameorigin
Read header : X-Ua-Compatible: IE=Edge,chrome=1
Read header : Transfer-Encoding: chunked
in loop http_client_retrieve_content 681 len 716 ret 0
Retrieving 2839 bytes, len:711
readLen 2839, len:711
readLen 2128, len:1023
readLen 1105, len:1023
readLen 82, len:82
memmove 82 82 0
in loop http_client_retrieve_content 681 len 1021 ret 0
Retrieving 32768 bytes, len:1015
readLen 32768, len:1015
readLen 31753, len:242
httpclient_recv_data() result:1, client:0xee7ac
No form data info found
httpclient_close() client:0xee7ac
success
1
https://gitee.com/talkweb_oh/niobe.git
git@gitee.com:talkweb_oh/niobe.git
talkweb_oh
niobe
Niobe
master

搜索帮助