Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

pingクライアントについて

はじめて投稿いたします。

けんけんと申します。

以下環境下でpingクライアントを実装したいのですが、実装された方がいましたら実装方法を教えて頂きたいのですが?

PCと双方で疎通確認が行いたいのです。

マイコン:R5F565NEDxFB

スマートコンフィグレータコンポーネント

r_ether_rx ver1.20

r_t4_driver_rx ver1.08

r_t4_rx ver2.09

RXシリーズは初めてのプログラミングとなります。

宜しくお願い致します。

以上。

  • けんけん さん、こんにちは。NoMaYと申します。

    > 以下環境下でpingクライアントを実装したいのですが、実装された方がいましたら実装方法を教えて頂きたいのですが?

    私自身は実装したことが無いのですが、かふぇルネでも何度かpingの話題が出ていましたので何かあるだろうと思いますので、これから探してみようと思います。すみません、少々お待ち下さい。

  • けんけん さん、こんにちは。NoMaYです。

    ルネサスさんのウェブサイトでping client(やhttp clientとかmqtt clientとか)を検索すると、見事なほどにSynergyばっかりでしたね。(多少例外はありますが。) さすがに、これ程の過酷な事態は想定していなかったので、少なくとも今夜一晩は探してみないといけなさそうです、、、

    Renesasキーワード検索: ping client
    www.renesas.com/jp/ja/search/keyword-search.html#q=ping%20client&rows=50

    Renesasキーワード検索: http client
    www.renesas.com/jp/ja/search/keyword-search.html#q=http%20client&rows=50

    Renesasキーワード検索: mqtt client
    www.renesas.com/jp/ja/search/keyword-search.html#q=mqtt%20client&rows=50
     

  • In reply to NoMaY:

    NoMayさん、こんにちは。けんけんです。

    いろいろ探して戴き有難うございます。
    私の方もNET等で探しているのですが、なかなか見つけられない次第です。
    済みませんお手数をお掛け致します。
    宜しくお願い致します。
  • けんけん さん、こんにちは。NoMaYです。

    すみません、そのものズバリはギブアップしました。私はPCでもマイコンでもネットワークには詳しくは無いのですが、この状況で自分が作業するなら以下のような手順で進めると思います。

    ステップ1) PC側からpingするアプリケーションノートとして以下がありますので、まずこちらを作ってみる。

    www.renesas.com/jp/ja/search/keyword-search.html#genre=document&q=r20an0051
    r20an0051jj0209-rx-t4.pdf

    各種 Renesas Starter Kit+同梱のCPU ボードや、がじぇっとるねさすのRX63N 搭載ボードや、サードパーティ製ボードで簡単にTCP/IP 通信の動作確認可能なサンプルを用意しております。このサンプルはネットワーク接続方法、PC の設定方法、CPU ボードの設定方法について確認することが出来ます。



    ステップ2) RXマイコン側からpingするプログラムは、以下のソケットAPIとウェブの情報を頼りに作ってみる。

    RXファミリ 組み込み用TCP/IP M3S-T4-Tiny ソケットAPIモジュール Firmware Integration Technology
    www.renesas.com/jp/ja/search/keyword-search.html#genre=document&q=r20an0296
    r20an0296jj0132-rx-t4.pdf

    このソフトウェアは組み込み用TCP/IP M3S-T4-Tiny(以下T4)用のソケットAPI モジュールです。T4 はITRON TCP/IP API に対応しています。一方、多くの地域で幅広く使われているネットワーク用API はソケットAPI です。より多くのユーザがT4 用アプリケーションを開発できるように、T4 用の簡易ソケットAPI を用意しました。ユーザはT4 に加えて本モジュールを使用することでソケットAPI を使用することが出来ます。



    Google検索: BSD OR POSIX OR Linux Socket API ping source code
    www.google.com/search?q=BSD+OR+POSIX+OR+Linux+Socket+API+ping+source+code


    ソケットAPIモジュールは、以下の画面コピーの手順で組み込みことが出来ます。





     

  • けんけんさん、こんにちは。
    PINGについては、ICMPで検索すると見つかる場合があります。
    過去に、作られた方がみえるようです。
    japan.renesasrulz.com/.../m3s-t4-tiny
  • In reply to NoMaY:

    NoMayさん、こんにちは。けんけんです。

    有難うございます。
    教えて頂いた情報、BSD OR POSIX OR Linux Socket API ping source code等参考にして
    組み込みの方挑戦してみます。
  • In reply to HiRoSan:

    HiRoSan。こんにちは。けんけんです。

    情報有難うございます。
    実は私も投稿する前に教えて戴いたURLの内容を参考に挑戦したのですが、
    バージョン違いによりなかなか「***行目」というところが一致しない点と
    コンパイルした結果エラーが何点か発生してしまい
    途中で妥協してしまいました。
    再度挑戦してみようと思います。
    現バージョンでの情報がありましたらお願いいたします。
  • けんけん さん、こんにちは。NoMaYです。

    試そうとして、私が勘違いしていた/私のアドバイスが的外れだった、とか分かったら、その旨を教えて下さい。というか、実は、Google検索の結果だけを見て「Socket APIでいけるっぽい」と思ってリプライしたのですが、HiRoSanさんのリプライ&アドバイスの過去スレッドのICMPに気を付けながらGoogle検索にヒットしたページを読んでみたら以下の指定が必要だったことが分かったのですが、T4の簡易ソケットAPIのアプリケーションノートにはIPPROTO_ICMPの記載がないことに気が付き、これは私が早トチリしたようだ、と思い始めたところです、、、ごめんなさい、、、

    簡単なpingの作成(ICMPの送受信)- Geekなページ
    www.geekpage.jp/programming/linux-network/simple-ping.php

    /* RAWソケットを作成します */
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

     

  • In reply to NoMaY:

    NoMayさん。こんにちは。けんけんです。

    済みません。私の説明の仕方が不十分だったのかもしれません。
    作成したいものはRX65Nからのping送信プログラムでして、開発環境はCS+ V8.03で作成しております。
    M3S-T4-Tiny V2.09を組み込んでいまして、組み込み用T4ユーザーマニュアルを見ましたところエコー応答
    のみサポートと記述されていた為、
    かふぇルネさんで過去に作成された方の投稿を見つけ
    japan.renesasrulz.com/.../m3s-t4-tiny
    現バージョンでの組み込みをされている方がいるのではないかと思い投降した次第です。
  • In reply to けんけん:

    けんけんさん
    たぶんあまり参考にならないとは思いますが、ずいぶん昔に作成したことがありまして
    それなりに使用していましたが、T4ではありませんし、全体のソースを投稿しても混乱のもとなので
    骨はIP層に作りこまないといけませんし、コマンドラインができる仕組みも必要です
    以下ソースの一部です
    const char pingdata[]={
    0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70
    ,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69
    };

    void pingrequest_100()
    {
    char buf[ETHER_MAX_PACKET];

    if(sub_proc[sub_proci].ret == 0){
    printf("見つかりません.\r");
    sub_delproc
    prompt;
    return;
    }

    //ICMPH
    icmph_(buf)->Type = ICMP_ECHO;
    icmph_(buf)->Code = 0;
    icmph_(buf)->Checksum = 0;
    icmph_(buf)->ID = rand();
    icmph_(buf)->SequenceNumber = 0;
    memcpy(&icmph_(buf)->Data , &pingdata , sizeof(pingdata));
    icmph_(buf)->Checksum = make_crc((char*)icmph_(buf) ,(WORD)IcmpHeader_size +sizeof(pingdata));

    //IPH
    iph_(buf)->Version = 4;
    iph_(buf)->IHL = IpHeader_size /4;
    iph_(buf)->DifferentiatedServices = 0;
    iph_(buf)->Totallength = IpHeader_size + IcmpHeader_size + sizeof(pingdata);
    iph_(buf)->Identifi = (WORD)rand() +(WORD)cpu_sec;
    iph_(buf)->Flags = 0;
    iph_(buf)->Fragmentoffset = 0;
    iph_(buf)->TTL = 128;
    iph_(buf)->Protocol = IP_ICMP;
    iph_(buf)->Headerchecksum = 0;
    cpy4(&iph_(buf)->SourceIPaddress , &sparam.myip);
    cpy4(&iph_(buf)->DestinationIPaddress , &sub_proc[sub_proci].param);//getmac->ip
    iph_(buf)->Headerchecksum = make_crc((char*)iph_(buf) ,(WORD)iph_(buf)->Totallength);

    //ETH
    cpy6(&eth_(buf)->DestinationMACaddress , sub_proc[sub_proci].ret);//getmac->mac
    cpy6(&eth_(buf)->SourceMACaddress , &eedata.mymac);
    eth_(buf)->Protocol = IP_TYPE;
    ether_put((char*)eth_(buf) , iph_(buf)->Totallength + EtherHeader_size);
    msec1start
    sub_proc[sub_proci].pc = pingrequest_110;
    }

    int pingrequest(char *str)
    {
    IPLINEINPUT ipl;
    if(strlen(str) == 0)return Invalid_Value_Parameter;
    iplineinput(str , &ipl);
    if(!ipl.f) return Invalid_Value_Parameter;

    //まずMACアドレスを取得する
    setproc(&getmac, ipl.ipadr, 0,0,0, &pingrequest_100 );
    return NULLSTR;
    }

    以上です。
  • In reply to けんけん:

    けんけんさん、こんにちは。
    既に情報は見つけてみえたんですね。失礼しました。
    Ver1.8のファイルも探してみましたが、合致するものは見つかりませんでした。
    以前、2.08にてデバッグを行っていたソースがあるのですが、単純に2.09に置き換えようと思ったところ、KeepAlive関係が追加されており動きませんでした。(スマートコンフィグレータで更新しても2.08のままで、更新方法がいまいちわかりませんでした)
    NW関係を触る予定はあるものの、すぐには試せない為、時間があいたら試してみたいと思います。
  • In reply to IKUZO:

    IKUZOさん。こんにちは、けんけんです。

    返信有難うございました。
    情報ご参考にさせていただきます。
  • In reply to HiRoSan:

    HiRoSanさん。こんにちは。けんけんです。

    返信ありがとうございます。
    私の方もコンポーネントには更新はなく追加と削除しかない為、1回削除をしてから追加したか、
    ちょうどPCの更新した時期でもあり新たに再度プロジェクトを作成したような気がします。

    ping送信の件、お時間が空いた時で宜しいので宜しくお願い致します。
  • In reply to けんけん:

    けんけんさん、こんにちは。
    RX64Mを使用していますが、T4ライブラリはバージョン2.08にて無事確認できたので、ご報告です。
    バージョンアップがうまく出来なかった件は、プロジェクトツリーから、フォルダ一式削除しても、プロジェクトのインクルードパスに残っており、古いヘッダファイルを読んでいた事が原因でした。
    あとは、E1でJTAGで接続すると、クロックを最低にしないとPHY(LAN8720A)からデータが読めなくなるという現象が出ています...
    SDRAMも載っているので、これは基板のパターンの問題かなぁ...  もし情報があれば教えて頂きたいです。
    バージョンアップによる、主な変更点は、_TCBF_XXXXから、_CHINFOF_XXXXに代わっていた事です。
    あとは、bool型の使用していないプロジェクトでは、エラーとなりますので、仮に動くよう適当に宣言を追加しました。
    メインアプリの内容については、以前の投稿者さんが、コンソールを作られていた一部のようで、・・・の部分が無いため動きませんでしたので、
    必要な部分のみ残し、動作が確認できるよう、一回だけPINGを投げる、ping_sendを作成してみました。
    ping_send(192,168,1,1);の様に実行し応答があると、icmp_ccep.statusがSTS_RECEVED_REPLAYとなります。
    あとは、ping_commandを参考にして応答やタイムアウト、リトライなどを実装すれば良いと思います。

    以下は変更内容です。変更後の行数を書いたつもりですが、間違っていたらすみません。()の中で検索して、その前後に追記・変更して頂ければと思います。

    【r_t4_itcpip.h】
    // 最終行(#endif /* _R_T4_ITCPIP_H */)の上に追加
    /* ICMP APIs */
    typedef struct t_icmp_header
    { // _ICMP_HDR と同じにする
        UB type; /* type of message */
        UB code; /* code (additional info. depend on type) */
        UH chksum; /* checksum of ICMP header+data */
        UH id; /* message id */
        UH seq; /* sequence number */
    } T_ICMP_HEADER;

    typedef struct t_icmp_ccep
    {
        ER(*callback)(VP data, T_ICMP_HEADER *hdr , INT len); /* Callback routine */
        IPaddr ipaddr; /* source address */
        IPaddr dstaddr; /* destination address */
        UB type; /* type of message */
        UB code; /* code (additional info. depend on type) */
        UH id; /* message id */
        UH seq; /* sequence number */
        UB *data; /* message */
        INT len; /* message length */
        UW timestamp; /* time stamp */
        H status;
        ER result;
    } T_ICMP_CCEP;
    ER icmp_snd_dat(IPaddr ipaddr, IPaddr dstaddr, T_ICMP_HEADER *picmph, VP data, INT len);


    【tcp_api.c】
    // 最終行に追加
    /*
    #define bool _Bool //定数を宣言したヘッダファイルをインクルードしていない場合に追加
    #define false 0
    #define true 1
    */
    // ICMP Request flag
    bool icmp_stat = false;
    // ICMP Packet Send
    extern T_ICMP_CCEP icmp_ccep;
    ER icmp_snd_dat(IPaddr ipaddr, IPaddr dstaddr, T_ICMP_HEADER *picmph, VP data, INT len)
    {
        memcpy(icmp_ccep.ipaddr, ipaddr, sizeof(IPaddr));
        memcpy(icmp_ccep.dstaddr, dstaddr, sizeof(IPaddr));
        icmp_ccep.type = picmph->type;
        icmp_ccep.code = picmph->code;
        icmp_ccep.id = picmph->id;
        icmp_ccep.seq = picmph->seq;
        icmp_ccep.data = (uchar *)data;
        icmp_ccep.len = len;
        icmp_stat = true;
        return E_OK;
    }


    【tcp.c】
    // 110行目(extern _CH_INFO *_ch_info_head;)の下に追加
    /*
    #define bool _Bool //定数を宣言したヘッダファイルをインクルードしていない場合に追加
    #define false 0
    #define true 1
    */
    extern T_ICMP_CCEP icmp_ccep;
    extern bool icmp_stat;
    void _icmp_api(void);

    // 28行目(_proc_snd();)の下に追加
    _icmp_api();

    // 805行目(uint8_t ch;)の下に追加
    uint16 len;

    // 934行目(if (picmph->type != _ICMP_ECHO_REQ))の下を変更
    if (picmph->type != _ICMP_ECHO_REQ)
    {
        report_error(_ch_info_tbl->_ch_num, RE_ICMP_HEADER1, data_link_buf_ptr);
        goto _err_proc_rcv;
    }
    ↓↓↓
    if (picmph->type != _ICMP_ECHO_REQ)
    {
        if(icmp_ccep.callback){
            len = _ch_info_tbl->_p_rcv_buf.len - _ICMP_HLEN - _IP_HLEN_MIN;
            icmp_ccep.callback(picmp->data, (T_ICMP_HEADER *)picmph, len);
            _ch_info_tbl->flag &= ~(_CHINFOF_PEND_ICMP | _CHINFOF_SND_ICMP);
            rcv_buff_release(_ch_info_tbl->_ch_num);
            _ch_info_tbl->_p_rcv_buf.len = 0;
            break;
        }
        else
        {
            report_error(_ch_info_tbl->_ch_num, RE_ICMP_HEADER1, data_link_buf_ptr);
            goto _err_proc_rcv;
        }
    }

    // 最終行(#endif /* _TCP */)の上に追記
    void _icmp_api(void)
    {
        uint16 sum;
        _ICMP_HDR *picmph_s;
        if(icmp_stat && (_ch_info_tbl->flag&_CHINFOF_SND_ICMP)==0){
            icmp_stat = false;
            picmph_s = (_ICMP_HDR *)(_tx_hdr.ihdr.tip.thdr.icmph);
            picmph_s->type = icmp_ccep.type;
            picmph_s->code = icmp_ccep.code;
            picmph_s->chksum = 0;
            picmph_s->id = icmp_ccep.id;
            picmph_s->seq = icmp_ccep.seq;
            sum = _cksum((uchar *)picmph_s, _ICMP_HLEN, 0);
            sum = ~hs2net(sum);
            sum = _cksum(icmp_ccep.data, icmp_ccep.len, sum);
            picmph_s->chksum = hs2net(sum);
            _tx_hdr.hlen = _ICMP_HLEN;
            _tx_hdr.ihdr.tip.iph.ip_proto_num = _IPH_ICMP;
            _cpy_ipaddr(_tx_hdr.ihdr.tip.iph.ip_dst, icmp_ccep.dstaddr);
            _cpy_ipaddr(_tx_hdr.ihdr.tip.iph.ip_src, icmp_ccep.ipaddr);
            _ip_snd(icmp_ccep.data, icmp_ccep.len);
        }
    }


    【アプリ】
    #define STS_WAIT_FOR_RESPONCE 1
    #define STS_RECEVED_REPLAY 2
    #define STS_PRINTED_RESULT 3

    // 初期値の設定
    T_ICMP_CCEP icmp_ccep = {
        NULL,
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        0,
        0,
        0,
        0,
        NULL,
        0,
        0
    };
    static T_ICMP_HEADER icmph = {
        8, 0, 0, 0x0001, 0
    };

    unsigned char ping_msg[32];


    static ER ping_callback(VP data, T_ICMP_HEADER *hdr , INT len)
    {
        if(hdr->seq == icmp_ccep.seq){
            icmp_ccep.status = STS_RECEVED_REPLAY;
            if(len!=icmp_ccep.len || memcmp((char *)data, (char *)icmp_ccep.data, icmp_ccep.len)!=0){
                icmp_ccep.result = -1;
            }
            else
            {
                icmp_ccep.result = E_OK;
            }
        }
        return E_OK;
    }

    short ping_send(unsigned char ip1,unsigned char ip2,unsigned char ip3,unsigned char ip4){
        ER ercd;
        IPaddr dstaddr;
        dstaddr[0] = ip1;
        dstaddr[1] = ip2;
        dstaddr[2] = ip3;
        dstaddr[3] = ip4;

        icmp_ccep.callback = ping_callback;
        icmp_ccep.timestamp = 0; //PINGを送信した時刻
        icmp_ccep.status = STS_WAIT_FOR_RESPONCE;
        icmp_ccep.result = E_OK;
        ++icmph.seq;
        ercd = icmp_snd_dat(tcpudp_env[0].ipaddr, dstaddr, &icmph, (VP)ping_msg, sizeof(ping_msg));
        if(ercd){
            icmp_ccep.callback = NULL;
            return 0;
        }
        return 1;
    }

    int ping_command(int argc, char *argv[])
    {
        /* この関数はPINGの繰り返しと画面表示を行う独自の内容なので、使わない */
    }

  • In reply to HiRoSan:

    HiRoSanさん。こんにちは。

    詳細な情報有難うございます。
    解りやすく助かります。

    まだping送信には至っていないのですが、済みません。もう少しアドバイスの方をお願いいたします。

    下記はHiRoSanさんの情報を基に実施した内容となります。
    1.ライブラリソースコードに変更内容のコードを追加、再コンパイル行いました。
      エラーは発生しませんでした。
    2.ライブラリファイル
      (T4_Library_ether_ccrx_rxv1_big.lib/T4_Library_ether_ccrx_rxv1_little.lib)が日付更新されました。
    3.CS+「CC-RX(ビルドツール)」の共通オプション「使用するライブラリファイル」に   T4_Library_ether_ccrx_rxv1_big.libの登録を確認しました。
    4.PCとRX65Nマイコン基板をLANで接続。(PC側、マイコン側共に固定IP)
    4.アプリケーションにてlan_open()関数の後にping_sendをコール。
    5.wiresharkにてパケットを確認したのですが、出力されませんでした。

    現状ではPCとマイコンはudpによる送受信は行えている状態です。PHYは動作しております。
    スマートコンフィグレータの設定等は関係しているのでしょうか、
    もし差し支えなければスマートコンフィグレータの画面(コンポーネントr_t4_rx等)を開示して戴けると助かります。

    宜しくお願い致します。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page