Problems to use FTP with Zephyr

Hi,

I´m tryng to developer an application with nrf9161dk and i need create and upload a txt file with FTP. I´m in trouble to create the file with  <zephyr/fs/fs.h> and  <zephyr/sys/fdtable.h>. I receive a lot of errors of compiler. I also dont have idea of how use FTP in zephyr for nrf cause don´t exist any lib or example of ftp client lib or ftp api. Thanks! 

  • Hello,

    I receive a lot of errors of compiler.

    please show a screenshot or something from the compile errors.

    I also dont have idea of how use FTP in zephyr for nrf cause don´t exist any lib or example of ftp client lib or ftp api.

    How about this one? https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/libraries/networking/ftp_client.html

  • Hello,

    I forgot about this open topic. I'm back to post the solution. When I opened this topic I was a beginner in Zephyr. After some trial and errors, I solved this issue with the code below:


    static K_SEM_DEFINE(ftp_sem, 0, 1);
    
    char ftp_svr[80];
    char ftp_path[80];
    char ftp_user[50];
    char ftp_pass[50];
    uint16_t ftp_port = 21;	 
    char remote_path[128] = "/"; 
    char ftp_string_to_send[300] = "File Content Here"; 
    
    void ftp_ctrl_callback(const uint8_t *msg, uint16_t len)
    {
    	LOG_INF("%s", msg);
    	/* Release semaphore when receiving answer from server */
    	k_sem_give(&ftp_sem);
    }
    
    void ftp_data_callback(const uint8_t *msg, uint16_t len)
    {
    	LOG_INF("%s", msg);
    }
    
    static void ftp_send_data(void)
    {
    	char file_name[100];
    
    	int err = snprintf(ftp_string_to_send, sizeof(ftp_string_to_send) - 1, "File Content Here");
    
    	// Deactivate psm and edrx to don´t interfere with the FTP transmission (optional)
    	lte_lc_psm_req(false);
    	lte_lc_edrx_req(false);
    
    	// Initialize FTP Client
    	int ret = ftp_init(ftp_ctrl_callback, ftp_data_callback);
    	if (ret)
    	{
    		LOG_ERR("FTP Client initialization failed: %d\n", ret);
    		return;
    	}
    
    	// Conect to FTP server
    	ret = ftp_open(ftp_svr, ftp_port, -1);
    	if (ret < 0)
    	{
    		LOG_ERR("Failed to open an FTP connection: %d\n", ret);
    		ftp_close();
    		return;
    	}
    
    	// Wait server response
    	k_sem_take(&ftp_sem, K_FOREVER);
    
    	// Login on FTP server
    	ret = ftp_login(ftp_user, ftp_pass);
    	if (ret < 0)
    	{
    		LOG_ERR("Login to FTP server failed: %d\n", ret);
    		ftp_close();
    		return;
    	}
    
    	// Wait server response
    	k_sem_take(&ftp_sem, K_FOREVER);
    
    	// Get server status
    	ret = ftp_status();
    	if (ret < 0)
    	{
    		LOG_ERR("Requesting server status failed: %d\n", ret);
    		ftp_close();
    		return;
    	}
    
    	// Wait server response
    	k_sem_take(&ftp_sem, K_FOREVER);
    
    	// Config remote Path
    	if (strlen(remote_path) > 0)
    	{
    		LOG_INF("Changing remote directory to: %s\n", remote_path);
    		ret = ftp_cwd(remote_path);
    		if (ret < 0)
    		{
    			LOG_ERR("Failed to change remote directory: %d\n", ret);
    			ftp_close();
    			return;
    		}
    
    		// Wait server response
    		k_sem_take(&ftp_sem, K_FOREVER);
    	}
    
    	// Define transfer mode (ASCII ou BINARY)
    	LOG_INF("Setting transfer type to ASCII...\n");
    	ret = ftp_type(FTP_TYPE_ASCII);
    	if (ret < 0)
    	{
    		LOG_ERR("Failed to set transfer type: %d\n", ret);
    		ftp_close();
    		return;
    	}
    
    	// Wait server response
    	k_sem_take(&ftp_sem, K_FOREVER);
    
    	// FILE UPLOAD
    	LOG_INF("Uploading file to FTP server...\n");
    
    	ret = ftp_put(file_name, (const uint8_t *)ftp_string_to_send, strlen(ftp_string_to_send), FTP_PUT_NORMAL);
    	if (ret < 0)
    	{
    		LOG_ERR("FTP file upload failed: %d\n", ret);
    		ftp_close();
    		return;
    	}
    	else
    	{
    		LOG_INF("File uploaded successfully.\n");
    	}
    
    	// Wait server response
    	k_sem_take(&ftp_sem, K_FOREVER);
    
    	// Close FTP connection
    	ret = ftp_close();
    	if (ret < 0)
    	{
    		LOG_ERR("Disconnecting from server failed: %d\n", ret);
    	}
    
    	// Wait server response
    	k_sem_take(&ftp_sem, K_FOREVER);
    
    	LOG_INF("Disconnected from FTP server.\n");
    
    	// Activate PSM e eDRX 
    	lte_lc_psm_req(true);
    	lte_lc_edrx_req(true);
    }

    What I and many developers need sometimes is just an example. It would be nice to have this in the FTP documentation.

    Best regards,

    Felipe Dantas

Related