예제 #1
0
/*--------------------------------------------------------------------------------*/
void openPort(int port, bool auf) {
        /* Open serial port */
	if (port > 0 && port < 10) {
		initserie() ;
		
		cmd[0] = 13 ;						/* 13					*/
		cmd[1] = k8056_addr ;					/* Adresse				*/
		cmd[2] = auf?'S':'C';					/* Instruction				*/
		cmd[3] = (char) (port+48);					/* # relais, address or status		*/
		cmd[4] = checksum(cmd) ;				/* Checksum				*/
		
		//std::cout << cmd[2] << cmd[3] << std::endl;
		SendCommand(cmd) ;
		
		/* Close serial port */
		tcsetattr(k8056_port, TCSANOW, &oldtio);		/* Backup old port settings   */
		close(k8056_port);
	} else {
		std::cerr << "Port " << port << " gibts nicht!" << std::endl;
	}
	usleep(1000000);
}
예제 #2
0
/*------------------------------------------------------------------------------*/
int main(int argc, char *argv[]) {
    /* Initialize the logging interface */
    openlog( DAEMON_NAME, LOG_PID, LOG_LOCAL5 );
    syslog( LOG_INFO, "starting k8056netd" );

    /* One may wish to process command line arguments here */
 	parse_cmdline(argc,argv) ;

	addr_in_size = sizeof(struct sockaddr_in);

	// Détournement du signal émis à la mort du fils (il ne reste pas zombie)
//	signal(SIGCHLD, SIG_IGN);

	msg = (char *)malloc(MSGSIZE);

	from = (struct sockaddr_in *)malloc(addr_in_size);
	my_addr = (struct sockaddr_in *)malloc(addr_in_size);

	memset((char *)my_addr,(char)0,addr_in_size);
	my_addr->sin_family = AF_INET;
	my_addr->sin_addr.s_addr = htonl(INADDR_ANY);
	my_addr->sin_port = htons(portnum);

	if((sockfd = socket (PF_INET, SOCK_DGRAM, 0)) < 0){

		if (verbose) fprintf(stderr,"Erreur %d dans socket: %s\n",errno,strerror(errno));
		exit(errno);
	};

	if(bind(sockfd, (struct sockaddr *)my_addr, addr_in_size) < 0){
		if (verbose)  fprintf(stderr,"Erreur %d dans bind: %s\n",errno,strerror(errno));
		if(errno != EADDRINUSE) exit(errno);
	};

	/* On daemonize */
	if (debug)	syslog( LOG_INFO, "daemonize k8056netd" );
    daemonize( "/var/lock/" DAEMON_NAME );

    /* Now we are a daemon -- do the work for which we were paid */

	if (verbose)  fprintf(stdout,"Prêt a reçevoir\n");
	if (debug) syslog( LOG_INFO, "On ecoute le port UDP" );
  	while(1){
  		if (debug) syslog( LOG_INFO, "On est dans la boucle" );
		if((cc = recvfrom (sockfd,msg,MSGSIZE,0,(struct sockaddr *)from,
           &addr_in_size)) == -1){
			if (verbose)  fprintf(stderr,"Erreur %d dans recvfrom: %s\n",
				errno,strerror(errno));
			exit(errno);
		};

		fromaddr = from->sin_addr.s_addr;
		msg[cc] = '\0';

		if (verbose)  fprintf(stdout,"Reçue de  %s port %d: %s\n",
		(gethostbyaddr((char *)&fromaddr,
         sizeof(fromaddr),
         PF_INET))->h_name,
		from->sin_port,msg);

	if (debug) syslog( LOG_INFO, "Reçue de  %s port %d: %s\n",
		(gethostbyaddr((char *)&fromaddr,
         sizeof(fromaddr),
         PF_INET))->h_name,
		from->sin_port,msg);
		/* Ouverture port serie */
		initserie() ;
		if (debug)	syslog( LOG_INFO, "init serie fait" );

		/* Formate msg vers cmd et envoie */
		sendserie(msg);
			if (debug) syslog( LOG_INFO, "Send serie fait" );

		/* on attend avant de revenir a l'ecoute */
		sleep(3);
		if (debug)	syslog( LOG_INFO, "On repart" );
		// signal(SIGCHLD,SigCatcher);
       /* Finish up */
    if (debug) syslog( LOG_NOTICE, "terminated" );
    closelog();

	}
        /* Quitt... */
	if (verbose) printf("----- ICI ON SORT -----\n");

    return 0;

}
예제 #3
0
/*------------------------------------------------------------------------------*/
int main(int argc, char *argv[])
{

    /* Init. interceptions les signaux */
    init_interruptions_signal() ;

    /* Ouvre fichier log syslog */
    openlog("xpl-teleinfo", LOG_PID, LOG_USER) ;
    syslog(LOG_INFO, "Demarrage ...") ;

    /* Init port serie. */
    fdserial = initserie() ;

    /* Init socket xpl. */
    sockxpl = sockxpl_init() ;

    do
    {
        no_essais = 1 ;
        do
        {
            // Lit trame teleinfo.
            LiTrameSerie(fdserial) ;

            ts = time(0) ;                                     //Lit date/heure systeme.
            dc = localtime(&ts) ;
            strftime(timestamp,sizeof timestamp,"%s",dc);

            if ( LitValEtiquettes() ) 			// Lit valeurs des etiquettes de la liste.
            {
                if ( ( nophase=DepasseCapacite() ) ) 		// Test si etiquette depassement intensite.
                {
                    sprintf( datateleinfo, "ADIR%d=%s\nADCO=%s\nIINST1=%s\nIINST2=%s\nIINST3=%s\n",
                             nophase, valeurs[16 + nophase], valeurs[0], valeurs[6], valeurs[7], valeurs[8]) ;
                    sendxplteleinfobasicmsg("xpl-trig", datateleinfo) ;		// Envoie data sur reseau xPL.
                    writetrameteleinfo(message, timestamp) ;			// Enregistre trame.
                }
                else if ( ! (strlen(valeurs[13]) ) )			// Test si valeur PAPP vide (possible apres trames ADIRn).
                {
                    sprintf( datateleinfo, "ADCO=%s\nIINST1=%s\nIINST2=%s\nIINST3=%s\n",
                             valeurs[0], valeurs[6], valeurs[7], valeurs[8]) ;
                    sendxplteleinfobasicmsg("xpl-trig", datateleinfo) ;		// Envoie data sur reseau xPL.
                    writetrameteleinfo(message, timestamp) ;			// Enregistre trame.
                }
                else if ( minutes_courantes != dc -> tm_min )	// Test si une est passee.
                {
                    minutes_courantes = dc -> tm_min ;
                    sprintf( datateleinfo, "ADCO=%s\nOPTARIF=%s\nISOUSC=%s\nHCHP=%s\nHCHC=%s\nPTEC=%s\nIINST1=%s\nIINST2=%s\nIINST3=%s\nIMAX1=%s\nIMAX2=%s\nIMAX3=%s\nPMAX=%s\nPAPP=%s\nHHPHC=%s\nMOTDETAT=%s\nPPOT=%s\n",
                             valeurs[0], valeurs[1], valeurs[2], valeurs[3], valeurs[4], valeurs[5], valeurs[6], valeurs[7], valeurs[8], valeurs[9], valeurs[10], valeurs[11], valeurs[12], valeurs[13], valeurs[14], valeurs[15], valeurs[16]) ;
                    sendxplteleinfobasicmsg("xpl-trig", datateleinfo) ;		// Envoie data sur reseau xPL.
                }
            }
            else
            {
                writetrameteleinfo(message, timestamp) ;	// Si erreur checksum enregistre trame.
                no_essais++ ;
            }
        }
        while ( (erreur_checksum) && (no_essais <= nb_essais) ) ;
    }
    while (! finprog) ;

    syslog(LOG_INFO, "Fermeture socket xPL !") ;
    close(sockxpl) ;
    syslog(LOG_INFO, "Fermeture port serie. !") ;
    close(fdserial) ;
    syslog(LOG_INFO, "Fin programme.") ;
    closelog() ;
    exit(0) ;
}