====== Serial Datalogger ====== This Script can be used to a read from the serial interface and store the data in a file. It will create new files periodicly with a timestamp in the file name to have smaller files to handle. You can combine this with the uploader.are script from the [[sdk:connection-statistics|Connection Statistics]] Page to upload the files to a ftp server. The Storage folder can befound via scp at /home/sdk/sandbox/ {{ :sdk:screenshot_-_06212017_-_03_07_05_pm.png?nolink |}} ===== Configuration ===== Please set the serial-interface into "SDK" {{ :sdk:screenshot_-_06212017_-_02_51_41_pm.png?nolink |}} Starting in Line 115 you will find a few lines with configurationsparameter for the directory to store the files in, the new file intervall and the serial port. l = new logger("/datalogger/"); l.logfileIntervall=60; //create a new file every minute // Setting for 115200 8N1 NHW Flow Control DEV = "SERIAL1"; BAUD = 115200; DATABIT = 8; STOPBIT = 1; PARITY = 0; FLOWCTL = 0; READ_TIMEOUT = 5; /* seconds */ ===== Usage ===== Combine the script with the eventbased trigger "sdk-startup" into a job ===== The Script ===== /* DESC: A Script that can be used for a longtime serial port data logging of a NetModule Wireless Router. * The upper part of the script is the logger template. * The lower part is the real programm, where you describe the settings and workflow. * Copyright (C) 2014 NetModule AG, Switzerland */ template logger { workfile="current.log"; currentFilename=""; currentLogStart=0; // the current logfile was startet at this time logfileIntervall=3600; //new logfile every # seconds //due to the fact that we cannot see the amount of free space in the sdk // we need to improvise and add up the current filesizes currentLogSize=0; //in Bytes maxLogSize=15000000; //in Bytes freespace=1000000; //in Bytes # give the constructor the absolute path to store the Loggs into void logger(string path) { dh=opendir(path); if(dh == -1) { if ( mkdir(path,0666) == -1 ) { nb_syslog("Could not create dir: %s. Exiting",path); exit(1); } else { nb_syslog("Created Logging directory: %s",path); } } else { nb_syslog("directory already existent: %s", path); closedir(dh); } this.path = path; this.fields = mkarray(); this.currentFilename=strftime("%Y%m%d_%H%M%S_start.log",localtime(time())); } int jiffy() { sys = sysinfo(); u = struct_get(sys, "uptime"); if (is_void(u) || u < 1) { return 0; } else { return u; } } int newLogfile() { // check if file if we have a work file an rename it to currentFile fd=fopen(sprintf("%s%s", this.path,this.workfile),"r" ); if(fd) { // we have a current workfile lets rename it fclose(fd); if(!rename(sprintf("%s%s",this.path,this.workfile), sprintf("%s%s",this.path,this.currentFilename))){ nb_syslog("Could not rename %s to %s, %s will be deleted",this.workfile, this.currentFilename,this.workfile); remove(sprintf("%s%s",this.path,this.workfile)); return 1; } } //set new current Filename as we stored the old one away this.currentFilename=strftime("%Y%m%d_%H%M%S.log",localtime(time())); this.currentLogStart=this.jiffy(); // create nee workfile fd=fopen(sprintf("%s%s", this.path,this.workfile),"a" ); if (fd < 0 ) { nb_syslog("could not open file %s%s", this.path, this.workfile); } fclose(fd); return 0; } int addDataToFile(string line) { fd=fopen(sprintf("%s%s", this.path,this.workfile),"a" ); if (fd < 0 ) { nb_syslog("could not open file %s%s", this.path, this.workfile); } if(!fwrite(fd,sprintf("%s",line))) { nb_syslog("writing of line to file: %s%s:", this.path,this.workfile); fclose(fd); return -1; } else { fclose(fd); return 0; } } int logNow(string serialdata) { if(this.addDataToFile(serialdata) == -1 ) { nb_syslog("writing of line to file failed: %s%s:", this.path,this.workfile); return -1; } else { return 0; } } } // of template logger //########################################################################################### //########################################################################################### //################# The Real Rutime ############################################## //########################################################################################### //########################################################################################### l = new logger("/datalogger/"); l.logfileIntervall=60; //create a new file every minute // Setting for 115200 8N1 NHW Flow Control DEV = "SERIAL1"; BAUD = 115200; DATABIT = 8; STOPBIT = 1; PARITY = 0; FLOWCTL = 0; READ_TIMEOUT = 5; /* seconds */ l.newLogfile(); /* check serial port config */ st = nb_config_get("serial.0.status"); if (st != "2") { nb_syslog("Serial port is not enabled for us. Please set Interface->Serial to SDK"); exit(1); } /* set attributes */ ret = nb_serial_setattr(DEV, BAUD, DATABIT, STOPBIT, PARITY, FLOWCTL); if (ret != 0) { nb_syslog("Could not set serial attributes: %i \n",ret); exit(1); } /* open serial port */ fd = nb_serial_open(DEV); if (fd < 0) { nb_syslog("Unable to open %s\n", DEV); exit(1); } // thats the main loop while (true) { // wait for serial input rc = select(fd, READ_TIMEOUT); if (rc == -1) { nb_syslog("ERROR: select failed\n"); } else if (rc == 0) { /* nothing received */ } else { /* received something */ msg = read(fd, 1024); if (strlen(msg) > 0 ) { l.logNow(msg); } } // lets see if we need a new logfile if (l.currentLogStart+l.logfileIntervall