本案例程序将演示怎么在拓维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"
修改 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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。