Compare commits
320 Commits
master
...
prepare_fo
| Author | SHA1 | Date |
|---|---|---|
|
|
6d465f3a65 | |
|
|
616dc4584f | |
|
|
4de08ed386 | |
|
|
d5da547813 | |
|
|
c55286286e | |
|
|
a7d3e92357 | |
|
|
c4aaf920cd | |
|
|
3378579d9e | |
|
|
8a8a513cf1 | |
|
|
a92dc71ce4 | |
|
|
d0bf9c9564 | |
|
|
b2fef14aef | |
|
|
8c1423f50e | |
|
|
55ce48e0ba | |
|
|
f27c6d2091 | |
|
|
6d7250d4fd | |
|
|
52454eec8d | |
|
|
94d3d37a19 | |
|
|
88e8cc4193 | |
|
|
270d2b9ea3 | |
|
|
418bf921c6 | |
|
|
516b8627f7 | |
|
|
d1d846184b | |
|
|
ba81c73a06 | |
|
|
50d8ff5488 | |
|
|
e0e314e301 | |
|
|
98232123e4 | |
|
|
af33a3289c | |
|
|
b2ab878a33 | |
|
|
3c40a39d15 | |
|
|
0f2e05aed4 | |
|
|
71e3c8a654 | |
|
|
892bef64e9 | |
|
|
79d627a969 | |
|
|
b7e405ac94 | |
|
|
9b3f219b01 | |
|
|
d255ffaee5 | |
|
|
ab08ad959c | |
|
|
e03b3b390a | |
|
|
5a10e4153c | |
|
|
0aa73a14c2 | |
|
|
b3f473ec86 | |
|
|
d35d0bedb2 | |
|
|
4b579d1c8f | |
|
|
dfa6b664ac | |
|
|
eed7d2f37c | |
|
|
261a2a1653 | |
|
|
ad2dba22c3 | |
|
|
6a2e18806a | |
|
|
eca32c203b | |
|
|
c3e686c50b | |
|
|
ab77fe8a09 | |
|
|
a883474327 | |
|
|
77b6b8cb97 | |
|
|
91ee0f7b28 | |
|
|
c7bbf2935f | |
|
|
21785c37ee | |
|
|
6db0eccbe5 | |
|
|
e90c465a23 | |
|
|
719b02a3e7 | |
|
|
0705bdaf1a | |
|
|
2b44a0c6fb | |
|
|
d4b47088d2 | |
|
|
c96376ea25 | |
|
|
37764d4501 | |
|
|
267707c920 | |
|
|
29b15812b7 | |
|
|
dc25947261 | |
|
|
c508c2d43b | |
|
|
1cf3baeb2e | |
|
|
24023fd343 | |
|
|
7885326768 | |
|
|
341cfd34bd | |
|
|
196a8e001a | |
|
|
966ccb5030 | |
|
|
3fe9cf3d91 | |
|
|
3f1be486cf | |
|
|
53fc43e077 | |
|
|
f82f41ade7 | |
|
|
c17c899ea7 | |
|
|
648aaaae90 | |
|
|
fa439abd68 | |
|
|
dd4cfd93c6 | |
|
|
4f4bbc1d68 | |
|
|
699c04e94d | |
|
|
1e651e74b4 | |
|
|
bc8b003c1e | |
|
|
56216a530d | |
|
|
f962cf6919 | |
|
|
ca0ef77764 | |
|
|
7f14d047cb | |
|
|
b8335863ba | |
|
|
5039ebc85f | |
|
|
03751e3d1e | |
|
|
380aa361fe | |
|
|
ff720789ab | |
|
|
8c86c3c574 | |
|
|
30b98101ec | |
|
|
e07d4e2711 | |
|
|
dbfa37bf44 | |
|
|
29853ef76d | |
|
|
5b62808e28 | |
|
|
f85dfb3ccf | |
|
|
499047e31b | |
|
|
11ae2bd7da | |
|
|
bf505768e8 | |
|
|
0f77f4e86b | |
|
|
682460747b | |
|
|
58fe8fc887 | |
|
|
cf565f5d69 | |
|
|
40cedd339c | |
|
|
6c40800dfe | |
|
|
cc4106dd11 | |
|
|
e055ffdc2c | |
|
|
014e51c0ad | |
|
|
4d3858bf8f | |
|
|
339ea93b09 | |
|
|
6228e76194 | |
|
|
5a02b89ffc | |
|
|
274759aafb | |
|
|
987622d1e3 | |
|
|
a473111e5d | |
|
|
3437bfdc19 | |
|
|
cb785cf8a1 | |
|
|
98587d876d | |
|
|
d50d16bc86 | |
|
|
e745fc9129 | |
|
|
d884774bca | |
|
|
085c418faa | |
|
|
6bbf1e2c4c | |
|
|
c2abf66f23 | |
|
|
d14272c55f | |
|
|
aa3e6c9370 | |
|
|
f7d0b0925c | |
|
|
b41a1709c6 | |
|
|
159159ecde | |
|
|
b82a86d5c0 | |
|
|
0b1489cfed | |
|
|
9fd61d3d2a | |
|
|
60a7835ef8 | |
|
|
5ef61d14b1 | |
|
|
c326f7189e | |
|
|
6bc375c316 | |
|
|
474557a5ac | |
|
|
0a76e9c583 | |
|
|
e61ffc4589 | |
|
|
4d2e4498cc | |
|
|
e8061577da | |
|
|
652e5789a7 | |
|
|
83681208ec | |
|
|
fb368d24a9 | |
|
|
5da9a9c4ae | |
|
|
117789121e | |
|
|
bad8dc0fc2 | |
|
|
aefe92d67d | |
|
|
efba3f3bf3 | |
|
|
31b939fbb8 | |
|
|
f24a0f2d47 | |
|
|
a1df906d16 | |
|
|
74c04f2dbd | |
|
|
2615c5aab3 | |
|
|
8c601b031a | |
|
|
e33bd9dd78 | |
|
|
488419a6d0 | |
|
|
3427b3629d | |
|
|
fd608d8e81 | |
|
|
29499a1ec3 | |
|
|
3fc12f67b9 | |
|
|
5bb0f2aaf5 | |
|
|
2ae328c773 | |
|
|
570e4a029c | |
|
|
610810da32 | |
|
|
e2c32e9e72 | |
|
|
4b75e1283a | |
|
|
ff9a1645bd | |
|
|
8b32c2f4ed | |
|
|
0278d54a24 | |
|
|
1c775d42f6 | |
|
|
b41748dfb6 | |
|
|
1f21fc15b2 | |
|
|
23b938f242 | |
|
|
355e717cb8 | |
|
|
deb1f63d9e | |
|
|
68b7484fc5 | |
|
|
a5a809aa0a | |
|
|
a289c0d653 | |
|
|
0f32060aea | |
|
|
f4c9edd070 | |
|
|
f848f36efb | |
|
|
202a43cbcb | |
|
|
4c9cc39801 | |
|
|
48c40541f9 | |
|
|
cdb2be7ca4 | |
|
|
feb0d29fc9 | |
|
|
aef55df1dc | |
|
|
fdc1783300 | |
|
|
379045d7eb | |
|
|
7447152767 | |
|
|
df7de36516 | |
|
|
3ba4aa845f | |
|
|
a7d6f8215e | |
|
|
fbeb75d1f1 | |
|
|
a6f1215923 | |
|
|
a274a809cc | |
|
|
51a5fa5563 | |
|
|
859184945f | |
|
|
55d63408fe | |
|
|
9e031ecee0 | |
|
|
d4b7fd6ba5 | |
|
|
1eb783cc18 | |
|
|
7d3d4651d3 | |
|
|
90b7740ca0 | |
|
|
7077cf74c2 | |
|
|
d73470de3c | |
|
|
34e855a3a9 | |
|
|
dd383ef424 | |
|
|
3896242622 | |
|
|
167bc3c047 | |
|
|
dd35692866 | |
|
|
586ceba08e | |
|
|
a9ebe1e96d | |
|
|
6d9b66f05f | |
|
|
d1a198a4bc | |
|
|
0e82fac640 | |
|
|
bcf75bd62f | |
|
|
379cd567a2 | |
|
|
74b31a5420 | |
|
|
8becc52a90 | |
|
|
5f642507b4 | |
|
|
a868ed3238 | |
|
|
544b0bcba4 | |
|
|
20113601e7 | |
|
|
ed67ff5c62 | |
|
|
8c1ad40f81 | |
|
|
5510123098 | |
|
|
d6e7637128 | |
|
|
6a2a006a3f | |
|
|
87a57d0db0 | |
|
|
fb458fe6cd | |
|
|
bb0fb51e7e | |
|
|
7ce3748947 | |
|
|
fa2c91e690 | |
|
|
e2edd918c3 | |
|
|
da7220a60c | |
|
|
3acc7e431f | |
|
|
a51ef1c41f | |
|
|
91ddfea1ed | |
|
|
e29eb633ca | |
|
|
63b02913e4 | |
|
|
ec318c603a | |
|
|
53619b9b99 | |
|
|
ec7d9f1fcd | |
|
|
b481abd4eb | |
|
|
aa6fb2a8b0 | |
|
|
3c1129d88a | |
|
|
27734606f5 | |
|
|
62eda1e3fa | |
|
|
e9b4a0de6c | |
|
|
219575898a | |
|
|
06b9d67f2d | |
|
|
ee10eccb26 | |
|
|
fce13fe874 | |
|
|
fc4411dad4 | |
|
|
a25eccfac8 | |
|
|
0307fb2671 | |
|
|
b04544f842 | |
|
|
3efe663ee0 | |
|
|
8effd59528 | |
|
|
c56298fa99 | |
|
|
2df7b63f03 | |
|
|
9c0eced907 | |
|
|
21ca38158e | |
|
|
2e4eb538b9 | |
|
|
20ffe20c36 | |
|
|
4d56788af3 | |
|
|
02089a48ee | |
|
|
6559210341 | |
|
|
0f5546a679 | |
|
|
8010ba6a36 | |
|
|
69d86ef4e4 | |
|
|
b580f6b377 | |
|
|
b0eabde4f6 | |
|
|
d8265d3579 | |
|
|
10482724a9 | |
|
|
b779734061 | |
|
|
7740e3c5ef | |
|
|
8bd8187e82 | |
|
|
5baf461e48 | |
|
|
24fcbb54e8 | |
|
|
b9e5e97741 | |
|
|
5869154cca | |
|
|
d33184cbd9 | |
|
|
c06138364f | |
|
|
455fd31c7f | |
|
|
3c179e7879 | |
|
|
5900b504e3 | |
|
|
6f3d3b8862 | |
|
|
87921c4212 | |
|
|
dd43dd6d17 | |
|
|
555b014bc9 | |
|
|
9995980a1a | |
|
|
ed1c5eea1f | |
|
|
26f74120db | |
|
|
fb9250181f | |
|
|
dcea61d5e0 | |
|
|
e9b538c2dc | |
|
|
5a1fe0be3b | |
|
|
e48bd6fd67 | |
|
|
f2b64e4306 | |
|
|
8ecb3a8804 | |
|
|
5faa3e7b5a | |
|
|
938d46d5d9 | |
|
|
c6af847c73 | |
|
|
788eb53f39 | |
|
|
7ba883affe | |
|
|
3463c8515f | |
|
|
f59139f78e | |
|
|
c7ac5681e4 | |
|
|
a056aea50e | |
|
|
3d5ca66e7a |
|
|
@ -24,11 +24,11 @@
|
|||
url = https://www.gitlink.org.cn/chunyexixiaoyu/kendryte-sdk-source.git
|
||||
[submodule "APP_Framework/lib/lorawan/lora_radio_driver"]
|
||||
path = APP_Framework/lib/lorawan/lora_radio_driver
|
||||
url = https://gitlink.org.cn/IACU/lora_radio_driver.git
|
||||
url = https://gitlink.org.cn/xuos/lora_radio_driver
|
||||
[submodule "APP_Framework/lib/lorawan/lorawan_devicenode"]
|
||||
path = APP_Framework/lib/lorawan/lorawan_devicenode
|
||||
url = https://gitlink.org.cn/IACU/lorawan_devicenode.git
|
||||
url = https://gitlink.org.cn/xuos/lorawan_devicenode.git
|
||||
branch = master
|
||||
[submodule "APP_Framework/lib/lorawan/lorawan_gateway_single_channel"]
|
||||
path = APP_Framework/lib/lorawan/lorawan_gateway_single_channel
|
||||
url = https://gitlink.org.cn/IACU/lorawan_gateway_single_channel.git
|
||||
url = https://gitlink.org.cn/xuos/lorawan_gateway_single_channel.git
|
||||
|
|
|
|||
|
|
@ -20,4 +20,5 @@ menu "Applications"
|
|||
source "$APP_DIR/Applications/sensor_app/Kconfig"
|
||||
source "$APP_DIR/Applications/embedded_database_app/Kconfig"
|
||||
source "$APP_DIR/Applications/webnet/Kconfig"
|
||||
source "$APP_DIR/Applications/mongoose/Kconfig"
|
||||
endmenu
|
||||
|
|
|
|||
|
|
@ -36,5 +36,13 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
|||
SRC_DIR += control_app
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_APP_USING_WEBNET),y)
|
||||
SRC_DIR += webnet
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USE_MONGOOSE),y)
|
||||
SRC_DIR += mongoose
|
||||
endif
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
endif
|
||||
|
|
@ -72,6 +72,24 @@ menu "test app"
|
|||
endif
|
||||
endif
|
||||
|
||||
menuconfig USER_TEST_SOCKET
|
||||
select BSP_USING_LWIP
|
||||
bool "Config test socket(lwip)"
|
||||
default n
|
||||
|
||||
menuconfig USER_TEST_UART
|
||||
select BSP_USING_UART
|
||||
select BSP_USING_UART6
|
||||
bool "Config test uart"
|
||||
default n
|
||||
if USER_TEST_UART
|
||||
if ADD_XIZI_FEATURES
|
||||
config UART_DEV_DRIVER
|
||||
string "Set uart dev path"
|
||||
default "/dev/usart6_dev6"
|
||||
endif
|
||||
endif
|
||||
|
||||
menuconfig USER_TEST_RS485
|
||||
select BSP_USING_UART
|
||||
select BSP_USING_GPIO
|
||||
|
|
@ -252,6 +270,10 @@ menu "test app"
|
|||
bool "Config test red black tree"
|
||||
default n
|
||||
|
||||
menuconfig USER_TEST_MODBUS_TCP
|
||||
bool "Config test modbus_tcp"
|
||||
default n
|
||||
|
||||
menuconfig USER_TEST_WEBSERVER
|
||||
bool "Config test webserver"
|
||||
default n
|
||||
|
|
@ -259,11 +281,16 @@ menu "test app"
|
|||
menuconfig USER_TEST_MQTTCLIENT
|
||||
bool "Config test mqtt client"
|
||||
default n
|
||||
select LIB_USING_CJSON
|
||||
|
||||
menuconfig USER_TEST_FTPCLIENT
|
||||
bool "Config test ftp client"
|
||||
default n
|
||||
|
||||
menuconfig USER_TEST_FTPCLIENT_RISCV
|
||||
bool "Config test ftp client on riscv"
|
||||
default n
|
||||
|
||||
menuconfig USER_TEST_LORA_P2P
|
||||
bool "Config test lora p2p"
|
||||
default n
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ endif
|
|||
|
||||
ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
||||
SRC_FILES := test_shell.c
|
||||
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_ADC),y)
|
||||
SRC_FILES += test_adc.c
|
||||
endif
|
||||
|
|
@ -46,7 +46,16 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
|||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_I2C),y)
|
||||
SRC_FILES += test_i2c.c
|
||||
ifeq ($(CONFIG_BOARD_EDU_RISCV64_EVB),y)
|
||||
SRC_FILES += test_i2c_riscv.c
|
||||
endif
|
||||
ifeq ($(CONFIG_BOARD_EDU_ARM32_EVB),y)
|
||||
SRC_FILES += test_i2c_arm.c
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_UART),y)
|
||||
SRC_FILES += test_uart.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_GPIO),y)
|
||||
|
|
@ -62,7 +71,12 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
|||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_RS485),y)
|
||||
SRC_FILES += test_rs485.c
|
||||
ifeq ($(CONFIG_BOARD_EDU_RISCV64_EVB),y)
|
||||
SRC_FILES += test_rs485_riscv.c
|
||||
endif
|
||||
ifeq ($(CONFIG_BOARD_EDU_ARM32_EVB),y)
|
||||
SRC_FILES += test_rs485_arm.c
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_HWTIMER),y)
|
||||
|
|
@ -111,18 +125,34 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
|||
|
||||
ifeq ($(CONFIG_USER_TEST_RBTREE),y)
|
||||
SRC_FILES += test_rbtree/test_rbtree.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_SOCKET),y)
|
||||
SRC_FILES += test_socket.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_MODBUS_TCP),y)
|
||||
SRC_DIR += test_modbus_tcp
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_WEBSERVER),y)
|
||||
SRC_FILES +=
|
||||
SRC_FILES += test_webserver/test_webserver.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_MQTTCLIENT),y)
|
||||
SRC_DIR:= test_mqttclient
|
||||
SRC_FILES +=
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_FTPCLIENT),y)
|
||||
SRC_FILES +=
|
||||
SRC_FILES += test_ftpclient/test_ftpclient.c test_ftpclient/ftp_client/ftp_client.c\
|
||||
test_ftpclient/ftp_client/my_socket.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_FTPCLIENT_RISCV),y)
|
||||
ifeq ($(CONFIG_BSP_USING_W5500),y)
|
||||
SRC_FILES += test_ftpclient_riscv/test_ftpclient_riscv.c
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_LORA_P2P),y)
|
||||
|
|
@ -139,7 +169,11 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y)
|
|||
|
||||
ifeq ($(CONFIG_USER_TEST_USB_CAMERA),y)
|
||||
SRC_FILES +=
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USER_TEST_FTPCLIENT_FINAL),y)
|
||||
SRC_FILES += test_ftpclient_final/test_ftpclient_final.c test_ftpclient_final/ftp_client/ftp_client.c test_ftpclient_final/ftp_client/my_socket.c
|
||||
endif
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file test_4g_ec200a.c
|
||||
* @brief Implement the connection 4G function, using QUECTEL EC200A device
|
||||
* @version 1.1
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2023.10.15
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <transform.h>
|
||||
|
||||
#ifdef ADD_XIZI_FEATURES
|
||||
|
||||
char *trans_data = "{\"saleid\": \"52330000MJ87322565\", \"gateid\": \"10100001011\", \"type\": \"report\", \"time\": \"2023-06-15 17:22:00\", \"sequence\": \"268\", \"source\": \"da\", \"meter\": [{\"id\": \"T100106\", \"status\": \"1\", \"name\": \"T100106\", \"values\": {}}]}\r\n";
|
||||
// const char chk_buad[] = {"AT+IPR?\r\n"};
|
||||
const char set_mode[] = {"AT+QMTCFG=\"recv/mode\",0,0,1\r\n"};
|
||||
// const char set_cfg[] = {"AT+QMTCFG=\"aliauth\",0,\"k0celEMx5DK\",\"test_device\",\"411aa14c0dc671f7ee869adced442d13\"\r\n"};
|
||||
const char set_server[] = {"AT+QMTOPEN=0,\"xyheqmx.e3.luyouxia.net\",13333\r\n"};
|
||||
// const char set_server[] = {"AT+QMTOPEN=0,\"iot-060a7p7c.mqtt.iothub.aliyuncs.com\",1883\r\n"};
|
||||
const char set_conn[] = {"AT+QMTCONN=0,\"quectel\",\"test\",\"test123456\"\r\n"};
|
||||
// const char set_conn[] = {"AT+QMTCONN=0,\"sysoul\"\r\n"};
|
||||
// const char set_get[] = {"AT+QMTSUB=0,1,\"/get\",0\r\n"};
|
||||
// const char set_reply[] = {"AT+QMTPUBEX=0,0,0,0,\"/reply\",1000\r\n"};
|
||||
char recv_buf[100] = {0};
|
||||
int buf_len = 0;
|
||||
|
||||
|
||||
void Test4G(void)
|
||||
{
|
||||
int quectel_fd = PrivOpen(ADAPTER_QUECTEL_DRIVER, O_RDWR);
|
||||
if (quectel_fd < 0) {
|
||||
printf("open quectel fd error:%d\n", quectel_fd);
|
||||
return;
|
||||
}
|
||||
printf("quectel fopen success\n");
|
||||
|
||||
struct SerialDataCfg quectel_cfg;
|
||||
memset(&quectel_cfg, 0, sizeof(struct SerialDataCfg));
|
||||
quectel_cfg.serial_baud_rate = BAUD_RATE_115200;
|
||||
quectel_cfg.serial_data_bits = DATA_BITS_8;
|
||||
quectel_cfg.serial_stop_bits = STOP_BITS_1;
|
||||
quectel_cfg.serial_parity_mode = PARITY_NONE;
|
||||
quectel_cfg.serial_bit_order = BIT_ORDER_LSB;
|
||||
quectel_cfg.serial_invert_mode = NRZ_NORMAL;
|
||||
// quectel_cfg.serial_buffer_size = SERIAL_RB_BUFSZ;
|
||||
quectel_cfg.serial_buffer_size = 1024;
|
||||
quectel_cfg.serial_timeout = 1000;
|
||||
quectel_cfg.is_ext_uart = 0;
|
||||
// quectel_cfg.ext_uart_no = ADAPTER_QUECTEL_DRIVER_EXT_PORT;
|
||||
// quectel_cfg.port_configure = PORT_CFG_INIT;
|
||||
|
||||
struct PrivIoctlCfg ioctl_cfg;
|
||||
ioctl_cfg.ioctl_driver_type = SERIAL_TYPE;
|
||||
ioctl_cfg.args = &quectel_cfg;
|
||||
if (0 != PrivIoctl(quectel_fd, OPE_INT, &ioctl_cfg)) {
|
||||
printf("ioctl quectel fd error %d\n", quectel_fd);
|
||||
PrivClose(quectel_fd);
|
||||
return;
|
||||
}
|
||||
|
||||
printf("4G module set\n");
|
||||
|
||||
// memset(recv_buf, 0, sizeof(recv_buf));
|
||||
// printf("chk_buad: %s\n", chk_buad);
|
||||
// printf("chk_buad_len: %d\n", strlen(chk_buad));
|
||||
// PrivWrite(quectel_fd, chk_buad, strlen(chk_buad));
|
||||
// PrivTaskDelay(30);
|
||||
// buf_len = PrivRead(quectel_fd, recv_buf, sizeof(recv_buf));
|
||||
// printf("buf_len: %d\n", buf_len);
|
||||
// printf("[%s] Info: Recv from uart: %s\n", __func__, recv_buf);
|
||||
// PrivTaskDelay(1000);
|
||||
|
||||
memset(recv_buf, 0, sizeof(recv_buf));
|
||||
printf("set_mode: %s\n", set_mode);
|
||||
printf("set_mode_len: %d\n", strlen(set_mode));
|
||||
PrivWrite(quectel_fd, set_mode, strlen(set_mode));
|
||||
PrivTaskDelay(30);
|
||||
buf_len = PrivRead(quectel_fd, recv_buf, sizeof(recv_buf));
|
||||
printf("buf_len: %d\n", buf_len);
|
||||
printf("[%s] Info: Recv from uart: %s\n", __func__, recv_buf);
|
||||
PrivTaskDelay(1000);
|
||||
|
||||
// memset(recv_buf, 0, sizeof(recv_buf));
|
||||
// printf("set_cfg: %s\n", set_cfg);
|
||||
// printf("set_cfg_len: %d\n", strlen(set_cfg));
|
||||
// PrivWrite(quectel_fd, set_cfg, strlen(set_cfg));
|
||||
// PrivTaskDelay(30);
|
||||
// buf_len = PrivRead(quectel_fd, recv_buf, sizeof(recv_buf));
|
||||
// printf("buf_len: %d\n", buf_len);
|
||||
// printf("[%s] Info: Recv from uart: %s\n", __func__, recv_buf);
|
||||
// PrivTaskDelay(1000);
|
||||
|
||||
memset(recv_buf, 0, sizeof(recv_buf));
|
||||
printf("set_server: %s\n", set_server);
|
||||
printf("set_server_len: %d\n", strlen(set_server));
|
||||
PrivWrite(quectel_fd, set_server, strlen(set_server));
|
||||
PrivTaskDelay(30);
|
||||
buf_len = PrivRead(quectel_fd, recv_buf, sizeof(recv_buf));
|
||||
printf("buf_len: %d\n", buf_len);
|
||||
printf("[%s] Info: Recv from uart: %s\n", __func__, recv_buf);
|
||||
PrivTaskDelay(1000);
|
||||
|
||||
memset(recv_buf, 0, sizeof(recv_buf));
|
||||
printf("set_conn: %s\n", set_conn);
|
||||
printf("set_conn_len: %d\n", strlen(set_conn));
|
||||
PrivWrite(quectel_fd, set_conn, strlen(set_conn));
|
||||
PrivTaskDelay(30);
|
||||
buf_len = PrivRead(quectel_fd, recv_buf, sizeof(recv_buf));
|
||||
printf("buf_len: %d\n", buf_len);
|
||||
printf("[%s] Info: Recv from uart: %s\n", __func__, recv_buf);
|
||||
PrivTaskDelay(1000);
|
||||
|
||||
while (1) {
|
||||
printf("start send\n");
|
||||
char set_reply[50] = {"AT+QMTPUBEX=0,0,0,0,\"/reply\","};
|
||||
char data_len_str[20];
|
||||
sprintf(data_len_str, "%d", strlen(trans_data));
|
||||
printf("data_len_str: %s\n", data_len_str);
|
||||
strcat(set_reply, data_len_str);
|
||||
strcat(set_reply, "\r\n");
|
||||
|
||||
memset(recv_buf, 0, sizeof(recv_buf));
|
||||
printf("set_reply: %s\n", set_reply);
|
||||
printf("set_reply_len: %d\n", strlen(set_reply));
|
||||
PrivWrite(quectel_fd, set_reply, strlen(set_reply));
|
||||
PrivTaskDelay(30);
|
||||
buf_len = PrivRead(quectel_fd, recv_buf, sizeof(recv_buf));
|
||||
printf("buf_len: %d\n", buf_len);
|
||||
printf("[%s] Info: Recv from uart: %s\n", __func__, recv_buf);
|
||||
PrivTaskDelay(500);
|
||||
|
||||
memset(recv_buf, 0, sizeof(recv_buf));
|
||||
printf("send_data: %s\n", trans_data);
|
||||
printf("send_data_len: %d\n", strlen(trans_data));
|
||||
PrivWrite(quectel_fd, trans_data, strlen(trans_data));
|
||||
PrivTaskDelay(30);
|
||||
buf_len = PrivRead(quectel_fd, recv_buf, sizeof(recv_buf));
|
||||
printf("buf_len: %d\n", buf_len);
|
||||
printf("[%s] Info: Recv from uart: %s\n", __func__, recv_buf);
|
||||
PrivTaskDelay(5000);
|
||||
}
|
||||
|
||||
PrivClose(quectel_fd);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
PRIV_SHELL_CMD_FUNCTION(Test4G, a quectel test sample, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
#endif
|
||||
|
|
@ -26,9 +26,8 @@
|
|||
void TestAdc(void)
|
||||
{
|
||||
int adc_fd;
|
||||
uint8 adc_channel = 0x0;
|
||||
uint16 adc_sample, adc_value_decimal = 0;
|
||||
float adc_value;
|
||||
uint8 adc_channel = 0x1;
|
||||
uint16 adc_sample = 0;
|
||||
|
||||
adc_fd = PrivOpen(ADC_DEV_DRIVER, O_RDWR);
|
||||
if (adc_fd < 0) {
|
||||
|
|
@ -45,13 +44,11 @@ void TestAdc(void)
|
|||
return;
|
||||
}
|
||||
|
||||
PrivRead(adc_fd, &adc_sample, 2);
|
||||
|
||||
adc_value = (float)adc_sample * (3.3 / 4096);
|
||||
|
||||
adc_value_decimal = (adc_value - (uint16)adc_value) * 1000;
|
||||
|
||||
printf("adc sample %u value integer %u decimal %u\n", adc_sample, (uint16)adc_value, adc_value_decimal);
|
||||
for (int i = 0; i < 10; i ++) {
|
||||
PrivRead(adc_fd, &adc_sample, 2);
|
||||
printf("adc sample %u mv\n", adc_sample);
|
||||
PrivTaskDelay(500);
|
||||
}
|
||||
|
||||
PrivClose(adc_fd);
|
||||
|
||||
|
|
|
|||
|
|
@ -22,17 +22,16 @@
|
|||
#include <transform.h>
|
||||
#ifdef ADD_XIZI_FEATURES
|
||||
|
||||
void TestDac(void)
|
||||
static pthread_t test_dac_task;
|
||||
|
||||
static void *TestDacTask(void *parameter)
|
||||
{
|
||||
int dac_fd;
|
||||
uint16 dac_set_value = 800;
|
||||
uint16 dac_sample, dac_value_decimal = 0;
|
||||
float dac_value;
|
||||
uint16 dac_set_value = 4096 * 10;//sin length
|
||||
|
||||
dac_fd = PrivOpen(DAC_DEV_DRIVER, O_RDWR);
|
||||
if (dac_fd < 0) {
|
||||
KPrintf("open dac fd error %d\n", dac_fd);
|
||||
return;
|
||||
}
|
||||
|
||||
struct PrivIoctlCfg ioctl_cfg;
|
||||
|
|
@ -41,20 +40,24 @@ void TestDac(void)
|
|||
if (0 != PrivIoctl(dac_fd, OPE_CFG, &ioctl_cfg)) {
|
||||
KPrintf("ioctl dac fd error %d\n", dac_fd);
|
||||
PrivClose(dac_fd);
|
||||
return;
|
||||
}
|
||||
|
||||
PrivRead(dac_fd, &dac_sample, 2);
|
||||
|
||||
dac_value = (float)dac_sample * (3.3 / 4096);//Vref+ need to be 3.3V
|
||||
|
||||
dac_value_decimal = (dac_value - (uint16)dac_value) * 1000;
|
||||
|
||||
printf("dac sample %u value integer %u decimal %u\n", dac_sample, (uint16)dac_value, dac_value_decimal);
|
||||
while (1) {
|
||||
//start dac output sin
|
||||
PrivWrite(dac_fd, NULL, 0);
|
||||
}
|
||||
|
||||
PrivClose(dac_fd);
|
||||
}
|
||||
|
||||
return;
|
||||
void TestDac(void)
|
||||
{
|
||||
pthread_attr_t tid;
|
||||
tid.schedparam.sched_priority = 20;
|
||||
tid.stacksize = 4096;
|
||||
|
||||
PrivTaskCreate(&test_dac_task, &tid, &TestDacTask, NULL);
|
||||
PrivTaskStartup(&test_dac_task);
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(TestDac, a dac test sample, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
#endif
|
||||
|
|
@ -22,6 +22,7 @@
|
|||
#include <transform.h>
|
||||
#ifdef ADD_XIZI_FEATURES
|
||||
|
||||
#ifdef BSP_USING_W5500
|
||||
#include <socket.h>
|
||||
|
||||
#define BUFF_SIZE 128
|
||||
|
|
@ -189,6 +190,6 @@ PRIV_SHELL_CMD_FUNCTION(TestSocketAsClient, a w5500 client-ip-port-msg test samp
|
|||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
# 初赛一级赛题3:基于矽璓已实现的Lwip,在ARM上实现FTP协议的Client功能
|
||||
|
||||
## 1. 简介
|
||||
本项目是基于矽璓已实现的Lwip,在ARM上实现FTP协议的Client功能
|
||||
test_ftpclient.h声明了下载10个文件的测试函数
|
||||
test_ftpclient.c实现了下载10个文件的测试函数
|
||||
ftp_client文件夹定义了ftp_client的相关类库其中my_socket.h,my_socket.c定义了socket抽象层,并基于
|
||||
Lwip实现了该抽象层,ftp_client.h,ftp_client.c实现了ftp登录,获取文件大小,下载文件等功能
|
||||
|
||||
## 2. 数据结构设计说明
|
||||
- ftp_client.c 的设计
|
||||
分别定义了发送命令和接收数据的socket和相应的缓冲区并且实现了登录、发送命令、接收响应数据、查找文件大小、进入被动模式、下载文件、关闭ftp客户端等操作
|
||||
```c
|
||||
static int m_socket_cmd; // 发送命令的socket文件描述符
|
||||
static int m_socket_data; // 接收ftp服务器文件的socket文件描述符
|
||||
static char m_send_buffer[1024]; // 发送缓冲区
|
||||
static char m_recv_buffer[1024]; // 接收缓冲区
|
||||
```
|
||||
## 3. 测试程序说明
|
||||
- test_ftpclient.c用于测试下载10个文件
|
||||
连接电脑上的ftp服务器下载10个4KB文件,通过终端日志打印确定文件是否下载成功,以及追踪通信流程和下载进度
|
||||
```c
|
||||
void TestFtpClient(int argc, char* argv[])
|
||||
{
|
||||
FtpInitCmd();
|
||||
int ret = FtpLogin("192.168.0.248", 21, "anonymous", "anonymous");
|
||||
int size;
|
||||
char *buf;
|
||||
for(int i = 1;i <= 10;i++){
|
||||
char fileName[20] = "/file";
|
||||
char temp[5] = "";
|
||||
sprintf(temp,"%d",i);
|
||||
strcat(fileName,temp);
|
||||
size = FtpFileSize(fileName);
|
||||
buf = malloc(size);
|
||||
FtpInitData(); // data socket 每次下载都要重新创建,下载完都要关闭
|
||||
ret = FtpDownload(fileName, buf, size);
|
||||
free(buf);
|
||||
}
|
||||
FtpQuit();
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 运行结果(##需结合运行测试截图按步骤说明##)
|
||||
1. 配置开启BSP_USING_LWIP、USER_TEST_FTPCLIENT
|
||||

|
||||

|
||||
2. 编译
|
||||

|
||||
3. 烧写
|
||||

|
||||
4. xshell连接串口终端
|
||||

|
||||
6. 配置ip
|
||||

|
||||
7. 运行TestFtpClient,开始下载文件
|
||||

|
||||

|
||||

|
||||
|
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: ftp_client.c
|
||||
* @brief: ftp client tool
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/7/25
|
||||
* @reference https://kerndev.blog.csdn.net/article/details/89383888
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include "my_socket.h"
|
||||
#include "ftp_client.h"
|
||||
|
||||
static int m_socket_cmd;
|
||||
static int m_socket_data;
|
||||
static char m_send_buffer[1024];
|
||||
static char m_recv_buffer[1024];
|
||||
|
||||
static int FtpSendCommand(char *cmd)
|
||||
{
|
||||
int ret;
|
||||
printf("send command: %s\r\n", cmd);
|
||||
ret = SocketSend(m_socket_cmd, cmd, (int)strlen(cmd));
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("failed to send command: %s\r\n",cmd);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int FtpRecvRespond(char *resp, int len)
|
||||
{
|
||||
int ret;
|
||||
int off;
|
||||
len -= 1;
|
||||
for(off=0; off<len; off+=ret)
|
||||
{
|
||||
ret = SocketRecv(m_socket_cmd, &resp[off], 1);
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("recv respond error(ret=%d)!\r\n", ret);
|
||||
return 0;
|
||||
}
|
||||
if(resp[off] == '\n')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
resp[off+1] = 0;
|
||||
printf("respond:%s\r\n", resp);
|
||||
return atoi(resp);
|
||||
}
|
||||
|
||||
static int FtpEnterPasv(char *ipaddr, int *port)
|
||||
{
|
||||
int ret;
|
||||
char *find;
|
||||
int a,b,c,d;
|
||||
int pa,pb;
|
||||
ret = FtpSendCommand("PASV\r\n");
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
if(ret != 227)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
find = strrchr(m_recv_buffer, '(');
|
||||
sscanf(find, "(%d,%d,%d,%d,%d,%d)", &a, &b, &c, &d, &pa, &pb);
|
||||
sprintf(ipaddr, "%d.%d.%d.%d", a, b, c, d);
|
||||
*port = pa * 256 + pb;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int FtpDownload(char *name, char *buf, int len)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
char ipaddr[32];
|
||||
int port;
|
||||
|
||||
//查询数据地址
|
||||
ret = FtpEnterPasv(ipaddr, &port);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
//连接数据端口
|
||||
ret = SocketConnect(m_socket_data, ipaddr, port);
|
||||
if(ret != 1)
|
||||
{
|
||||
printf("failed to connect data port\r\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//准备下载
|
||||
sprintf(m_send_buffer, "RETR %s\r\n", name);
|
||||
ret = FtpSendCommand(m_send_buffer);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
if(ret != 150)
|
||||
{
|
||||
SocketClose(m_socket_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//开始下载,读取完数据后,服务器会自动关闭连接
|
||||
for(i=0; i<len; i+=ret)
|
||||
{
|
||||
ret = SocketRecv(m_socket_data, ((char *)buf) + i, len);
|
||||
printf("download %d/%d.\r\n", i + ret, len);
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("download was interrupted.\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
//下载完成
|
||||
printf("download %d/%d bytes complete.\r\n", i, len);
|
||||
printf("====file content====\n");
|
||||
buf[100] = '\0';
|
||||
printf("%s\n",buf);
|
||||
printf("====================\n");
|
||||
// FILE *fp = NULL;
|
||||
|
||||
// fp = fopen(name+1, "wb");
|
||||
// fwrite(buf,len,1,fp);
|
||||
// fclose(fp);
|
||||
|
||||
SocketClose(m_socket_data);
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
return (ret==226);
|
||||
}
|
||||
|
||||
int FtpFileSize(char *name)
|
||||
{
|
||||
int ret;
|
||||
int size;
|
||||
sprintf(m_send_buffer,"SIZE %s\r\n",name);
|
||||
ret = FtpSendCommand(m_send_buffer);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
if(ret != 213)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
size = atoi(m_recv_buffer + 4);
|
||||
return size;
|
||||
}
|
||||
|
||||
int FtpLogin(char *addr, int port, char *username, char *password)
|
||||
{
|
||||
int ret;
|
||||
printf("connect...\r\n");
|
||||
ret = SocketConnect(m_socket_cmd, addr, port);
|
||||
if(ret != 1)
|
||||
{
|
||||
printf("connect server failed!\r\n");
|
||||
return 0;
|
||||
}
|
||||
printf("connect ok.\r\n");
|
||||
//等待欢迎信息
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
if(ret != 220)
|
||||
{
|
||||
printf("bad server, ret=%d!\r\n", ret);
|
||||
SocketClose(m_socket_cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("login...\r\n");
|
||||
//发送USER
|
||||
sprintf(m_send_buffer, "USER %s\r\n", username);
|
||||
ret = FtpSendCommand(m_send_buffer);
|
||||
if(ret != 1)
|
||||
{
|
||||
SocketClose(m_socket_cmd);
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
if(ret != 331)
|
||||
{
|
||||
SocketClose(m_socket_cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//发送PASS
|
||||
sprintf(m_send_buffer, "PASS %s\r\n", password);
|
||||
ret = FtpSendCommand(m_send_buffer);
|
||||
if(ret != 1)
|
||||
{
|
||||
SocketClose(m_socket_cmd);
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
if(ret != 230)
|
||||
{
|
||||
SocketClose(m_socket_cmd);
|
||||
return 0;
|
||||
}
|
||||
printf("login success.\r\n");
|
||||
|
||||
//设置为二进制模式
|
||||
ret = FtpSendCommand("TYPE I\r\n");
|
||||
if(ret != 1)
|
||||
{
|
||||
SocketClose(m_socket_cmd);
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(m_recv_buffer, 1024);
|
||||
if(ret != 200)
|
||||
{
|
||||
SocketClose(m_socket_cmd);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void FtpQuit(void)
|
||||
{
|
||||
FtpSendCommand("QUIT\r\n");
|
||||
SocketClose(m_socket_cmd);
|
||||
}
|
||||
|
||||
void FtpInitCmd(void)
|
||||
{
|
||||
m_socket_cmd = SocketCreate();
|
||||
}
|
||||
|
||||
void FtpInitData(void){
|
||||
m_socket_data= SocketCreate();
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: ftp_client.h
|
||||
* @brief: ftp client tool
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/7/25
|
||||
*/
|
||||
|
||||
#ifndef FTP_CLIENT_H
|
||||
#define FTP_CLIENT_H
|
||||
|
||||
/* init ftp cmd socket */
|
||||
void FtpInitCmd(void);
|
||||
|
||||
/* init ftp data socket */
|
||||
void FtpInitData(void);
|
||||
|
||||
/* quit ftp */
|
||||
void FtpQuit(void);
|
||||
|
||||
/* fpt login */
|
||||
int FtpLogin(char *addr, int port, char *username, char *password);
|
||||
|
||||
/* get file size */
|
||||
int FtpFileSize(char *name);
|
||||
|
||||
/* ftp download file*/
|
||||
int FtpDownload(char *name, char *buf, int len);
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: my_socket.c
|
||||
* @brief: a abstract socket api
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/7/25
|
||||
* @reference https://kerndev.blog.csdn.net/article/details/89383888
|
||||
*/
|
||||
|
||||
#include "my_socket.h"
|
||||
#include <sockets.h>
|
||||
#include <def.h>
|
||||
#include <errno.h>
|
||||
|
||||
int SocketCreate(void){
|
||||
return socket(AF_INET,SOCK_STREAM,0);
|
||||
}
|
||||
|
||||
int SocketConnect(int sock, const char *addr, int port){
|
||||
// unsigned int iRemoteAddr = 0;
|
||||
struct sockaddr_in stRemoteAddr = {0}; //对端,即目标地址信息
|
||||
|
||||
stRemoteAddr.sin_family = AF_INET;
|
||||
stRemoteAddr.sin_port = htons(port);
|
||||
stRemoteAddr.sin_addr.s_addr = inet_addr(addr);
|
||||
// inet_pton(AF_INET, addr, &iRemoteAddr);
|
||||
// stRemoteAddr.sin_addr.s_addr=iRemoteAddr;
|
||||
int res = connect(sock,(struct sockaddr *)&stRemoteAddr,sizeof(stRemoteAddr));
|
||||
if(res == -1){
|
||||
printf("error:%d\n",errno);
|
||||
}
|
||||
return res == 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
int SocketSend(int sock, void *data, int len){
|
||||
return send(sock,data,len,0);
|
||||
}
|
||||
|
||||
int SocketRecv(int sock, void *data, int len){
|
||||
return recv(sock,data,len,0);
|
||||
}
|
||||
|
||||
void SocketClose(int sock){
|
||||
close(sock);
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file my_socket.h
|
||||
* @brief a abstract socket api
|
||||
* @version 1.0
|
||||
* @author bdislab_final
|
||||
* @date 2023/7/25
|
||||
*/
|
||||
|
||||
#ifndef MYSOCKET_H
|
||||
#define MYSOCKET_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/* create a socket */
|
||||
int SocketCreate(void);
|
||||
|
||||
/* connect a socket */
|
||||
int SocketConnect(int sock, const char *addr, int port);
|
||||
|
||||
/* send data through socket*/
|
||||
int SocketSend(int sock, void *data, int len);
|
||||
|
||||
/* receive data from socket*/
|
||||
int SocketRecv(int sock, void *data, int len);
|
||||
|
||||
/* close socket*/
|
||||
void SocketClose(int sock);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
After Width: | Height: | Size: 214 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: test_ftpclient.c
|
||||
* @brief: a ftpClient test sample
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/7/25
|
||||
*/
|
||||
|
||||
#include "test_ftpclient.h"
|
||||
#include "ftp_client/ftp_client.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <transform.h>
|
||||
|
||||
|
||||
/* test for ftp client */
|
||||
void TestFtpClient(int argc, char* argv[])
|
||||
{
|
||||
FtpInitCmd();
|
||||
int ret = FtpLogin("192.168.1.248", 21, "anonymous", "anonymous");
|
||||
int size;
|
||||
char *buf;
|
||||
for(int i = 1;i <= 10;i++){
|
||||
char fileName[20] = "/file";
|
||||
char temp[5] = "";
|
||||
sprintf(temp,"%d",i-1);
|
||||
strcat(fileName,temp);
|
||||
size = FtpFileSize(fileName);
|
||||
buf = malloc(size);
|
||||
FtpInitData(); // data socket 每次下载都要重新创建,下载完都要关闭
|
||||
ret = FtpDownload(fileName, buf, size);
|
||||
free(buf);
|
||||
}
|
||||
FtpQuit();
|
||||
return;
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file test_ftpclient.h
|
||||
* @brief a ftpClient test sample
|
||||
* @version 1.0
|
||||
* @author bdislab_final
|
||||
* @date 2023/7/25
|
||||
*/
|
||||
|
||||
#ifndef TEST_FTPCLIENT_H
|
||||
#define TEST_FTPCLIENT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* test for ftp client */
|
||||
void TestFtpClient(int argc, char* argv[]);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
# 决赛一级赛题3:基于初赛一级赛题3,在云服务器上实现FTP Server功能
|
||||
|
||||
## 1. 简介
|
||||
本项目是基于赛事提供的云服务器,实现FTP协议的Server功能,其功能支持至少10个Client端并发向Server端传输4KB大小的文件,
|
||||
支持Server端并发地向至少10个Client端传输4KB大小的文件。
|
||||
test_ftpclient_final.h声明了多个客户端并发下载文件、并发上传文件的测试函数
|
||||
test_ftpclient_final.c实现了多个客户端并发下载文件、并发上传文件的测试函数
|
||||
ftp_client文件夹定义了ftp_client的相关类库其中my_socket.h,my_socket.c定义了socket抽象层,并基于
|
||||
Lwip实现了该抽象层,ftp_client.h,ftp_client.c实现了ftp登录,获取文件大小,下载文件等功能
|
||||
注意:在赛事提供的云服务器/root/yanglongFTP上有对应服务器代码 ./server运行服务器,为了方便查看代码我们讲服务器代码备份存放在ftp_server目录下
|
||||
## 2. 数据结构设计说明
|
||||
- ftp_client.c 的设计
|
||||
分别定义了发送命令和接收数据的socket和相应的缓冲区并且实现了登录、发送命令、接收响应数据、查找文件大小、进入被动模式、下载文件、关闭ftp客户端等操作
|
||||
```c
|
||||
static int m_socket_cmd[THREAD_NUM]; // 发送命令的socket文件描述符,THREAD_NUM表示线程数目,用来模拟多个客户端并发访问
|
||||
static int m_socket_data[THREAD_NUM]; // 接收ftp服务器文件的socket文件描述符
|
||||
static char m_send_buffer[THREAD_NUM][1024]; // 发送缓冲区
|
||||
static char m_recv_buffer[THREAD_NUM][1024]; // 接收缓冲区
|
||||
```
|
||||
- server.c 的设计(具体代码在赛事提供的云服务器的/root/yanglongFTP下)
|
||||
```c
|
||||
#define THREAD_NUM 10000 // thread num
|
||||
static int isBinary = 0; // transmit binary data
|
||||
static int port = 9992; // service port
|
||||
static int dataPort = 9993; // the port for file download
|
||||
static char order[4]; // receive order
|
||||
static char param[20]; // receive order param
|
||||
static char *respMessage; // respose message
|
||||
static int serverFd; // the server fd for deal with order requests
|
||||
static int dataServerFd; // the server fd for file download
|
||||
sem_t mutex; // mutex lock
|
||||
struct Data{ // 线程间通信传输的数据
|
||||
char fileName[20]; // file name
|
||||
int type; // 0:download 1:upload
|
||||
sem_t isDone; // complete file downlaod
|
||||
sem_t isReady; // 文件准备好了
|
||||
} data;
|
||||
```
|
||||
## 3. 测试程序说明
|
||||
- test_ftpclient_final.c用于测试多个客户端并发下载文件
|
||||
通过多线程模拟多个客户端并发访问服务器,通过 TestFtpClient options threads进行测试
|
||||
其中options=1表示下载options=2表示上传,threads表示线程数/模拟的并发客户端数目
|
||||
```c
|
||||
/* test for 10 ftp client */
|
||||
void TestFtpClient(int argc, char* argv[])
|
||||
{
|
||||
int options = atoi(argv[1]);
|
||||
int n = atoi(argv[2]);
|
||||
pthread_t threads[THREAD_NUM];
|
||||
for(int i = 0;i < n;++i){
|
||||
threadIDs[i] = i;
|
||||
if(options == 1){ // 全部都是下载
|
||||
pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]);
|
||||
}else if(options == 2){ // 全部都是上传
|
||||
pthread_create(&threads[i],NULL,&UpLoad,&threadIDs[i]);
|
||||
}else if(options == 3){ // 随机下载/上传
|
||||
int r = rand()%2;
|
||||
if(r == 0){
|
||||
printf("===============download===============\n");
|
||||
pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]);
|
||||
}else{
|
||||
printf("===============upload===============\n");
|
||||
pthread_create(&threads[i],NULL,&UpLoad,&threadIDs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
```
|
||||
|
||||
## 4. 运行结果(##需结合运行测试截图按步骤说明##)
|
||||
1. 配置开启BSP_USING_LWIP、USER_TEST_FTPCLIENT
|
||||

|
||||

|
||||

|
||||
2. 编译
|
||||

|
||||
3. 烧写
|
||||

|
||||
4. xshell连接串口终端并配置ip
|
||||

|
||||
5. 通过./server在云服务器运行FTP服务器
|
||||

|
||||
6. 运行TestFtpClient 1 10,模拟10个客户端并发下载文件
|
||||
- 客户端日志
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
- 服务器日志
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
7. 运行TestFtpClient 2 10,模拟10个客户端并发上传文件
|
||||
- 客户端日志
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
- 服务器日志
|
||||

|
||||

|
||||

|
||||

|
||||
- 上传结果
|
||||

|
||||
8. 运行TestFtpClient 3 10,模拟10个客户端混合并发下载和上传文件
|
||||
- 客户端日志
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
- 服务器日志
|
||||

|
||||

|
||||

|
||||
|
||||
- 下载和上传结果
|
||||

|
||||

|
||||
|
|
@ -0,0 +1,299 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: ftp_client.c
|
||||
* @brief: ftp client tool
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/9/16
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include "my_socket.h"
|
||||
#include "ftp_client.h"
|
||||
|
||||
|
||||
static int m_socket_cmd[THREAD_NUM];
|
||||
static int m_socket_data[THREAD_NUM];
|
||||
static char m_send_buffer[THREAD_NUM][1024];
|
||||
static char m_recv_buffer[THREAD_NUM][1024];
|
||||
|
||||
static int FtpSendCommand(int threadID,char *cmd)
|
||||
{
|
||||
int ret;
|
||||
printf("send command: %s,threadID=%d\r\n", cmd,threadID);
|
||||
ret = SocketSend(m_socket_cmd[threadID], cmd, (int)strlen(cmd));
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("failed to send command: %s\r\n",cmd);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int FtpRecvRespond(int threadID,char *resp, int len)
|
||||
{
|
||||
int ret;
|
||||
int off;
|
||||
len -= 1;
|
||||
for(off=0; off<len; off+=ret)
|
||||
{
|
||||
ret = SocketRecv(m_socket_cmd[threadID], &resp[off], 1);
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("recv respond error(ret=%d)!\r\n", ret);
|
||||
return 0;
|
||||
}
|
||||
if(resp[off] == '\n')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
resp[off+1] = 0;
|
||||
printf("respond:%s,threadID=%d\r\n", resp,threadID);
|
||||
return atoi(resp);
|
||||
}
|
||||
|
||||
static int FtpEnterPasv(int threadID,char *ipaddr, int *port)
|
||||
{
|
||||
int ret;
|
||||
char *find;
|
||||
int a,b,c,d;
|
||||
int pa,pb;
|
||||
ret = FtpSendCommand(threadID,"PASV\r\n");
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 227)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
find = strrchr(m_recv_buffer[threadID], '(');
|
||||
sscanf(find, "(%d,%d,%d,%d,%d,%d)", &a, &b, &c, &d, &pa, &pb);
|
||||
sprintf(ipaddr, "%d.%d.%d.%d", a, b, c, d);
|
||||
*port = pa * 256 + pb;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int FtpUpload(int threadID,char *name, void *buf, int len)
|
||||
{
|
||||
int ret;
|
||||
char ipaddr[32];
|
||||
int port;
|
||||
|
||||
//查询数据地址
|
||||
ret=FtpEnterPasv(threadID,ipaddr, &port);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret=SocketConnect(m_socket_data[threadID], ipaddr, port);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
//准备上传
|
||||
sprintf(m_send_buffer[threadID], "STOR %s\r\n", name);
|
||||
ret = FtpSendCommand(threadID,m_send_buffer[threadID]);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 150)
|
||||
{
|
||||
SocketClose(m_socket_data[threadID]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//开始上传
|
||||
ret = SocketSend(m_socket_data[threadID], buf, len);
|
||||
if(ret != len)
|
||||
{
|
||||
printf("send data error!\r\n");
|
||||
SocketClose(m_socket_data[threadID]);
|
||||
return 0;
|
||||
}
|
||||
SocketClose(m_socket_data[threadID]);
|
||||
|
||||
//上传完成,等待回应
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
return (ret==226);
|
||||
}
|
||||
|
||||
int FtpDownload(int threadID,char *name, void *buf, int len)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
char ipaddr[32];
|
||||
int port;
|
||||
|
||||
//查询数据地址
|
||||
ret = FtpEnterPasv(threadID,ipaddr, &port);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
printf("m_socket_data[threadID]=%d,threadID=%d\n",m_socket_data[threadID],threadID);
|
||||
//连接数据端口
|
||||
ret = SocketConnect(m_socket_data[threadID], ipaddr, port);
|
||||
if(ret != 1)
|
||||
{
|
||||
printf("failed to connect data port\r\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//准备下载
|
||||
sprintf(m_send_buffer[threadID], "RETR %s\r\n", name);
|
||||
ret = FtpSendCommand(threadID,m_send_buffer[threadID]);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 150)
|
||||
{
|
||||
SocketClose(m_socket_data[threadID]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//开始下载,读取完数据后,服务器会自动关闭连接
|
||||
for(i=0; i<len; i+=ret)
|
||||
{
|
||||
ret = SocketRecv(m_socket_data[threadID], ((char *)buf) + i, len);
|
||||
printf("download %d/%d.,threadID=%d\r\n", i + ret, len,threadID);
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("download was interrupted.\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
//下载完成
|
||||
printf("download %d/%d bytes complete.,threadID=%d\r\n", i, len,threadID);
|
||||
// FILE *fp = NULL;
|
||||
|
||||
// fp = fopen(name+1, "wb");
|
||||
// fwrite(buf,len,1,fp);
|
||||
// fclose(fp);
|
||||
|
||||
SocketClose(m_socket_data[threadID]);
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
return (ret==226);
|
||||
}
|
||||
|
||||
int FtpFileSize(int threadID,char *name)
|
||||
{
|
||||
int ret;
|
||||
int size;
|
||||
sprintf(m_send_buffer[threadID],"SIZE %s\r\n",name);
|
||||
ret = FtpSendCommand(threadID,m_send_buffer[threadID]);
|
||||
if(ret != 1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 213)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
size = atoi(m_recv_buffer[threadID] + 4);
|
||||
return size;
|
||||
}
|
||||
|
||||
int FtpLogin(int threadID,char *addr, int port, char *username, char *password)
|
||||
{
|
||||
int ret;
|
||||
printf("connect...,threadID=%d\r\n",threadID);
|
||||
ret = SocketConnect(m_socket_cmd[threadID], addr, port);
|
||||
if(ret != 1)
|
||||
{
|
||||
printf("connect server failed!\r\n");
|
||||
return 0;
|
||||
}
|
||||
printf("connect ok.,threadID=%d\r\n",threadID);
|
||||
//等待欢迎信息
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 220)
|
||||
{
|
||||
printf("bad server, ret=%d!\r\n", ret);
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("login...threadID=%d\r\n",threadID);
|
||||
//发送USER
|
||||
sprintf(m_send_buffer[threadID], "USER %s\r\n", username);
|
||||
ret = FtpSendCommand(threadID,m_send_buffer[threadID]);
|
||||
if(ret != 1)
|
||||
{
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 331)
|
||||
{
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//发送PASS
|
||||
sprintf(m_send_buffer[threadID], "PASS %s\r\n", password);
|
||||
ret = FtpSendCommand(threadID,m_send_buffer[threadID]);
|
||||
if(ret != 1)
|
||||
{
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 230)
|
||||
{
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
return 0;
|
||||
}
|
||||
printf("login success.threadID=%d\r\n",threadID);
|
||||
|
||||
//设置为二进制模式
|
||||
ret = FtpSendCommand(threadID,"TYPE I\r\n");
|
||||
if(ret != 1)
|
||||
{
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
return 0;
|
||||
}
|
||||
ret = FtpRecvRespond(threadID,m_recv_buffer[threadID], 1024);
|
||||
if(ret != 200)
|
||||
{
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void FtpQuit(int threadID)
|
||||
{
|
||||
FtpSendCommand(threadID,"QUIT\r\n");
|
||||
SocketClose(m_socket_cmd[threadID]);
|
||||
}
|
||||
|
||||
void FtpInitCmd(int threadID)
|
||||
{
|
||||
m_socket_cmd[threadID] = SocketCreate();
|
||||
}
|
||||
|
||||
void FtpInitData(int threadID){
|
||||
m_socket_data[threadID]= SocketCreate();
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: ftp_client.h
|
||||
* @brief: ftp client tool
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/9/16
|
||||
*/
|
||||
|
||||
#ifndef FTP_CLIENT_H
|
||||
#define FTP_CLIENT_H
|
||||
|
||||
#define THREAD_NUM 10
|
||||
|
||||
/* init ftp cmd socket */
|
||||
void FtpInitCmd(int threadID);
|
||||
|
||||
/* init ftp data socket */
|
||||
void FtpInitData(int threadID);
|
||||
|
||||
/* quit ftp */
|
||||
void FtpQuit(int threadID);
|
||||
|
||||
/* fpt login */
|
||||
int FtpLogin(int threadID,char *addr, int port, char *username, char *password);
|
||||
|
||||
/* get file size */
|
||||
int FtpFileSize(int threadID,char *name);
|
||||
|
||||
/* ftp download file*/
|
||||
int FtpDownload(int threadID,char *name, void *buf, int len);
|
||||
|
||||
/*ftp upload*/
|
||||
int FtpUpload(int threadID,char *name, void *buf, int len);
|
||||
#endif
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: my_socket.c
|
||||
* @brief: a abstract socket api
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/9/16
|
||||
*/
|
||||
|
||||
#include "my_socket.h"
|
||||
#include <sockets.h>
|
||||
#include <def.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
int SocketCreate(void){
|
||||
return socket(AF_INET,SOCK_STREAM,0);
|
||||
}
|
||||
|
||||
int SocketConnect(int sock, const char *addr, int port){
|
||||
// unsigned int iRemoteAddr = 0;
|
||||
struct sockaddr_in stRemoteAddr = {0}; //对端,即目标地址信息
|
||||
|
||||
stRemoteAddr.sin_family = AF_INET;
|
||||
stRemoteAddr.sin_port = htons(port);
|
||||
stRemoteAddr.sin_addr.s_addr = inet_addr(addr);
|
||||
int res = connect(sock,(struct sockaddr *)&stRemoteAddr,sizeof(stRemoteAddr));
|
||||
if(res == -1){
|
||||
printf("error:%d,str error:%s\n",errno,strerror(errno));
|
||||
}
|
||||
return res == 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
int SocketSend(int sock, void *data, int len){
|
||||
return send(sock,data,len,0);
|
||||
}
|
||||
|
||||
int SocketRecv(int sock, void *data, int len){
|
||||
return recv(sock,data,len,0);
|
||||
}
|
||||
|
||||
void SocketClose(int sock){
|
||||
close(sock);
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file my_socket.h
|
||||
* @brief a abstract socket api
|
||||
* @version 1.0
|
||||
* @author bdislab_final
|
||||
* @date 2023/9/16
|
||||
*/
|
||||
|
||||
#ifndef MYSOCKET_H
|
||||
#define MYSOCKET_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/* create a socket */
|
||||
int SocketCreate(void);
|
||||
|
||||
/* connect a socket */
|
||||
int SocketConnect(int sock, const char *addr, int port);
|
||||
|
||||
/* send data through socket*/
|
||||
int SocketSend(int sock, void *data, int len);
|
||||
|
||||
/* receive data from socket*/
|
||||
int SocketRecv(int sock, void *data, int len);
|
||||
|
||||
/* close socket*/
|
||||
void SocketClose(int sock);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash
|
||||
for i in {1..10}
|
||||
do
|
||||
dd if=/dev/zero of="file$i" bs=4K count=1
|
||||
done
|
||||
|
|
@ -0,0 +1 @@
|
|||
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
|
|
@ -0,0 +1,251 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: server.c
|
||||
* @brief: a ftpserver
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/10/11
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define THREAD_NUM 10000 // thread num
|
||||
static int isBinary = 0; // transmit binary data
|
||||
static int port = 9992; // service port
|
||||
static int dataPort = 9993; // the port for file download
|
||||
static char order[4]; // receive order
|
||||
static char param[20]; // receive order param
|
||||
static char *respMessage; // respose message
|
||||
static int serverFd; // the server fd for deal with order requests
|
||||
static int dataServerFd; // the server fd for file download
|
||||
sem_t mutex; // mutex lock
|
||||
struct Data{ // 线程间通信传输的数据
|
||||
char fileName[20]; // file name
|
||||
int type; // 0:download 1:upload
|
||||
sem_t isDone; // complete file downlaod
|
||||
sem_t isReady; // 文件准备好了
|
||||
} data;
|
||||
|
||||
void RecvData(int clientFd,char param[20]){
|
||||
recv(clientFd,param,20,0);
|
||||
for(int i = 0;i < 20;++i){
|
||||
if(param[i] == '\r'){
|
||||
param[i] = '\0';
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void SendMessage(int clientFd, char * respMessage){
|
||||
int len = 0;
|
||||
while(respMessage[len] != '\n'){
|
||||
len++;
|
||||
}
|
||||
send(clientFd,respMessage,len+1,0);
|
||||
}
|
||||
|
||||
int CreateServer(int port,int type) {
|
||||
int serverFd = 0;
|
||||
struct sockaddr_in serverAddr = {0};
|
||||
socklen_t socklen = 0;
|
||||
serverFd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if(0 > serverFd)
|
||||
{
|
||||
printf("创建socket失败\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(type == 0){
|
||||
printf("in ftp server:serverFd=%d\n",serverFd);
|
||||
}else{
|
||||
printf("in ftp data server:serverFd=%d\n",serverFd);
|
||||
}
|
||||
serverAddr.sin_family = AF_INET;
|
||||
serverAddr.sin_port = htons(port);
|
||||
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
|
||||
if(0 > bind(serverFd, (void *)&serverAddr, sizeof(serverAddr)))
|
||||
{
|
||||
printf("绑定失败!\n");
|
||||
return 0;
|
||||
}
|
||||
if(0 > listen(serverFd, 1024))
|
||||
{
|
||||
printf("监听失败!\n");
|
||||
return 0;
|
||||
}
|
||||
return serverFd;
|
||||
}
|
||||
|
||||
// receive file's data
|
||||
void* UpLoadServer(void * args){
|
||||
int clientFd = *(int *) args;
|
||||
char buf[4096];
|
||||
int ret = recv(clientFd,buf,4096,0);
|
||||
printf("ret=%d,errno=%d\n",ret,errno);
|
||||
FILE * file = fopen(data.fileName,"wb");
|
||||
fwrite(buf,4096,1,file);
|
||||
fclose(file);
|
||||
printf("upload complete for client: clientFd=%d,tid=%ld\n",clientFd,pthread_self());
|
||||
// notify for file download complete
|
||||
sem_post(&data.isDone);
|
||||
close(clientFd);
|
||||
}
|
||||
|
||||
// send file's data
|
||||
void* DownLoadServer(void * args){
|
||||
int clientFd = *(int *) args;
|
||||
char buf[4096];
|
||||
FILE * file = fopen(data.fileName,"rb");
|
||||
fread(buf,4096,1,file);
|
||||
send(clientFd,buf,sizeof(buf),0);
|
||||
fclose(file);
|
||||
printf("download complete for client: clientFd=%d,tid=%ld\n",clientFd,pthread_self());
|
||||
// notify for file download complete
|
||||
sem_post(&data.isDone);
|
||||
close(clientFd);
|
||||
}
|
||||
|
||||
// accept a client and new a thread for downlaod/upload
|
||||
void* DataServer(void * args){
|
||||
dataServerFd = CreateServer(dataPort,1);
|
||||
while(1){
|
||||
// wait for a filename
|
||||
sem_wait(&data.isReady);
|
||||
struct sockaddr_in clientAdrr = {0};
|
||||
int socketLen = sizeof(clientAdrr);
|
||||
int clientFd = accept(dataServerFd,(struct sockaddr *)&clientAdrr,&socketLen);
|
||||
pthread_t thread;
|
||||
if(data.type == 0){ // download
|
||||
printf("accept a client for file download: clientFd=%d,tid=%ld\n",clientFd,pthread_self());
|
||||
pthread_create(&thread,NULL,&DownLoadServer,&clientFd);
|
||||
}else if(data.type == 1){ // upload
|
||||
printf("accept a client for file upload: clientFd=%d,tid=%ld\n",clientFd,pthread_self());
|
||||
pthread_create(&thread,NULL,&UpLoadServer,&clientFd);
|
||||
}
|
||||
// release lock
|
||||
sem_post(&mutex);
|
||||
}
|
||||
}
|
||||
|
||||
// deal with order requests
|
||||
void* OrderServer(void * args){
|
||||
int clientFd = *(int *)args;
|
||||
printf("in OrderServer thread: tid=%ld\n",pthread_self());
|
||||
// order format: USER anonymous\r\n
|
||||
// response code format: 213 4096\r\n
|
||||
while(1){
|
||||
recv(clientFd,order,4,0);
|
||||
printf("order=%s,tid=%ld\n",order,pthread_self());
|
||||
if(strcmp(order,"USER") == 0){
|
||||
RecvData(clientFd,param);
|
||||
if(strcmp(param," anonymous") == 0){
|
||||
respMessage = "331 Please specify the password.\r\n";
|
||||
SendMessage(clientFd,respMessage);
|
||||
}
|
||||
}else if(strcmp(order,"PASS") == 0){
|
||||
RecvData(clientFd,param);
|
||||
if(strcmp(param," anonymous") == 0){
|
||||
respMessage = "230 Login successful.\r\n";
|
||||
SendMessage(clientFd,respMessage);
|
||||
printf("login successful in clientFd %d,tid=%ld\n",clientFd,pthread_self());
|
||||
}
|
||||
}else if(strcmp(order,"TYPE") == 0){
|
||||
RecvData(clientFd,param);
|
||||
if(strcmp(param," I") == 0){
|
||||
isBinary = 1;
|
||||
respMessage = "200 Switching to Binary mode.\r\n";
|
||||
SendMessage(clientFd,respMessage);
|
||||
}
|
||||
}else if(strcmp(order,"SIZE") == 0){
|
||||
RecvData(clientFd,param);
|
||||
respMessage = "213 4096\r\n";
|
||||
SendMessage(clientFd,respMessage);
|
||||
}else if(strcmp(order,"PASV") == 0){
|
||||
sem_wait(&mutex); // 锁竞争
|
||||
sem_init(&data.isDone,0,0);
|
||||
RecvData(clientFd,param);
|
||||
char buf[50];
|
||||
sprintf(buf,"227 Entering passive mode (8,140,53,225,%d,%d).\r\n",dataPort/256,dataPort%256);
|
||||
respMessage = buf;
|
||||
SendMessage(clientFd,respMessage);
|
||||
}else if(strcmp(order,"RETR") == 0){
|
||||
RecvData(clientFd,param);
|
||||
sprintf(data.fileName,"./data/%s",param+2);
|
||||
data.type = 0;
|
||||
// notify the thread of waiting fileName
|
||||
sem_post(&data.isReady);
|
||||
char buf[70];
|
||||
sprintf(buf,"150 Opening Binary mode data connection for %s (4096 bytes).\r\n",param+1);
|
||||
respMessage = buf;
|
||||
SendMessage(clientFd,respMessage);
|
||||
// wait for download complete
|
||||
printf("wait for download complete,tid=%ld\n",pthread_self());
|
||||
sem_wait(&data.isDone);
|
||||
respMessage = "226 Transfer complete.\r\n";
|
||||
SendMessage(clientFd,respMessage);
|
||||
}else if(strcmp(order,"STOR") == 0){
|
||||
RecvData(clientFd,param);
|
||||
sprintf(data.fileName,"./out/%s",param+1);
|
||||
data.type = 1;
|
||||
// notify the thread of waiting fileName
|
||||
sem_post(&data.isReady);
|
||||
char buf[70];
|
||||
sprintf(buf,"150 Opening Binary mode data connection for %s (4096 bytes).\r\n",param+1);
|
||||
respMessage = buf;
|
||||
SendMessage(clientFd,respMessage);
|
||||
// wait for upload complete
|
||||
printf("wait for upload complete,tid=%ld\n",pthread_self());
|
||||
sem_wait(&data.isDone);
|
||||
respMessage = "226 Transfer complete.\r\n";
|
||||
SendMessage(clientFd,respMessage);
|
||||
}
|
||||
else if(strcmp(order,"QUIT") == 0){
|
||||
printf("close clientFd=%d,tid=%ld\n",clientFd,pthread_self());
|
||||
close(clientFd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main(){
|
||||
serverFd = CreateServer(port,0);
|
||||
sem_init(&data.isReady,0,0);
|
||||
sem_init(&mutex,0,1);
|
||||
pthread_t thread;
|
||||
pthread_create(&thread,NULL,&DataServer,NULL);
|
||||
int clientFds[THREAD_NUM];
|
||||
int i = 0;
|
||||
while(1){
|
||||
struct sockaddr_in clientAdrr = {0};
|
||||
int socketLen = sizeof(clientAdrr);
|
||||
clientFds[i] = accept(serverFd,(struct sockaddr *)&clientAdrr,&socketLen);
|
||||
printf("accept a client:fd=%d\n",clientFds[i]);
|
||||
respMessage = "220 (myFtpServer 1.0)\r\n";
|
||||
SendMessage(clientFds[i],respMessage);
|
||||
printf("send welcome message successfully.\n");
|
||||
pthread_t thread;
|
||||
pthread_create(&thread,NULL,&OrderServer,&clientFds[i]);
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 201 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 165 KiB |
|
After Width: | Height: | Size: 264 KiB |
|
After Width: | Height: | Size: 207 KiB |
|
After Width: | Height: | Size: 350 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 336 KiB |
|
After Width: | Height: | Size: 269 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 473 KiB |
|
After Width: | Height: | Size: 331 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 208 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 199 KiB |
|
After Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 250 KiB |
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 193 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 412 KiB |
|
After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 235 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file: test_ftpclient.c
|
||||
* @brief: a ftpClient test sample
|
||||
* @version: 1.0
|
||||
* @author: bdislab_final
|
||||
* @date: 2023/9/16
|
||||
*/
|
||||
|
||||
#include "test_ftpclient_final.h"
|
||||
#include "ftp_client/ftp_client.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <transform.h>
|
||||
#include <pthread.h>
|
||||
|
||||
int threadIDs[THREAD_NUM];
|
||||
|
||||
/*one client upLoad a file of 4K*/
|
||||
void* UpLoad(void* arg){
|
||||
int *pThreadID = (int*)arg;
|
||||
printf("in thread:tid=%ld\n", pthread_self());
|
||||
FtpInitCmd(*pThreadID);
|
||||
int ret = FtpLogin(*pThreadID,"8.140.53.225", 9992, "anonymous", "anonymous");
|
||||
int size = 4096;
|
||||
char buf[size];
|
||||
char fileName[20];
|
||||
sprintf(fileName,"file%d",*pThreadID);
|
||||
for(int i = 0;i < size;++i){
|
||||
buf[i] = '0';
|
||||
}
|
||||
FtpInitData(*pThreadID); // data socket 每次下载都要重新创建,下载完都要关闭
|
||||
ret = FtpUpload(*pThreadID,fileName,buf,size);
|
||||
FtpQuit(*pThreadID);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*one client downLoad a file of 4K*/
|
||||
void* DownLoad(void* arg){
|
||||
int *pThreadID = (int*)arg;
|
||||
printf("in thread:tid=%ld\n", pthread_self());
|
||||
FtpInitCmd(*pThreadID);
|
||||
int ret = FtpLogin(*pThreadID,"8.140.53.225", 9992, "anonymous", "anonymous");
|
||||
int size;
|
||||
char *buf;
|
||||
char fileName[20] = "/file1";
|
||||
size = FtpFileSize(*pThreadID,fileName);
|
||||
buf = malloc(size);
|
||||
FtpInitData(*pThreadID); // data socket 每次下载都要重新创建,下载完都要关闭
|
||||
ret = FtpDownload(*pThreadID,fileName, buf, size);
|
||||
free(buf);
|
||||
FtpQuit(*pThreadID);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* test for 10 ftp client */
|
||||
void TestFtpClient(int argc, char* argv[])
|
||||
{
|
||||
int options = atoi(argv[1]);
|
||||
int n = atoi(argv[2]);
|
||||
pthread_t threads[THREAD_NUM];
|
||||
for(int i = 0;i < n;++i){
|
||||
threadIDs[i] = i;
|
||||
if(options == 1){ // 全部都是下载
|
||||
pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]);
|
||||
}else if(options == 2){ // 全部都是上传
|
||||
pthread_create(&threads[i],NULL,&UpLoad,&threadIDs[i]);
|
||||
}else if(options == 3){ // 随机下载/上传
|
||||
int r = rand()%2;
|
||||
if(r == 0){
|
||||
printf("===============download===============\n");
|
||||
pthread_create(&threads[i],NULL,&DownLoad,&threadIDs[i]);
|
||||
}else{
|
||||
printf("===============upload===============\n");
|
||||
pthread_create(&threads[i],NULL,&UpLoad,&threadIDs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(TestFtpClient, a ftpClient test sample, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||