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