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); }
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) ; }
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) ; }
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); }