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
- 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, committed 2015-07-21
- Comitter:
- Ricky_Kwon
- Date:
- Tue Jul 21 17:33:35 2015 +0000
- Child:
- 1:7d428f360a0a
- Commit message:
- FTP+CAMERA
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CameraC328.lib Tue Jul 21 17:33:35 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/shintamainjp/code/CameraC328/#49cfda6c547f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Tue Jul 21 17:33:35 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/mbed_official/code/SDFileSystem/#7b35d1709458
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIZnetInterface.lib Tue Jul 21 17:33:35 2015 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/WIZnet/code/WIZnetInterface_Ricky/#5a1969320666
--- /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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-src.lib Tue Jul 21 17:33:35 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-src/#523654f2b367