Using Camera module, FTP Client on WIZwiki-W7500, send the image data to FTP Server.

Dependencies:   CameraC328 SDFileSystem WIZnetInterface mbed-src

Prerequisite

This example send the image data acquired from the camera to an FTP Server.

To implement this function, you need a Platform board, network Interface board, camera module.

Available camera modules are C328, LJ-DSC02. Because the cameras listed above all have similar internal protocols.

This example uses LJ-DSC02.

  • WIZwiki-W7500 from WIZnet (Platform board and Ethernet I/F board)
  • LJ-DSC02 (Camera module)
  • FTP Server(AL FTP)
  • Micro SD Card

Hardware Configuration

/media/uploads/Ricky_Kwon/camera.png

  • connect Ethernet Cable & USB Cable
  • connect Camera module

Software

Init FTP Server information

static char ID[]={"abc"};                   //Set FTPServer Login ID
static char PASSWORD[]={"123"};             //Set FTPServer Login Password
const char ftpServer_control_ip_addr[] = "192.168.1.2";

Caution

Must fix FTP server ip, id, pass

Revision:
0:27fe09e9f405
Child:
1:7d428f360a0a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jul 21 17:33:35 2015 +0000
@@ -0,0 +1,313 @@
+#include "mbed.h"
+#include "SDFileSystem.h"
+#include "EthernetInterface.h"
+#include "CameraC328.h"
+
+/* CAMERA */
+#define USE_JPEG_HIGH_RESOLUTION  1
+
+/* FTP */
+#define USER                "user "
+#define PASS                "pass "
+#define PASV                "pasv "
+#define PORT                "port "
+#define LIST                "list "
+#define STOR                "stor "
+#define RETR                "retr "
+#define END                 "\r\n"
+#define FTP_SERVER_PORT     21
+#define MAX_SS              256
+bool gDataSockReady = false;
+bool gDataPutGetStart = false;
+bool ftpclientrun = false;
+int remote_port;
+char ftpServer_data_ip_addr[4]={0,};
+char ftpServer_data_ip_addr_str[20]={0,};
+static char buf[256];
+enum CommandFirst {
+    f_nocmd,
+    f_dir,
+    f_put,
+    f_get,
+};
+enum CommandSecond {
+    s_nocmd,
+    s_dir,
+    s_put,
+    s_get,
+};
+enum ftpc_datasock_state{
+    DATASOCK_IDLE,
+    DATASOCK_READY,
+    DATASOCK_START
+};
+struct Command {
+    enum CommandFirst First;
+    enum CommandSecond Second;
+};
+struct ftpc {
+    enum ftpc_datasock_state dsock_state;
+};
+struct ftpc FTPClient;
+struct Command FTPCommand;
+
+/* SD Card filesystem */
+SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500 
+/* UART */
+Serial pc(USBTX, USBRX);
+char gMsgBuf[10];
+int User_Keyboard_MSG_Cnt;
+/* CAMERA */
+static const int CAPTURE_FRAMES = 1;
+static FILE *fp_jpeg;
+char fname[32];
+char fname_server[16];
+CameraC328 camera(PA_13, PA_14, CameraC328::Baud115200);
+/* Fuction*/ 
+char* User_Keyboard_MSG(void);
+int pportc(char * arg);
+void jpeg_callback(char *buf, size_t siz);
+void sync(void);
+void test_jpeg_snapshot_picture(void);
+
+int main() {
+
+    char Msg_c;
+    int size;
+    int remain_datasize;
+    int remain_filesize;
+    int send_byte;
+    
+    
+    pc.baud(115200);
+    
+    pc.printf("Hello Home Security World!\r\n"); 
+      
+    uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x12, 0x34, 0x45};
+    const char ip_addr[] = "192.168.0.123"; 
+    const char mask_addr[] = "255.255.255.0"; 
+    const char gateway_addr[] = "192.168.0.1"; 
+    const char ftpServer_control_ip_addr[] = "192.168.0.230";
+    
+    
+    EthernetInterface eth;
+    eth.init(mac_addr, ip_addr, mask_addr, gateway_addr); //Use Static
+    eth.connect();
+    
+    TCPSocketConnection FTP_CONTROL_SOCK;
+    TCPSocketConnection FTP_DATA_SOCK;
+    
+    sync();
+    //while 1
+    while(true)
+    {
+        if(pc.getc()==0x31){
+            
+            test_jpeg_snapshot_picture();
+            ftpclientrun = true;
+            while(ftpclientrun){
+                //while 2
+                while(!FTP_CONTROL_SOCK.is_connected()){
+                    pc.printf("Connecting...FTPServer\r\nIP:%s, PORT:%d\r\n", ftpServer_control_ip_addr, FTP_SERVER_PORT);
+                    FTP_CONTROL_SOCK.connect(ftpServer_control_ip_addr, FTP_SERVER_PORT);
+                    FTP_CONTROL_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s
+                }//end of while 2
+                
+                //while 3
+                while(true)
+                {  
+                    //gDataSockReady if
+                    if(gDataSockReady){
+                        gDataSockReady = false;
+                        //FTPCommand.First switch case
+                        switch(FTPCommand.First){
+                            case f_put:
+                                FTP_CONTROL_SOCK.send(STOR, sizeof(STOR)-1);
+                                FTP_CONTROL_SOCK.send(fname_server, sizeof(fname_server));
+                                FTP_CONTROL_SOCK.send(END, sizeof(END)-1);
+                                break;
+                        }//end of FTPCommand.First switch case
+                    }//end of gDataSockReady if          
+                    /* received from FTPServer */
+                    int n = FTP_CONTROL_SOCK.receive(buf, sizeof(buf));
+                    if (n <= 0) break;
+                    buf[n] = '\0';
+                    pc.printf("Received message from server: '%s' \n", buf);
+                    
+                    //buf if
+                    if (!strncmp(buf, "220", 3)){
+                        pc.printf("\r\nInput your User ID > ");
+                        FTP_CONTROL_SOCK.send(USER, sizeof(USER)-1);
+                        //FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1);
+                        FTP_CONTROL_SOCK.send(END, sizeof(END)-1);
+                    }
+                    else if(!strncmp(buf, "331", 3)){
+                        pc.printf("\r\nInput your Password > ");
+                        FTP_CONTROL_SOCK.send(PASS, sizeof(PASS)-1);
+                        //FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1);
+                        FTP_CONTROL_SOCK.send(END, sizeof(END)-1);        
+                    }
+                    else if(!strncmp(buf, "230", 3)){
+                        FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1);
+                        FTP_CONTROL_SOCK.send(END, sizeof(END)-1);
+                        FTPCommand.First = f_put;    
+                    }
+                    else if(!strncmp(buf, "227", 3)){
+                        if (pportc(buf) == -1){
+                            pc.printf("Bad port syntax\r\n");
+                        }
+                        else{
+                            pc.printf("Go Open Data Sock...\r\n ");
+                            FTPClient.dsock_state = DATASOCK_READY;
+                        }    
+                    }
+                    else if(!strncmp(buf, "150", 3)){
+                        switch(FTPCommand.First){
+                        case f_put:
+                            FTPCommand.First = f_nocmd;
+                            FTPCommand.Second = s_put;
+                            gDataPutGetStart = true;
+                            break;
+                        }  
+                    }
+                    else if(!strncmp(buf, "226", 3)){
+                        ftpclientrun = false;  
+                        FTP_CONTROL_SOCK.close();       
+                    }//end of buf if
+                    
+                    
+                    //DATASOCK_READY if
+                    if(FTPClient.dsock_state == DATASOCK_READY){
+                        while(!FTP_DATA_SOCK.is_connected()){
+                            pc.printf("Connecting...FTPServer Data sock\r\nIP:%s, PORT:%d\r\n", ftpServer_data_ip_addr_str, remote_port);
+                            FTP_DATA_SOCK.connect(ftpServer_control_ip_addr, remote_port);
+                            FTP_DATA_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s
+                        }
+                        FTPClient.dsock_state = DATASOCK_IDLE;
+                        gDataSockReady = true;
+                    }//end of DATASOCK_READY if
+                    
+                    //gDataPutGetStart if
+                    if(gDataPutGetStart){
+                        //FTPCommand.Second switch case
+                        switch(FTPCommand.Second){   
+                        case s_put:
+                            pc.printf("put waiting...\r\n");
+                            fp_jpeg = fopen(fname, "r");  
+                            fseek(fp_jpeg, 0, SEEK_END);            // seek to end of file
+                            remain_filesize = ftell(fp_jpeg);       // get current file pointer
+                            fseek(fp_jpeg, 0, SEEK_SET);            // seek back to beginning of file                
+                            do{
+                                memset(buf, 0, sizeof(buf));
+                                if(remain_filesize > MAX_SS)
+                                    send_byte = MAX_SS;
+                                else
+                                    send_byte = remain_filesize;
+                                fread (buf, 1, send_byte, fp_jpeg);
+                                FTP_DATA_SOCK.send(buf, send_byte);
+                                remain_filesize -= send_byte;
+                                pc.printf("#");
+                            }while(remain_filesize!=0);
+                            fclose(fp_jpeg);
+                            gDataPutGetStart = false; 
+                            FTPCommand.Second = s_nocmd;     
+                            FTP_DATA_SOCK.close(); 
+                            break;   
+                                
+                        }//end of FTPCommand.Second switch case
+                    }//end of gDataPutGetStart if
+                }//end of while 3                
+            }
+        }
+    }//end of while 1
+}
+char* User_Keyboard_MSG(void)
+{
+    User_Keyboard_MSG_Cnt = 0;
+    memset(gMsgBuf, 0, sizeof(gMsgBuf));
+    do{
+        gMsgBuf[User_Keyboard_MSG_Cnt] = pc.getc();
+        if(gMsgBuf[User_Keyboard_MSG_Cnt]==0x08){
+            User_Keyboard_MSG_Cnt--;
+        }
+        else{
+            User_Keyboard_MSG_Cnt++; 
+        }
+    }while(gMsgBuf[User_Keyboard_MSG_Cnt-1]!=0x0d);
+    return gMsgBuf;
+}
+int pportc(char * arg)
+{
+    int i;
+    char* tok=0;
+    strtok(arg,"(");
+    for (i = 0; i < 4; i++)
+    {
+        if(i==0) tok = strtok(NULL,",\r\n");
+        else     tok = strtok(NULL,",");
+        ftpServer_data_ip_addr[i] = (uint8_t)atoi(tok);
+        if (!tok){
+            pc.printf("bad pport : %s\r\n", arg);
+            return -1;
+        }
+    }
+    remote_port = 0;
+    for (i = 0; i < 2; i++){
+        tok = strtok(NULL,",\r\n");
+        remote_port <<= 8;
+        remote_port += atoi(tok);
+        if (!tok){
+            pc.printf("bad pport : %s\r\n", arg);
+            return -1;
+        }
+    }
+    pc.printf("ip : %d.%d.%d.%d, port : %d\r\n", ftpServer_data_ip_addr[0], ftpServer_data_ip_addr[1], ftpServer_data_ip_addr[2], ftpServer_data_ip_addr[3], remote_port);
+    sprintf(ftpServer_data_ip_addr_str, "%d.%d.%d.%d", ftpServer_data_ip_addr[0], ftpServer_data_ip_addr[1], ftpServer_data_ip_addr[2], ftpServer_data_ip_addr[3]);
+    return 0;
+}
+void jpeg_callback(char *buf, size_t siz) {
+    for (int i = 0; i < (int)siz; i++) {
+        fprintf(fp_jpeg, "%c", buf[i]);
+    }
+}
+void sync(void) {
+    CameraC328::ErrorNumber err = CameraC328::NoError;
+
+    err = camera.sync();
+    if (CameraC328::NoError == err) {
+        printf("[ OK ] : CameraC328::sync\n");
+    } else {
+        printf("[FAIL] : CameraC328::sync (Error=%02X)\n", (int)err);
+    }
+}
+void test_jpeg_snapshot_picture(void) {
+    CameraC328::ErrorNumber err = CameraC328::NoError;
+
+#if USE_JPEG_HIGH_RESOLUTION
+    err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
+#else
+    err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution320x240);
+#endif
+    if (CameraC328::NoError == err) {
+        printf("[ OK ] : CameraC328::init\n");
+    } else {
+        printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
+    }
+
+    for (int i = 0; i < CAPTURE_FRAMES; i++) {
+        snprintf(fname, sizeof(fname), "/sd/jpss%04d.jpg", i);
+        for(int i = 0; i < 12; i++){
+           fname_server[0+i] = fname[4+i]; 
+        }
+        fp_jpeg = fopen(fname, "w");
+
+        err = camera.getJpegSnapshotPicture(jpeg_callback);
+        if (CameraC328::NoError == err) {
+            printf("[ OK ] : CameraC328::getJpegSnapshotPicture\n");
+        } else {
+            printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\n", (int)err);
+        }
+
+        fclose(fp_jpeg);
+    }
+}
\ No newline at end of file