【鴻蒙開發(fā)實錄】在Hi3861開發(fā)板上發(fā)送一個get請求
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
由于liteos-m上已經(jīng)移植了lwip(一個小型開源的TCP/IP協(xié)議棧),所以在開發(fā)板上面進(jìn)行網(wǎng)絡(luò)編程相對來說還是比較方便。相關(guān)api可在kernel/網(wǎng)絡(luò).md · OpenHarmony/docs - Gitee.com上查看。
技術(shù)有限,如有錯誤還望不吝賜教。
基礎(chǔ):完成官方的快速入門教程
下載源碼后可以看到在目錄
- \\vendor\hisi\hi3861\hi3861\app\demo\src\
有許多的例程代碼:
而其中剛好有http客戶端的代碼, 詳見\\vendor\hisi\hi3861\hi3861\app\demo\src\app_http_client.c,而我們只需要將這些代碼按照官方入門教程的開發(fā)方式移植到
- \\applications\sample\wifi-iot\app
(其實官方例程貌似可以不需要更改,但使用的是make/makefile來構(gòu)造編譯,官方教程則是gn/ninja,如果按照官方教程來就只能改代碼了)
1、首先需要讓開發(fā)板連接上網(wǎng)絡(luò),詳細(xì)可參考連志安老師的帖子Hi3861 WiFi操作,熱點連接,或者下載下面的源碼參考
需要注意的是,在連接進(jìn)行完WIFI連接操作后,需要使用sleep一段時間,讓開發(fā)板有足夠的時間連接上網(wǎng)絡(luò)。
- int ret;
- ret = hi_wifi_start_sta();
- if(ret == -1) {
- printf("[Wifi] Connect failed!\n");
- } else {
- printf("[Wifi] Connect sucess!\n");
- }
- sleep(5);
2、定義get請求的header以及請求服務(wù)器的IP地址
- static const char *g_request = "GET / HTTP/1.1\r\n\
- Content-Type: application/x-www-form-urlencoded;charset=UTF-8\r\n\
- Host: baidu.com\r\n\
- Connection: close\r\n\
- \r\n";
- const char addr_ip[] = "192.168.1.103";
因為http服務(wù)是我電腦開啟的,所以ip地址是我電腦的局域網(wǎng)ip地址,大家可以直接使用某些公網(wǎng)網(wǎng)站的ip地址進(jìn)行測試,下面會介紹我的測試方式。
創(chuàng)建一個Socket并連接以及寫入請求
- struct sockaddr_in addr = {0};
- int s, r;
- char recv_buf[HTTPC_DEMO_RECV_BUFSIZE];
- addr.sin_family = AF_INET;
- addr.sin_port = PP_HTONS(SOCK_TARGET_PORT);
- addr.sin_addr.s_addr = inet_addr(addr_ip);
- s = socket(AF_INET, SOCK_STREAM, 0);
- if (s < 0) {
- return 1;
- }
- printf("... allocated socket");
- if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
- printf("... socket connect failed errno=%d", errno);
- lwip_close(s);
- return 1;
- }
- printf("... connected");
- if (lwip_write(s, g_request, strlen(g_request)) < 0) {
- lwip_close(s);
- return 1;
- }
接受獲取到的數(shù)據(jù)并打印
- do {
- (void)memset_s(recv_buf, sizeof(recv_buf), 0, sizeof(recv_buf));
- r = lwip_read(s, recv_buf, sizeof(recv_buf) - 1);
- for (int i = 0; i < r; i++) {
- putchar(recv_buf[i]);
- }
- } while (r > 0);
3、服務(wù)端,我是用的是python建立一個http文件服務(wù)器,很簡單,就在命令行一行代碼
- python -m http.server 80
在電腦上可通過127.0.0.1訪問,開發(fā)板需要和電腦位于同一局域網(wǎng)內(nèi),通過ip地址連接。ip地址可在cmd輸入ipconfig查看(windows)或Linux shell 輸入ifconfig查看(Linux)。也可不用自己建立web服務(wù),訪問一個http協(xié)議網(wǎng)站的ip地址即可(自行百度),注意不能使用域名訪問。
4、結(jié)果
可在命令行看到獲取的數(shù)據(jù)

在web服務(wù)器端能看到連接的記錄

192.168.1.105是開發(fā)板的ip地址
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)