Ejemplo n.º 1
0
int main( int argc, char *argv[]) {
			short		group ;
	unsigned	char		buf[16] ;
			int		msgLen ;
			int		opt ;
			int		sender	=	0 ;
			int		receiver	=	0 ;
			int		value ;
			int		repeat	=	0x20 ;
			knxMsg		myMsg ;
	/**
	 *
	 */
	strcpy( progName, *argv) ;
	printf( "%s: starting up ... \n", progName) ;
	/**
	 * get command line options
	 */
	while (( opt = getopt( argc, argv, "d:s:r:v:n?")) != -1) {
		switch ( opt) {
		case	'd'	:
			debugLevel	=	atoi( optarg) ;
			break ;
		case	's'	:
			sender	=	atoi( optarg) ;
			break ;
		case	'r'	:
			receiver	=	atoi( optarg) ;
			break ;
		case	'n'	:
			repeat	=	0x00 ;
			break ;
		case	'v'	:
			value	=	atoi( optarg) ;
			break ;
		case	'?'	:
			help() ;
			exit(0) ;
			break ;
		default	:
			help() ;
			exit( -1) ;
			break ;
		}
	}
	/**
	 *
	 */
	if ( sender != 0 && receiver != 0) {
		/**
		 *
		 */
		if ( debugLevel > 0) {
			fprintf( stderr, "%s: calling eibOpen() \n", progName) ;
		}
		eibOpen() ;
		myMsg.mtype	=	1 ;
		myMsg.control	=	0x9d | repeat ;
		myMsg.sndAdr	=	sender ;
		myMsg.rcvAdr	=	receiver ;
		myMsg.info	=	0xe0 | 0x01 ;
		myMsg.mtext[0]	=	0x00 ;
		myMsg.mtext[1]	=	0x80 | ( value & 0x01) ;
		eibSend( &myMsg) ;
		eibClose() ;
	} else {
		printf( "%s: invalid sender and/or receiver address\n", progName) ;
		help() ;
	}
	/**
	 *
	 */
	exit( 0);
}
Ejemplo n.º 2
0
int	main( int argc, char *argv[]) {
	eibHdl	*myEIB ;
	pid_t	childProcessId, waitProcessId ;
	int	opt ;
	int	portNo	=	10002 ;
	int	sleepTimer	=	0 ;
	char	serverName[64]	=	"" ;
	unsigned	char	buf, bufp ;
	unsigned	char	*rcvData ;
	unsigned	char	*sndData ;
	ipbridgeMode	myMode	=	eibClient ;
	/**
	 *
	 */
	int		pid ;
	int		rootSockfd ;
	int		workSockfd ;
	socklen_t	clilen;
	char		buffer[2048];
	struct		sockaddr_in serv_addr, cli_addr;
	int		n;
	struct		hostent	*server ;
	char	iniFilename[]	=	"knx.ini" ;
	/**
	 * setup the shared memory for EIB Receiving Buffer
	 */
//	signal( SIGINT, sigHandler) ;
	setbuf( stdout, NULL) ;
	strcpy( progName, *argv) ;
	_debug( 0, progName, "starting up ...") ;
	/**
	 *
	 */
	iniFromFile( iniFilename, iniCallback) ;
	/**
	 * get command line options
	 */
	strcpy( serverName, "") ;
	while (( opt = getopt( argc, argv, "D:P:Q:?")) != -1) {
		switch ( opt) {
		case	'D'	:
			debugLevel	=	atoi( optarg) ;
			break ;
		case	'P'	:
			portNo	=	atoi( optarg) ;
			break ;
		case	'Q'	:
			cfgQueueKey	=	atoi( optarg) ;
			break ;
		case	'?'	:
			help() ;
			exit(0) ;
			break ;
		default	:
			help() ;
			exit( -1) ;
			break ;
		}
	}
	myKnxLogger	=	knxLogOpen( 0) ;
	knxLog( myKnxLogger, progName, "starting up ...") ;
	myEIB	=	eibOpen( cfgSenderAddr, 0x00, cfgQueueKey, progName, APN_RDWR) ;
	/**
	 *
	 */
	knxLog( myKnxLogger, progName, "in server mode") ;
	myMode	=	eibServer ;
	rootSockfd	=	socket( AF_INET, SOCK_STREAM, 0) ;
	if ( rootSockfd < 0) {
		_debug( 0, progName, "Can not open socket");
		_debug( 0, progName, "Exiting with -1");
		return( -1);
	}
	bzero((char *) &serv_addr, sizeof( serv_addr)) ;
	serv_addr.sin_family		=	AF_INET ;
	serv_addr.sin_addr.s_addr	=	INADDR_ANY ;
	serv_addr.sin_port		=	htons( portNo) ;
	if ( bind( rootSockfd, ( struct sockaddr *) &serv_addr, sizeof( serv_addr)) < 0) {
		_debug( 0, progName, "Can not bind socket");
		_debug( 0, progName, "Exiting with -2");
		return( -2);
	}
	_debug( 0, progName, "Listening on socket");
	listen( rootSockfd, 5) ;
	clilen	=	sizeof( cli_addr) ;
	/**
	 *
	 */
	while ( debugLevel >= 0) {
		workSockfd	=	accept( rootSockfd, (struct sockaddr *) &cli_addr, &clilen) ;
		if ( workSockfd < 0) {
			_debug( 0, progName, "Can not accept");
			_debug( 0, progName, "Exiting with -3");
			return( -3);
		}
		pid	=	fork() ;
		if ( pid == 0) {
			hdlSocket( myEIB, workSockfd) ;
			exit( 0) ;
		} else {
			close( workSockfd) ;
		}
	}
	/**
	 *
	 */
	knxLog( myKnxLogger, progName, "shutting down ...") ;
	eibClose( myEIB) ;
	knxLogClose( myKnxLogger) ;
	exit( 0) ;
}
Ejemplo n.º 3
0
int	main( int argc, char *argv[]) {
		eibHdl	*myEIB ;
		int	opt ;
		int	status		=	0 ;
		int	sleepTimer	=	0 ;
		int	i ;
		time_t	actTime ;
	struct	tm	*myTime ;
		char	timeBuffer[64] ;
	int	cycleCounter ;
	/**
	 * define shared memory segment #0: COM Table
	 *	this segment holds information about the sizes of the other tables
 	 */
		key_t	shmCOMKey	=	SHM_COM_KEY ;
		int	shmCOMFlg	=	IPC_CREAT | 0666 ;
		int	shmCOMId ;
		int	shmCOMSize	=	256 ;
		int	*sizeTable ;
	/**
	 * define shared memory segment #1: OPC Table with buffer
	 *	this segment holds the structure defined in nodedata.h
 	 */
		key_t	shmOPCKey	=	SHM_OPC_KEY ;
		int	shmOPCFlg	=	IPC_CREAT | 0666 ;
		int	shmOPCId ;
		int	shmOPCSize ;
		node	*data ;
	/**
	 * define shared memory segment #2: KNX Table with buffer
	 *	this segment holds the KNX table defined in nodedata.h
 	 */
		key_t	shmKNXKey	=	SHM_KNX_KEY ;
		int	shmKNXFlg	=	IPC_CREAT | 0666 ;
		int	shmKNXId ;
		int	shmKNXSize	=	65536 * sizeof( float) ;
		float	*floats ;
		int	*ints ;
	/**
	 * define shared memory segment #3: CRF Table with buffer
	 *	this segment holds the cross-reference-table
 	 */
		key_t	shmCRFKey	=	SHM_CRF_KEY ;
		int	shmCRFFlg	=	IPC_CREAT | 0666 ;
		int	shmCRFId ;
		int	shmCRFSize	=	65536 * sizeof( int) ;
		int	*crf ;
	/**
	 * variables needed for the reception of EIB message
	 */
			FILE	*file ;
	unsigned	char	buf, myBuf[64] ;
			node	*actData ;
			node	*opcData ;
			int	opcDataSize ;
			int	rcvdBytes ;
			int	objectCount ;
			int	checksumError ;
			int	adrBytes ;
			int	n; 				// holds number of received characters
			int	monitor	=	0 ; 		// default: no message monitoring
	unsigned        int     control ;
	unsigned        int     addressType ;
	unsigned        int     routingCount ;
		int     expectedLength ;
			float	value ;
	unsigned        int     checkSum ;
	unsigned        char    checkS1 ;
			char    *ptr ;
		msgBuf  buffer ;
			knxMsg	myMsgBuf ;
			knxMsg	*myMsg ;
			char	xmlObjFile[128]	=	"/etc/knx.d/baos.xml" ;
			time_t		t ;
			struct	tm	tm ;
			int	lastSec	=	0 ;
			int	lastMin	=	0 ;
			char		iniFilename[]	=	"knx.ini" ;
	/**
	 *	END OF TEST SECTION
	 */
	signal( SIGINT, sigHandler) ;			// setup the signal handler for ctrl-C
	setbuf( stdout, NULL) ;				// disable output buffering on stdout
	strcpy( progName, *argv) ;
	_debug( 1, progName, "starting up ...") ;
	/**
	 *
	 */
	iniFromFile( iniFilename, iniCallback) ;
	/**
	 * get command line options
	 */
	while (( opt = getopt( argc, argv, "D:Q:mx:?")) != -1) {
		switch ( opt) {
		case	'Q'	:
			cfgQueueKey	=	atoi( optarg) ;
			break ;
		case	'D'	:
			debugLevel	=	atoi( optarg) ;
			break ;
		case	'm'	:
			monitor	=	1 ;
			break ;
		case	'x'	:
			strcpy( xmlObjFile, optarg) ;
			break ;
		case	'?'	:
			help() ;
			exit(0) ;
			break ;
		default	:
			help() ;
			exit( -1) ;
			break ;
		}
	}
	myKnxLogger	=	knxLogOpen( 0) ;
	knxLog( myKnxLogger, progName, "starting up ...") ;
	/**
	 *	TEXT SECTION
	 */
	opcData	=	getNodeTable( xmlObjFile, &objectCount) ;
	opcDataSize	=	objectCount * sizeof( node) ;
	for ( i=0 ; i<objectCount ; i++) {
		_debug( 1, "knxmon.c::main", "%s ... %d \n", opcData[i].name, opcData[i].knxGroupAddr) ;
	}
	/**
	 * setup the shared memory for COMtable
	 */
	_debug( 10, progName, "shmCOMKey........: %d", shmCOMKey) ;
	_debug( 10, progName, "  shmCOMSize.....: %d", shmCOMSize) ;
	_debug( 10, progName, "  shmCOMId.......: %d", shmCOMId) ;
	_debug( 1, progName, "trying to obtain shared memory COMtable ...") ;
	if (( shmCOMId = shmget( shmCOMKey, shmCOMSize, IPC_CREAT | 0600)) < 0) {
		_debug( 0, progName, "shmget failed for COMtable");
		exit( -1) ;
	}
	_debug( 1, progName, "trying to attach shared memory COMtable") ;
	if (( sizeTable = (int *) shmat( shmCOMId, NULL, 0)) == (int *) -1) {
		_debug( 0, progName, "shmat failed for COMtable");
		exit( -1) ;
	}
	_debug( 10, progName, "  Address..: %8lx", (unsigned long) sizeTable) ;
	sizeTable[ SIZE_COM_TABLE]	=	256 ;
	sizeTable[ SIZE_KNX_TABLE]	=	shmKNXSize ;
	sizeTable[ SIZE_CRF_TABLE]	=	shmCRFSize ;
	/**
	 * setup the shared memory for OPCtable
	 */
	_debug( 1, progName, "trying to obtain shared memory OPCtable ...") ;
//	shmOPCSize	=	sizeof( _data) ;
	shmOPCSize	=	opcDataSize ;
	sizeTable[ SIZE_OPC_TABLE]	=	shmOPCSize ;
	if (( shmOPCId = shmget (shmOPCKey, shmOPCSize, shmOPCFlg)) < 0) {
		_debug( 0, progName, "shmget failed for OPCtable");
		exit(1);
	}
	if ( debugLevel > 0) {
		_debug( 1, progName, "trying to attach shared memory OPCtable") ;
	}
	if (( data = (node *) shmat(shmOPCId, NULL, 0)) == (node *) -1) {
		_debug( 0, progName, "shmat failed for OPCtable");
		exit(1);
	}
	if ( debugLevel > 10) {
		_debug( 1, progName, "shmOPCKey........: %d", shmOPCKey) ;
		_debug( 1, progName, "  shmOPCSize.....: %d", shmOPCSize) ;
		_debug( 1, progName, "  shmOPCId.......: %d", shmOPCId) ;
		_debug( 1, progName, "  Address..: %8lx", (unsigned long) data) ;
	}
//	memcpy( data, _data, sizeof( _data)) ;
	memcpy( data, opcData, opcDataSize) ;
	/**
	 * setup the shared memory for KNXtable
	 */
	knxLog( myKnxLogger, progName, "shmKNXKEY := %d", shmKNXKey) ;
	if ( debugLevel > 0) {
		_debug( 1, progName, "trying to obtain shared memory KNXtable ...") ;
	}
	if (( shmKNXId = shmget( shmKNXKey, shmKNXSize, IPC_CREAT | 0666)) < 0) {
		_debug( 0, progName, "shmget failed for KNXtable");
		exit( -1) ;
	}
	if ( debugLevel > 0) {
		_debug( 1, progName, "trying to attach shared memory KNX table") ;
	}
	if (( floats = (float *) shmat( shmKNXId, NULL, 0)) == (float *) -1) {
		_debug( 0, progName, "shmat failed for KNXtable");
		exit( -1) ;
	}
	if ( debugLevel > 10) {
		_debug( 1, progName, "shmKNXKey........: %d", shmKNXKey) ;
		_debug( 1, progName, "  shmKNXSize.....: %d", shmKNXSize) ;
		_debug( 1, progName, "  shmKNXId.......: %d", shmKNXId) ;
	}
	ints	=	(int *) floats ;
	/**
	 * setup the shared memory for CRFtable
	 */
	if ( debugLevel > 0) {
		_debug( 1, progName, "trying to obtain shared memory CRFtable ...") ;
	}
	if (( shmCRFId = shmget( shmCRFKey, shmCRFSize, IPC_CREAT | 0600)) < 0) {
		_debug( 0, progName, "shmget failed for CRFtable");
		exit( -1) ;
	}
	if ( debugLevel > 0) {
		_debug( 1, progName, "trying to attach shared memory CRFtable...") ;
	}
	if (( crf = (int *) shmat( shmCRFId, NULL, 0)) == (int *) -1) {
		_debug( 0, progName, "shmat failed for CRFtable");
		exit( -1) ;
	}
	if ( debugLevel > 10) {
		_debug( 1, progName, "shmCRFKey........: %d", shmCRFKey) ;
		_debug( 1, progName, "  shmCRFSize.....: %d", shmCRFSize) ;
		_debug( 1, progName, "  shmCRFId.......: %d", shmCRFId) ;
	}
	/**
	 * build the cross-reference table for the KNX group numbers
	 */
	createCRF( data, objectCount, crf, (void *) floats) ;
	for ( i=0 ; i < 65536 ; i++) {
		if ( crf[i] != 0) {
			_debug( 1, progName, "KNX Group Address %d is assigned", i) ;
		}
	}
	/**
	 *
	 */
	if ( debugLevel > 0) {
		dumpDataAll( data, objectCount, (void *) floats) ;
	}
	myEIB	=	eibOpen( cfgSenderAddr, 0x00, cfgQueueKey, progName, APN_RDONLY) ;
	_debug( 1, progName, "readIndex := %d", myEIB->readRcvIndex) ;
	sleepTimer	=	0 ;
	cycleCounter	=	0 ;
	while ( debugLevel >= 0) {
		_debug( 1, progName, "cycleCounter := %d", cycleCounter++) ;
		myMsg	=	eibReceiveMsg( myEIB, &myMsgBuf) ;
		if ( myMsg != NULL) {
			_debug( 1, progName, "received from origin ... %d", myMsg->apn) ;
			sleepTimer	=	0 ;
			if ( monitor == 1) {
				eibDump( "Monitor received ...:", myMsg) ;
			}
			/**
			 * only process if apn != 0, ie. skip messages from "local" messengers
			 * and we know about the receiving group address
			 */
			if ( myMsg->apn != 0 && crf[ myMsg->rcvAddr] != 0) {
				_debug( 3, progName, "received a known group address ... %d", myMsg->rcvAddr) ;
				actData	=	&data[ crf[ myMsg->rcvAddr]] ;
//				if ( actData->log != 0) {
//					_debug( 1, progName, "will be logged ...") ;
//				} else {
//					_debug( 1, progName, "will *** NOT *** be logged ...") ;
//				}
				switch ( myMsg->tlc) {
				case	0x00	:		// UDP
				case	0x01	:		// NDP
					switch ( myMsg->apci) {
					case	0x02	:	// groupValueWrite
						_debug( 1, progName, "WRITING ... ") ;
						_debug( 1, progName, ".......%s", actData->name) ;
						actData->knxHWAddr	=	myMsg->sndAddr ;
						switch ( actData->type) {
						case	dtBit	:
							_debug( 1, progName, "Assigning BIT") ;
							value	=	myMsg->mtext[1] & 0x01 ;
							actData->val.i	=	value ;
							ints[ myMsg->rcvAddr]	=	value ;
							break ;
						case	dtFloat2	:
							_debug( 1, progName, "Assigning HALF-FLOAT") ;
							value	=	hfbtf( &myMsg->mtext[2]) ;
							actData->val.f	=	value ;
							floats[ myMsg->rcvAddr]	=	value ;
							break ;
						default	:
							break ;
						}
						break ;
					}
					break ;
				case	0x02	:		// UCD
					break ;
				case	0x03	:		// NCD
					break ;
				}
                                if ( debugLevel > 10) {
                                        t       =       time( NULL) ;
                                        tm	=	*localtime( &t) ;
//                                      if ( tm.tm_sec != lastSec) {
                                                lastSec	=	tm.tm_sec ;
                                                dumpDataAll( data, objectCount, (void *) floats) ;
//                                      }
                                }
			} else if ( myMsg->apn != 0 && crf[ myMsg->rcvAddr] != 0) {
				_debug( 1, progName, "received an un-known group address [%5d]...", myMsg->rcvAddr) ;
			} else {
				_debug( 1, progName, "message with APN == 0!") ;
			}
		} else {
//			sleepTimer++ ;
//			if ( sleepTimer > MAX_SLEEP)
//				sleepTimer	=	MAX_SLEEP ;
//			_debug( 1, progName, "will go to sleep ... for %d seconds", sleepTimer) ;
//			sleep( sleepTimer) ;
		}
	}
	/**
	 * close EIB port
	 */
	knxLog( myKnxLogger, progName, "shutting down up ...") ;
	eibClose( myEIB) ;
	knxLogClose( myKnxLogger) ;
	exit( status) ;
}
Ejemplo n.º 4
0
int main( int argc, char *argv[]) {
			eibHdl		*myEIB ;
			int		myAPN	=	0 ;
			short		group ;
	unsigned	char		buf[16] ;
			int		msgLen ;
			int		opt ;
			int		sender	=	0 ;
			int		receiver	=	0 ;
			int		value ;
			int		repeat	=	1 ;		// default: repeat the EIB message
			char		iniFilename[]	=	"knx.ini" ;
	/**
	 *
	 */
	strcpy( progName, *argv) ;
	printf( "%s: starting up ... \n", progName) ;
	/**
	 *
	 */
	iniFromFile( iniFilename, iniCallback) ;
	/**
	 * get command line options
	 */
	while (( opt = getopt( argc, argv, "D:Q:s:r:v:n?")) != -1) {
		switch ( opt) {
		case	'D'	:
			debugLevel	=	atoi( optarg) ;
			break ;
		case	'Q'	:
			cfgQueueKey	=	atoi( optarg) ;
			break ;
		case	'n'	:
			repeat	=	0x0 ;
			break ;
		case	'r'	:
			receiver	=	atoi( optarg) ;
			break ;
		case	's'	:
			cfgSenderAddr	=	atoi( optarg) ;
			break ;
		case	'v'	:
			value	=	atoi( optarg) ;
			break ;
		case	'?'	:
			help() ;
			exit(0) ;
			break ;
		default	:
			help() ;
			exit( -1) ;
			break ;
		}
	}
	/**
	 *
	 */
	if ( cfgSenderAddr != 0 && receiver != 0) {
		/**
		 *
		 */
		myEIB	=	eibOpen( cfgSenderAddr, 0, cfgQueueKey, progName, APN_WRONLY) ;
		eibWriteBit( myEIB, receiver, ( value & 0x01), 1) ;
		eibClose( myEIB) ;
	} else {
		printf( "%s: invalid parameter; see:\n", progName) ;
		help() ;
	}
	/**
	 *
	 */
	exit( 0);
}