楽墨堂ソフトウェア研究室:Digi Connect ME:IPのリアルタイム設定 |
コモンライブラリを使用してIP情報を設定するためのテストプログラム。 設定はリセットが必要なくリアルタイムで反映される。 以下のソースコードを/netos63_gnu/src/apps/に展開。 ipset_test.zip ビルド方法: NET+Works 6.3 Build Enviromentを起動 $ cd src/apps/ipset_test/32b $ make PLATFORM=connectme clean all プログラムの説明: NAsetSysAccess(NASYSACC_ADD, "user", "pass", NASYSACC_LEVEL_HTTP_R1 | NASYSACC_LEVEL_RW, NULL); flashftp_start("ipset_test");ユーザ名とパスワードを設定しフラッシュ書込み用ftpサーバを起動。 userとpassは自由に変更しても良い。 ここで指定されるものを使ってftpクライアントはftpサーバに接続できる。 char s[64]; printf ("[d]hcp or [s]tatic or [c]urrent [r]estart? "); int slen = getline(s, sizeof(s), ebtNormal);コマンドプロンプトを表示し文字列を1行(リターンが押されるまで)入力。 リターンキーコードは含まれない。 第1引数は文字列の返されるバッファへのポインタを指定。 第2引数で文字列の長さを指定。この長さより長い文字列入力を抑制する。 文字列最後は必ず0なので入力出来る文字列の最大サイズはこの値から1を引いたものとなる。 第3引数でエコーバックはノーマル指定。(入力文字がそのまま表示される) ebtNoneを指定すればエコーバック無し。 ebtSecretを指定すればエコーバックは必ず*と表示される。 戻り値は入力された文字列のサイズ。すなわち strlen(s) と同様の値となる。 aceAddrInfo addr_info; customizeAceGetInterfaceAddrInfo(BP_ETH_INTERFACE, &addr_info);aceAddrInfo構造体の変数addr_infoに現在設定されている情報を取得する。 これは様々なIP関連の現状情報を含んでいる。 static devBoardParamsType nvParams; static aceConfigInterfaceInfo* eth_config; eth_config = get_board_params_type(&nvParams);devBoardParamsType構造体の変数であるnvParamsにボード関連設定情報を得る。 またaceConfigInterfaceInfo構造体へのポインタ変数であるeth_configに有効値を設定。 以下に示すように各IP関連の設定値はeth_configを使って取得する。 補足:devBoardParamsType構造体への変数はこの例のようにstaticで確保すること。 これはdevBoardParamsType構造体のサイズが大きく、通常のスタックサイズでは問題を起こすためである。 configAceStaticInfo* config = ð_config->static_config; aceProtoStartInfo* startInfo = &config->startInfo;スタティックIP関連の設定値を示すconfigAceStaticInfo構造体へのポインタを得る。 ここで ð_config->static_config は &(eth_config->static_config) の意なので注意。 また起動情報を示すaceProtoStartInfo構造体へのポイントも得る。 configAceDhcpInfo* config = ð_config->dhcp_config;DHCP関連の設定値を示すconfigAceDhcpInfo構造体へのポインタを得る。 configAceBootpInfo* config = ð_config->bootp_config; configAceAutoipInfo* config = ð_config->autoip_config; configAceRarpInfo* config = ð_config->rarp_config; configAcePingArpInfo* config = ð_config->ping_arp_config;BOOTP関連の設定値を示すconfigAceBootpInfo構造体へのポインタを得る。 AUTOIP関連の設定値を示すconfigAceAutoipInfo構造体へのポインタを得る。 RARP関連の設定値を示すconfigAceRarpInfo構造体へのポインタを得る。 PingArp関連の設定値を示すconfigAcePingArpInfo構造体へのポインタを得る。 printf("DHCP selected\n"); if (is_network_linking()) { printf("wait...\n"); set_dhcp_ip(); if (wait_until_network_ip_configured(NABspTicksPerSecond * 60) == 0) { printf("ok\n"); } else { printf("time out (not founded dhcp server)\n"); } } else { printf("please connect network cable.\n"); }DHCPによるIP設定を行う部分。 まず is_network_linking() でLANケーブルが接続されているか調べる。 接続されているならば set_dhcp_ip() でDHCPによるIP取得をするように設定。 wait_until_network_ip_configured(NABspTicksPerSecond * 60) で60秒まで設定完了を待つ。 この関数の戻り値が非0である場合はDHCPによるIP取得が指定時間で完了していないこと(タイムアウト)を示す。 printf("Static selected\n"); unsigned long addr, mask, gateway, dns0, dns1, dns2; get_static_ip(&addr, &mask, &gateway, &dns0, &dns1, &dns2); NAInet_toa(addr, s); printf("ip_addr [%s]: ", s); getline(s, sizeof(s), ebtNormal); if (s[0] != 0) addr = NAInet_addr(s); NAInet_toa(mask, s); printf("subnet_mask [%s]: ", s); getline(s, sizeof(s), ebtNormal); if (s[0] != 0) mask = NAInet_addr(s); NAInet_toa(gateway, s); printf("gateway [%s]: ", s); getline(s, sizeof(s), ebtNormal); if (s[0] != 0) gateway = NAInet_addr(s); NAInet_toa(dns0, s); printf("dns0 [%s]: ", s); getline(s, sizeof(s), ebtNormal); if (s[0] != 0) dns0 = NAInet_addr(s); NAInet_toa(dns1, s); printf("dns1 [%s]: ", s); getline(s, sizeof(s), ebtNormal); if (s[0] != 0) dns1 = NAInet_addr(s); NAInet_toa(dns2, s); printf("dns2 [%s]: ", s); getline(s, sizeof(s), ebtNormal); if (s[0] != 0) dns2 = NAInet_addr(s); printf("wait...\n"); set_static_ip(addr, mask, gateway, dns0, dns1, dns2); if (wait_until_network_ip_configured(NABspTicksPerSecond * 60) == 0) { printf("ok\n"); } else { printf("time out\n"); }スタティックIP設定を行う部分。 unsigned long addr, mask, gateway, dns0, dns1, dns2; 設定する値を入力保持する変数。 get_static_ip(&addr, &mask, &gateway, &dns0, &dns1, &dns2); にて現在の設定値を取得しておく。 NAInet_toa(addr, s); addrの内容を文字列にする。strcpy(s, ip2a(addr)); としても良い。 printf("ip_addr [%s]: ", s); getline(s, sizeof(s), ebtNormal); 現在のaddrの内容を表示し、設定値の入力をする。 if (s[0] != 0) addr = NAInet_addr(s); リターンのみの入力(文字列は空となる)でない場合は入力された文字列を変換してaddrに入れる。 不正な入力の場合はaddrは 0 となる。 以下同様に mask, gateway, dns0, dns1, dns2 の値を決めていく。 次に set_static_ip(addr, mask, gateway, dns0, dns1, dns2); でスタティックIPを設定する。 wait_until_network_ip_configured(NABspTicksPerSecond * 60) で60秒まで設定完了を待つ。 この関数の戻り値が非0である場合はIP設定が指定時間で完了していないこと(タイムアウト)を示す。 補足:スタティックIPの設定の場合、ここでタイムアウトになることは通常では考えられない。 32b/makefileには ROM用ファイルを作成しない指定: BUILD_ROM_IMAGE= 0 コモンライブラリファイル(flashftp.c,nvram.c,net.c,serial.c)の追加: APP_C_FILES=root.c \ flashftp.c \ nvram.c \ net.c \ serial.c コモンライブラリへのソース検索パスの追加: vpath %.c ../../common コモンライブラリへのインクルード検索パスの追加: APP_INCDIRS= -I.. -I../../common を設定している。コモンライブラリを使う場合には同様の設定がmakefileに必要となるので覚えておくこと。 補足: 起動するとコマンドプロンプトが表示されるのでコマンド頭文字(小文字)を入力しリターンキーを押すことで実行される。 cコマンドで最初に表示される情報のうち protocol は何によって現在のIPが得られたかを示している。 この値が2であればDHCP、6であればスタティックにてIPが設定されていることを示す。 その他、スタティックIP情報とDHCP関連情報は常に表示される。 BOOTP,AUTOIP,RARP,PingArpに関する情報はそれぞれがイネーブルの時のみ表示する。 スタティックIPを設定したい場合はsコマンドを入れ表示される項目に従い設定値を入れる。 表示されるディフォルト値のままで良ければリターンのみ入力すれば良い。 DHCPによるIP設定をしたい場合はdコマンドを入力。 この時、LANケーブルが接続されていない場合はメッセージを出してコマンドがキャンセルされる。 接続されている場合でも60秒の間にDHCPサーバからの反応が無い場合はタイムアウトを表示する。 |
Copyright© 2006 Laksmi-Do Corp. All rights reserved. |
連絡先(@を半角に) develop@laksmido.com |