2015年9月23日 星期三

linux下使用ping指令來快速知道網路是否連上Internet

最近再作NTP(網路同步時間)的功能,因此在使用者選擇好要同步的NTP Server之前,我必須先確認網路是可以連上Internet的

ping -q -c1 -W1 168.95.1.1

上面是關鍵的command,使用ping再加上它的一些參數,可以很快的知道網路是否有連上Internet。

這裡先說明一下ping參數的意義:
-q     => 不顯示任何傳送封包的資訊,只顯示最後的結果
-c1   => 在發送指定數目的包後停止,c1也就是只發一次的意思
-W1 => 等待回應的時間,W1就是只等待一秒


詳細的程式碼如下:
===================================================================

// NTP Server
#define NTP_SERVER_1 "tock.stdtime.gov.tw"      //response time is short.
#define NTP_SERVER_2 "tw.pool.ntp.org"
#define CH_TELECOM "168.95.1.1"                       //中華電信DNS

int ping_result(char *server)
{
        char cmd[64]={0};
        int ping_ret, status;

        sprintf(cmd, "ping -q -c1 -W1 %s 1>/dev/null 2>&1", server);
        status = system(cmd);
        if(-1 != status)
                ping_ret = WEXITSTATUS(status);

        if((status == 0) && (ping_ret == 0))    // If network can work on internet, these two value will be zero.
                return 1;
        else
                return 0;
}

void ping_ntp()
{
        int pingResult = ping_result(CH_TELECOM);    //ping CHT DNS first.
        if(pingResult == 1)
        {
                pingResult = ping_result(NTP_SERVER_1);      //second ping NTP Server.
        }

        if(pingResult == 0 )
        {
                printf("NETWORK_ERROR");
        }
        else
        {
                printf("RESPONSE_SUCCESS");
        }
}
=================================================================

這裡再說明一下,上面的ping_ntp的function當中,我會先去ping中華電信的DNS(168.95.1.1),這樣可以先知道是否有通Internet,第二步才去確認NTP SERVER是可以work的,若是連Internet都不通,也不必再花時間去ping NTP SERVER了~

2015年9月22日 星期二

opencv研究 關於CommandLineParser的用法

最近在看一些opencv的example source code,看到了CommandLineParser是以前沒有用過的class,因此瞭解了它的用法之後,把它記錄在這裡~

我這邊是拿opencv 3.0.0中的sample的image_alignment.cpp來當說明範例

首先要使用這fuction時都會在前頭先宣告一個"key",大概如下方所示:

============================================================
const std::string keys =
    "{@inputImage       | ../data/fruits.jpg | input image filename }"
    "{@templateImage |                            | template image filename (optional)}"
    "{@inputWarp        |                           | input warp (matrix) filename (optional)}"
    "{n numOfIter        | 50                       | ECC's iterations }"
    "{e epsilon              | 0.0001                | ECC's convergence epsilon }"
    "{o outputWarp      | outWarp.ecc       | output warp (matrix) filename }"
    "{m motionType    | affine                   | type of motion (translation, euclidean, affine, homography) }"
    "{v verbose             | 0                          | display initial and final images }"
    "{w warpedImfile   | warpedECC.png  | warped input image }"
;
===================================================================

接著會看到在main裡頭會先作CommandLineParser的宣告,宣告完之後會跟著一些parser資訊的程式碼:

int main (const int argc, const char * argv[])
{
    CommandLineParser parser(argc, argv, keys);

    string imgFile = parser.get<string>(0);
    string tempImgFile = parser.get<string>(1);
    string inWarpFile = parser.get<string>(2);

    int number_of_iterations = parser.get<int>("n");
    double termination_eps = parser.get<double>("e");
    string warpType = parser.get<string>("m");
    int verbose = parser.get<int>("v");
    string finalWarp = parser.get<string>("o");
    string warpedImFile = parser.get<string>("w");
       .
       .
       .
}
======================================================================

其實parser宣告完成之後,就可以用來取得key裡面的一些資訊,我們一行行來說明:

string imgFile = parser.get<string>(0); ===> 搭配key的寫法,這可以取到argv[1]的值,也就是執行檔後面第一個參數的值。

string tempImgFile = parser.get<string>(1); ===> 同理,可取到argv[2]的值。
string inWarpFile = parser.get<string>(2);  ===> 同理,可取到argv[3]的值。(若沒輸入,取到值為空)

 int number_of_iterations = parser.get<int>("n"); ==>可取出key的內容當中一開始有"n"的那一行並取到第一個符號("|")後面的值,在這邊我們可以取到"50"。

 double termination_eps = parser.get<double>("e"); ==>與上面同理,這範例當中我們可以取到"0.0001"
 string warpType = parser.get<string>("m"); ==>與上面同理,這範例當中我們可以取到"affine"
 int verbose = parser.get<int>("v"); ==>與上面同理,這範例當中我們可以取到"affine"
 string finalWarp = parser.get<string>("o"); ==>與上面同理,這範例當中我們可以取到"0"
 string warpedImFile = parser.get<string>("w"); ==>同理,我們可以取到"warpedECC.png"

而每一行的第二個"|"符號後面的資訊,類似說明的效果。


parser.printParams(); ==>可以把所有key的內容印出來


下圖是把這些parse出來的值印出來的結果: