クライアントプログラム(XPort)

MATLAB

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;
}
ラズベリーパイ4 8GB Raspberry Pi4 model B 8GB Element14社 正規品 ヒートシンク付き

Comments