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