2012年6月15日 星期五

自動傳檔到遠方Server,並繪圖展於網頁上(from WinXP to Cygwin)



本篇是將Local(WinXP)GPS tilt資料,以SSH的協定定時將所要的資料傳到遠方Server (Cygwin),而遠端Server定時將近期的資料彙整,並用GMT軟體繪製成圖檔,放在Apache網頁的目錄下!

雖然過程的概念很簡單,但是過程中總有小小的”眉眉角角”問題不時跳出來,所以趁印象深刻,趕快紀錄下來。
 -----------------------------------------------------------------------------------------------------------------

Local(WinXP)
sendGPSTVO.batWindows批次檔整理檔案,並利用pscp上傳遠端,其中pscpPuTTY Download Page可以下載,同屬運用SSH協定軟體
 
####以下為sendGPSTVO.bat內容########
cls
@echo off
REM get previous date
set dir=C:\"GNSS Spider"\Data\RINEX\ym05\  #Data目錄
set dir2=C:\         #Data收集tmp檔放在C:\主要是當用pscp傳檔時檔名最好不要有超長檔名或空格(C:\Documents and Settings\User)
echo wscript.echo dateadd("d",-1,date) >%tmp%\tmp.vbs 
    for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
    for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
    for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k
    if %m% LSS 9 set m=0%m%
    if %d% LSS 9 set d=0%d%          
#六行是抓Windows下昨年月日,沿用網路高手,但是google完就忘記是那位高手寫的,所以無法Reference,其中第一行的"d",-1表示昨天
set t1file=%dir2%ym05_%y%%m%%d%.dat        #昨天資料改成時間檔名並放於暫存位置
set t1=%y%_%m%_%d%

echo wscript.echo dateadd("d",0,date) >%tmp%\tmp.vbs 
    for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
    for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
    for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k
    if %m% LSS 9 set m=0%m%
    if %d% LSS 9 set d=0%d%
#重複抓今天日期,本用%date:~4,4%_%date:~9,2%_%date:~12,2%方式直接擷取,但會有不同版本windows欄位的問題發生
set t0file=%dir2%ym05_%y%%m%%d%.dat
set t0=%y%_%m%_%d%

copy %dir%%t1%\*.12a %t1file%      #將檔案複製到暫存區
copy %dir%%t0%\*.12a %t0file%
echo %t1file%  %t0file%
REM transfer data to remote server
echo %t0% %time%
C:\"GNSS Spider"\Data\pscp -pw passwd %t1file% Lin@ymstvo.dyndns.org:/home/Lin/GPS/data  #將檔案傳到遠方,使用者Lin,密碼passwd,當然遠方SSH要開
C:\"GNSS Spider"\Data\pscp -pw passwd %t0file% Lin@ymstvo.dyndns.org:/home/Lin/GPS/data
del %t1file% %t0file%
################################

 
下一步用Windows排定的工作,將批次檔加入,預設頻率是每天一次,若要更快(Ex: 1小時)可以在排程的進階選項開啟
 而執行的身分最好用工作環境的使用者(本例為nancy),原本用Administrator,但是pscp硬是不執行。
排定的工作預設一定要有密碼,假如遇到必須不設密碼的情況,可以將 ”限制使用空白密碼的本機帳戶僅能登入到主控台的選項關掉即可!方法如下(WinXP為例)
[控制台]->[系統管理工具]-> [本機安全性原則]-> [帳戶:限制使用空白密碼的本機帳戶僅能登入到主控台] 改成已停用即可!
 -------------------------------------------------------------------------------------------------------------------
 
Server(Cygwin@WinXP)
首先先將CygwinSSH選項打開,方法請自行Google!
Recent7d_plotTimeS_tilt.sh整檔與繪圖,主要是繪製七天內的資料時序圖,當然GMT要在cygwin內先灌好

