XPortの汎用I/OにアクセスするプログラムをWindowsとLinuxで作成しました。
汎用I/Oは、全て出力に設定しています。
開発キットには、CP1、CP2、CP3のアクセス用LEDが付いているので動作を確認できます。
スイッチなどを付けて入出力を混在した場合は、サンプルのソースを変更する必要があります。
環境
- LANTRONIX XPort開発キット(純正品) XP1001000-01 Rev.B12
- Firmware ver.6.5.0.3
- Device Server Configuration Manager Version 1.6.0.2
- Windows
- WindowsXP Pro SP3
- Visual C++ 2008 SP1
- Linux
- Debian lenny
- Kernel 2.6.26
- gcc ver.4.3.2
メモ
- 「XPort_UM_900-270A.pdf」のP.26にCP1、CP2、CP3の出力ピンの配置図がある。
- 「DeviceServerFAQ.pdf」のP.26にSW1の配置図がある。
- WebブラウザでTelnetのパスワード設定を行うと、Webブラウザでアクセスする場合にもパスワード入力が必須となる。パスワードは4文字が有効で、それ以上入力しても無効。
- Web設定ページはDHTML/JavaScriptで記述されているので、WebブラウザにJAVA(TM) Platform Standard Editionをインストールする。
XPortのI/O設定
参考資料
PDFはググって下さい。
- http://www.co-nss.co.jp/products/network/lantronix/xport/xport-top.html
- http://www.tech-center.jp/
- http://www.co-nss.co.jp/products/network/lantronix/xport/xport-top.html
- io-control.pdf
- 46011_6syo.pdf
- XPort_UM_900-270A.pdf
- DeviceServerFAQ.pdf
- トランジスタ技術 2003年9月号 P.247
- トランジスタ技術 2003年10月号 P.225
- トランジスタ技術 2004年10月号 P.271
Win32コンソールプログラム
コマンドラインでコンパイルする場合は、VC++の環境変数を設定する必要がある。
または、「スタートメニュー」→「プログラム」→「Microsoft Visual Studio 2008」→「Visual Studio Tools」→「Visual Studio 2008 コマンドプロンプト」。
文字コードをUNICODEで保存しろを警告が出るが無視。
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" cl xport01.c
// // XPort-01にTCP/IPで接続する。 // Win32コマンドライン用プログラム // XPortのCP1, CP2, CP3は全て汎用I/O出力設定。 // 2007.07.10 naonao // // ・Visual C++ 2005 SP1 // ・LANTRONIX XPort開発キット(純正品)XP1001000-01 Rev.B12(Firmware ver.6.5) // #pragma comment(lib, "ws2_32.lib") #include<stdio.h> #include<winsock2.h> #include<ws2tcpip.h> #define DEBUG #define NETWORK_PORT 30704 // ポート番号 #define SEND_MAX 9 #define RECEIVE_MAX 5 #define XPORT_COMMAND_0 0 // 入出力の方向確認 #define XPORT_COMMAND_1 1 // Active H/L の確認 #define XPORT_COMMAND_2 2 // ON/OFFの状態確認 #define XPORT_COMMAND_3 3 // 入出力の方向設定 #define XPORT_COMMAND_4 4 // Active H/L の設定 #define XPORT_COMMAND_5 5 // ON/OFFの設定 // I/Oの設定 #define CP1 0 #define CP2 1 #define CP3 2 #define CP1_CP2 3 #define CP1_CP3 4 #define CP2_CP3 5 #define CP1_CP2_CP3 6 // // メイン // int main( void ) { int i, r, flg_command, flg_cp; int dstSocket; struct sockaddr_in dstAddr; char cmd[SEND_MAX]; char res[RECEIVE_MAX]; char destination[32] = "xxx.xxx.xxx.xxx"; // WinSock2の初期化 WSADATA data; WSAStartup( MAKEWORD( 2, 0 ), &data ); // 初期化 for ( i=0; i< SEND_MAX; i++ ) { cmd[i] = 0x00; } for ( i=0; i< RECEIVE_MAX; i++ ) { res[i] = 0x00; } #ifdef DEBUG for ( i=0; i< SEND_MAX; i++ ) { printf("初期化-> [%d] %x \n", i, cmd[i]); } for ( i=0; i< RECEIVE_MAX; i++ ) { printf("初期化-> [%d] %x \n", i, res[i]); } #endif // コマンド、I/O(CPx)の設定 flg_command = XPORT_COMMAND_5; // flg_cp = CP1_CP2_CP3; flg_cp = CP2; // flg_cp = CP1_CP3; printf("flg_command[%d] flg_cp[%d] \n", flg_command, flg_cp); // コマンド生成 switch ( flg_command ) { case 0: cmd[0] = 0x11; // 入出力の方向確認 break; case 1: cmd[0] = 0x12; // Active H/L の確認 break; case 2: cmd[0] = 0x13; // ON/OFFの状態確認 break; case 3: cmd[0] = 0x19; // 入出力の方向設定 break; case 4: cmd[0] = 0x1a; // Active H/L の設定(全汎用I/Oピン共通) break; case 5: cmd[0] = 0x1b; // ON/OFFの設定 break; default: printf("Bad command [%x] \n", cmd[0]); return FALSE; break; } // パラメータ1、2の設定 if ( flg_command > XPORT_COMMAND_2 ) { // 全ピンを対象とする cmd[1] = 0x07; switch ( flg_cp ) { case 0: // ON: CP1 cmd[5] = 0x01; break; case 1: // ON: CP2 cmd[5] = 0x02; break; case 2: // ON: CP3 cmd[5] = 0x04; break; case 3: // ON: CP1, CP2 cmd[5] = 0x03; break; case 4: // ON: CP1, CP3 cmd[5] = 0x05; break; case 5: // ON: CP2, CP3 cmd[5] = 0x06; break; case 6: // ON: CP1, CP2, CP3 cmd[5] = 0x07; break; default: break; } } printf("cmd: [%x] [%x] \n", cmd[1], cmd[5]); // 初期化 memset( &dstAddr, 0, sizeof( dstAddr ) ); dstAddr.sin_port = htons( NETWORK_PORT ); dstAddr.sin_family = AF_INET; dstAddr.sin_addr.s_addr = inet_addr( destination ); // ソケット生成 dstSocket = socket( AF_INET, SOCK_STREAM, 0 ); // 接続 r = connect( dstSocket, ( struct sockaddr * )&dstAddr, sizeof( dstAddr ) ); if ( r< 0 ) { printf("Can not access [%s] \n",destination); return FALSE; } printf("Access [%s] \n", destination); // パケット送信 for ( i=0; i< SEND_MAX; i++ ) { printf("Send-> [%x] \n", cmd[i]); } send( dstSocket, cmd, sizeof(cmd) / sizeof(cmd[0]), 0 ); // send( dstSocket, cmd, SEND_MAX, 0 ); // パケット受信 recv( dstSocket, res, sizeof(res) / sizeof(res[0]), 0 ); // recv( dstSocket, res, RECEIVE_MAX, 0 ); for ( i=0; i< RECEIVE_MAX; i++ ) { printf("Packet-> [%x] \n", res[i]); } // ソケット終了 closesocket( dstSocket ); WSACleanup(); printf("Disconnect [%s] \n", destination); return TRUE; }
Linuxコンソールプログラム
// // XPort-01にTCP/IPで接続する。 // Win32コマンドライン用プログラム // XPortのCP1, CP2, CP3は全て汎用I/O出力設定。 // 2007.07.10 naonao // // ・Debian GNU/Linux 4.0 Etch // ・gcc ver.4.1.2 // ・LANTRONIX XPort開発キット(純正品)XP1001000-01 Rev.B12(Firmware ver.6.5) // ・コンパイル // gcc -W -Wall -o xport xport01.c -lnsl // #include<stdio.h> #include<string.h> #include<unistd.h> // write, read, close #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #define DEBUG #define FALSE 0 #define TRUE !FALSE #define NETWORK_PORT 30704 // ポート番号 #define SEND_MAX 9 #define RECEIVE_MAX 5 #define XPORT_COMMAND_0 0 // 入出力の方向確認 #define XPORT_COMMAND_1 1 // Active H/L の確認 #define XPORT_COMMAND_2 2 // ON/OFFの状態確認 #define XPORT_COMMAND_3 3 // 入出力の方向設定 #define XPORT_COMMAND_4 4 // Active H/L の設定 #define XPORT_COMMAND_5 5 // ON/OFFの設定 // I/Oの設定 #define CP1 0 #define CP2 1 #define CP3 2 #define CP1_CP2 3 #define CP1_CP3 4 #define CP2_CP3 5 #define CP1_CP2_CP3 6 // // メイン // int main( void ) { int i, r, flg_command, flg_cp; int dstSocket; struct hostent *hp; struct sockaddr_in dstAddr; char cmd[SEND_MAX]; char res[RECEIVE_MAX]; char destination[32] = "xxx.xxx.xxx.xxx"; // 初期化 for ( i=0; i< SEND_MAX; i++ ) { cmd[i] = 0x00; } for ( i=0; i< RECEIVE_MAX; i++ ) { res[i] = 0x00; } #ifdef DEBUG for ( i=0; i< SEND_MAX; i++ ) { printf("Init-> [%d] %x \n", i, cmd[i]); } for ( i=0; i< RECEIVE_MAX; i++ ) { printf("Init-> [%d] %x \n", i, res[i]); } #endif // コマンド、I/O(CPx)の設定 flg_command = XPORT_COMMAND_5; // flg_cp = CP1_CP2_CP3; // flg_cp = CP2; flg_cp = CP1_CP3; printf("flg_command[%d] flg_cp[%d] \n", flg_command, flg_cp); // コマンド生成 switch ( flg_command ) { case 0: cmd[0] = 0x11; // 入出力の方向確認 break; case 1: cmd[0] = 0x12; // Active H/L の確認 break; case 2: cmd[0] = 0x13; // ON/OFFの状態確認 break; case 3: cmd[0] = 0x19; // 入出力の方向設定 break; case 4: cmd[0] = 0x1a; // Active H/L の設定(全汎用I/Oピン共通) break; case 5: cmd[0] = 0x1b; // ON/OFFの設定 break; default: printf("Bad command [%x] \n", cmd[0]); return FALSE; break; } // パラメータ1、2の設定 if ( flg_command > XPORT_COMMAND_2 ) { // 全ピンを対象とする cmd[1] = 0x07; switch ( flg_cp ) { case 0: // ON: CP1 cmd[5] = 0x01; break; case 1: // ON: CP2 cmd[5] = 0x02; break; case 2: // ON: CP3 cmd[5] = 0x04; break; case 3: // ON: CP1, CP2 cmd[5] = 0x03; break; case 4: // ON: CP1, CP3 cmd[5] = 0x05; break; case 5: // ON: CP2, CP3 cmd[5] = 0x06; break; case 6: // ON: CP1, CP2, CP3 cmd[5] = 0x07; break; default: break; } } printf("cmd: [%x] [%x] \n", cmd[1], cmd[5]); // 初期化 bzero( ( char * )&dstAddr, sizeof( dstAddr ) ); dstAddr.sin_family = AF_INET; dstAddr.sin_port = htons( NETWORK_PORT ); hp = gethostbyname( destination ); bcopy( hp->h_addr, &dstAddr.sin_addr, hp->h_length ); // ソケット生成 dstSocket = socket( AF_INET, SOCK_STREAM, 0 ); // 接続 r = connect( dstSocket, ( struct sockaddr * )&dstAddr, sizeof( dstAddr ) ); if ( r< 0 ) { printf("Can not access [%s] \n",destination); return FALSE; } printf("Access [%s] \n", destination); // パケット送信 for ( i=0; i< SEND_MAX; i++ ) { printf("Send-> [%x] \n", cmd[i]); } r = write( dstSocket, cmd, sizeof(cmd) / sizeof(cmd[0]) ); // r = write( dstSocket, cmd, SEND_MAX, 0 ); // パケット受信 r = read( dstSocket, res, sizeof(res) / sizeof(res[0]) ); // r = read( dstSocket, res, RECEIVE_MAX ); for ( i=0; i< RECEIVE_MAX; i++ ) { printf("Packet-> [%x] \n", res[i]); } close( dstSocket ); return TRUE; } <h2>Linuxコンソールプログラム<;/h2> [cpp] // // XPort-01にTCP/IPで接続する。 // Win32コマンドライン用プログラム // XPortのCP1, CP2, CP3は全て汎用I/O出力設定。 // 2007.07.10 naonao // // ・Debian GNU/Linux 4.0 Etch // ・gcc ver.4.1.2 // ・LANTRONIX XPort開発キット(純正品)XP1001000-01 Rev.B12(Firmware ver.6.5) // ・コンパイル // gcc -W -Wall -o xport xport01.c -lnsl // #include<stdio.h> #include<string.h> #include<unistd.h> // write, read, close #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #define DEBUG #define FALSE 0 #define TRUE !FALSE #define NETWORK_PORT 30704 // ポート番号 #define SEND_MAX 9 #define RECEIVE_MAX 5 #define XPORT_COMMAND_0 0 // 入出力の方向確認 #define XPORT_COMMAND_1 1 // Active H/L の確認 #define XPORT_COMMAND_2 2 // ON/OFFの状態確認 #define XPORT_COMMAND_3 3 // 入出力の方向設定 #define XPORT_COMMAND_4 4 // Active H/L の設定 #define XPORT_COMMAND_5 5 // ON/OFFの設定 // I/Oの設定 #define CP1 0 #define CP2 1 #define CP3 2 #define CP1_CP2 3 #define CP1_CP3 4 #define CP2_CP3 5 #define CP1_CP2_CP3 6 // // メイン // int main( void ) { int i, r, flg_command, flg_cp; int dstSocket; struct hostent *hp; struct sockaddr_in dstAddr; char cmd[SEND_MAX]; char res[RECEIVE_MAX]; char destination[32] = "xxx.xxx.xxx.xxx"; // 初期化 for ( i=0; i< SEND_MAX; i++ ) { cmd[i] = 0x00; } for ( i=0; i< RECEIVE_MAX; i++ ) { res[i] = 0x00; } #ifdef DEBUG for ( i=0; i< SEND_MAX; i++ ) { printf("Init-> [%d] %x \n", i, cmd[i]); } for ( i=0; i< RECEIVE_MAX; i++ ) { printf("Init-> [%d] %x \n", i, res[i]); } #endif // コマンド、I/O(CPx)の設定 flg_command = XPORT_COMMAND_5; // flg_cp = CP1_CP2_CP3; // flg_cp = CP2; flg_cp = CP1_CP3; printf("flg_command[%d] flg_cp[%d] \n", flg_command, flg_cp); // コマンド生成 switch ( flg_command ) { case 0: cmd[0] = 0x11; // 入出力の方向確認 break; case 1: cmd[0] = 0x12; // Active H/L の確認 break; case 2: cmd[0] = 0x13; // ON/OFFの状態確認 break; case 3: cmd[0] = 0x19; // 入出力の方向設定 break; case 4: cmd[0] = 0x1a; // Active H/L の設定(全汎用I/Oピン共通) break; case 5: cmd[0] = 0x1b; // ON/OFFの設定 break; default: printf("Bad command [%x] \n", cmd[0]); return FALSE; break; } // パラメータ1、2の設定 if ( flg_command > XPORT_COMMAND_2 ) { // 全ピンを対象とする cmd[1] = 0x07; switch ( flg_cp ) { case 0: // ON: CP1 cmd[5] = 0x01; break; case 1: // ON: CP2 cmd[5] = 0x02; break; case 2: // ON: CP3 cmd[5] = 0x04; break; case 3: // ON: CP1, CP2 cmd[5] = 0x03; break; case 4: // ON: CP1, CP3 cmd[5] = 0x05; break; case 5: // ON: CP2, CP3 cmd[5] = 0x06; break; case 6: // ON: CP1, CP2, CP3 cmd[5] = 0x07; break; default: break; } } printf("cmd: [%x] [%x] \n", cmd[1], cmd[5]); // 初期化 bzero( ( char * )&dstAddr, sizeof( dstAddr ) ); dstAddr.sin_family = AF_INET; dstAddr.sin_port = htons( NETWORK_PORT ); hp = gethostbyname( destination ); bcopy( hp->h_addr, &dstAddr.sin_addr, hp->h_length ); // ソケット生成 dstSocket = socket( AF_INET, SOCK_STREAM, 0 ); // 接続 r = connect( dstSocket, ( struct sockaddr * )&dstAddr, sizeof( dstAddr ) ); if ( r< 0 ) { printf("Can not access [%s] \n",destination); return FALSE; } printf("Access [%s] \n", destination); // パケット送信 for ( i=0; i< SEND_MAX; i++ ) { printf("Send-> [%x] \n", cmd[i]); } r = write( dstSocket, cmd, sizeof(cmd) / sizeof(cmd[0]) ); // r = write( dstSocket, cmd, SEND_MAX, 0 ); // パケット受信 r = read( dstSocket, res, sizeof(res) / sizeof(res[0]) ); // r = read( dstSocket, res, RECEIVE_MAX ); for ( i=0; i< RECEIVE_MAX; i++ ) { printf("Packet-> [%x] \n", res[i]); } close( dstSocket ); return TRUE; }
Comments