####以下為Recent7d_plotTimeS_tilt.sh內容########
#!/bin/bash
home=/home/Lin/GPS
gmtdir=/opt/GMT/bin/
#-------------------------------Get  Files -----------------------------
rm  $home/*.dat    #將七天內的資料複製到近端暫存,因為dateday語法還不會批次,只好呆呆一個個複製
cp $home/data/ym05_`date --date='-8 hour' +%Y%m%d`.dat $home
cp $home/data/ym05_`date --date='-1 day' +%Y%m%d`.dat $home
cp $home/data/ym05_`date --date='-2 day' +%Y%m%d`.dat $home
cp $home/data/ym05_`date --date='-3 day' +%Y%m%d`.dat $home
cp $home/data/ym05_`date --date='-4 day' +%Y%m%d`.dat $home
cp $home/data/ym05_`date --date='-5 day' +%Y%m%d`.dat $home
cp $home/data/ym05_`date --date='-6 day' +%Y%m%d`.dat $home
dos2unix $home/*.dat 
#------------------------------- Filename -----------------------------
for ifn in $home/*.dat;do
 gawk 'NR>13&&$1>0{print "20"$1"-"$2"-"$3"T"$4":"$5":"$6,$7*100,$8*100,$9}'  $ifn >>$home/ifn2.dat    #抓成GMT日期format,六七欄因為太小,先乘100
 echo ">" >>$home/ifn2.dat  #每天資料用”>”斷開,避免頭尾資料連起來與長時間斷資料也硬連起來的不合理圖示
 gawk 'NR>13&&$1>0{print $7*100,$8*100,$9}'  $ifn >>$home/ifn3.dat #抓資料極值用
done
outfile=$home/tilt.ps
img=$home/tilt.png
#---------------------------- Time Duriation and Location ----------------------------
x1=`date --date='-6 day' +%Y-%m-%d`T00:00:00    #七天圖示時間軸起點
x2=`date --date='+1 day' +%Y-%m-%d`T00:00:00   #圖示時間軸起點終點
x3=`date  +%Y-%m-%d`T00:00:00                           #今日圖示時間軸起點
t=`date  +%H:%M`                                                    #繪圖時間

#---------------------------- catch window ----------------------------
range=`"$gmtdir"minmax -I.0001 -m -C $home/ifn3.dat ` #抓資料極值
np1=`echo $range |awk '{print $1}'`   #Y軸低值
np2=`echo $range |awk '{print $2}'`   #Y軸高值
ndy=`echo $range |awk '{print ($2-$1)*10000 }' |awk '{printf("%.f", $1/100 ) }'|awk '{print $1/1000}' `
#概念是Y軸動態繪製約十個左右的label,因為資料很小,先將資料變化區間乘上10000,然後除以一百取整數,再回歸原始值
ndyy=`echo $ndy|awk '{print $1/2}'`
ep1=`echo $range |awk '{print $3}'`
ep2=`echo $range |awk '{print $4}'`
edy=`echo $range |awk '{print ($4-$3)*10000 }' |awk '{printf("%.f", $1/100 ) }'|awk '{print $1/1000}' `
edyy=`echo $edy|awk '{print $1/2}'`
tp1=`echo $range |awk '{print $5}'`
tp2=`echo $range |awk '{print $6}'`
tdy=`echo $range |awk '{print ($6-$5)*10000 }' |awk '{printf("%.f", $1/100 ) }'|awk '{print $1/1000}' `
tdyy=`echo $tdy|awk '{print $1/2}'`

#---------------------------- Plot----------------------------
#gmtset PLOT_DATE_FORMAT "yyyy-o"
"$gmtdir"gmtset ANOT_FONT_SIZE 10 FRAME_WIDTH 0.08 TICK_LENGTH 0.1c LABEL_FONT_SIZE 10
"$gmtdir"gmtset PLOT_CLOCK_FORMAT hh:mm  ANNOT_FONT_SIZE_SECONDARY 36
"$gmtdir"gmtset PLOT_DATE_FORMAT "o dd" PLOT_CLOCK_FORMAT hh:mm ANNOT_FONT_SIZE_PRIMARY +10p

echo " 6 22  228 35 5 CM T V O "|"$gmtdir"pstext -X2.5c -Y1.5c -R0/10/0/10 -G225 -JX16.5c/4c -K -N  > $outfile
gawk '{print $1,$2}' "$home"/ifn2.dat|"$gmtdir"psxy  -R$x1/$x2/$np1/$np2 -G255/0/0 -JX14cT/5c -Bpa12Hf1h/a"$ndy"f"$ndyy"g"$ndy":: -Bsa1DS/:"m Degree":WSne  -K -O -m  >> $outfile  #重點是-m參數繪製斷資料
gawk '{print $1,$3}' "$home"/ifn2.dat|"$gmtdir"psxy  -R$x1/$x2/$ep1/$ep2 -G0/0/255 -JX -Bpa12Hf1h/a"$edy"f"$edyy"g"$edy":: -Bsa1DS/:"m Degree":Wsne  -K -O -m -Y5.5c  >> $outfile
gawk '{print $1,$4}' "$home"/ifn2.dat|"$gmtdir"psxy -W1/0/255/0  -R$x1/$x2/$tp1/$tp2 -G0/255/0 -JX   -Bpa12Hf1h/a"$tdy"f"$tdyy"g"$tdy":: -Bsa1DS/:"Degree":WsNe  -K -O -m -Y5.5c  >> $outfile

gawk '{print $1,$2}' "$home"/ifn2.dat|"$gmtdir"psxy  -R$x3/$x2/$np1/$np2 -G255/0/0 -JX9.5cT/5c -Bpa3Hf1h/a"$ndy"f"$ndyy"g"$ndy":: -Bsa1DS/:"m Degree":wSnE  -K -O -m -Y9c -X15c -Y-11c>> $outfile
gawk '{print $1,$3}' "$home"/ifn2.dat|"$gmtdir"psxy  -R$x3/$x2/$ep1/$ep2 -G0/0/255 -JX       -Bpa3Hf1h/a"$edy"f"$edyy"g"$edy":: -Bsa1DS/:"m Degree":wsnE  -K -O -m -Y9c  -Y5.5c>> $outfile
gawk '{print $1,$4}' "$home"/ifn2.dat|"$gmtdir"psxy -W1/0/255/0 -R$x3/$x2/$tp1/$tp2 -G0/255/0 -JX   -Bpa3Hf1h/a"$tdy"f"$tdyy"g"$tdy":: -Bsa1DS/:"Degree":wsNE -K -O -m -Y5.5c  >> $outfile

"$gmtdir"pstext  -R0/20.2/0/20.2 -JX20.2c  -O  -N -X-15c -Y-11c <> $outfile
12.1 17.8  38 0 5 CM  YM05
.6  4.5   16 0 5 LM  Tilt N
.6 10.0   16 0 5 LM  Tilt E
.6 15.5   16 0 5 LM  Temperature
25 -1   14 0 5 CM  Made $t
END
ps2pdf $outfile $home/tilt.pdf   #這兩行將ps轉成pdf,又轉回來,主要是將ps圖旋轉90度,以利gs轉成png
pdf2ps $home/tilt.pdf $outfile
gs -dNOPAUSE   -sDEVICE=png16 -r200 -sOutputFile="$img" "$outfile"  -dBATCH  -q –dNODISPLAY  #gs轉成png
mv $img /cygdrive/c/AppServ/www     #png檔放到Apache Server目錄下
rm  $home/tilt.p*  $home/*.dat 

########################
最後結果如下


沒有留言:

張貼留言