int main (int ac, char *ag[]) { int len; EIBConnection *con; eibaddr_t dest; uchar buf[255] = { 0, 0x80 }; if (ac < 4) die ("usage: %s url eibaddr val val ...", ag[0]); con = EIBSocketURL (ag[1]); if (!con) die ("Open failed"); dest = readgaddr (ag[2]); len = readBlock (buf + 2, sizeof (buf) - 2, ac - 3, ag + 3); if (EIBOpen_GroupSocket (con, 1) == -1) die ("Connect failed"); len = EIBSendGroup (con, dest, 2 + len, buf); if (len == -1) die ("Request failed"); printf ("Send request\n"); EIBClose (con); return 0; }
void KnxConnection::Run (pth_sem_t * stop1) { if (url_m == "") return; stop_m = pth_event (PTH_EVENT_SEM, stop1); bool retry = true; while (retry) { con_m = EIBSocketURL(url_m.c_str()); if (con_m) { EIBSetEvent (con_m, stop_m); if (EIBOpen_GroupSocket (con_m, 0) != -1) { logger_m.infoStream() << "KnxConnection: Group socket opened. Waiting for messages." << endlog; // If scope reached this point, there is no doubt that the // connection with the bus is up and ready. isReady_m = true; int retval; while ((retval = checkInput()) > 0) { /* TODO: find another way to check if event occured struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; pth_select_ev(0,0,0,0,&tv,stop); */ } if (retval == -1) retry = false; } else logger_m.errorStream() << "Failed to open group socket." << endlog; if (con_m) EIBClose(con_m); con_m = 0; } else logger_m.errorStream() << "Failed to open knxConnection url." << endlog; if (retry) { struct timeval tv; tv.tv_sec = 60; tv.tv_usec = 0; pth_select_ev(0,0,0,0,&tv,stop_m); if (pth_event_status (stop_m) == PTH_STATUS_OCCURRED) retry = false; } } logger_m.infoStream() << "Out of KnxConnection loop." << endlog; pth_event_free (stop_m, PTH_FREE_THIS); stop_m = 0; }
int main (int argc, char *argv[]) { int len; EIBConnection *eibcon; eibaddr_t eibdest; eibaddr_t eibsrc; uchar eibbuf[200]; int tmpeibval; int sw_verbose = -1; FILE *fh_cfg_file = NULL; // Файл с соответствиями KNX телеграммы <-> IPкоманды listGroupAddr myListGA[LENGTH_OF_LIST_OF_GADDR]; eibaddr_t testga; int index_gaddr; // index for group address array char *parsed_cfg_str; // Будет равна LENGTH_OF_CMD_STR char mcom[] = "next\n"; int size_of_list_gaddr; // real length of list of group address - counting due to read if (argc < 3) die ("usage: %s Url(ip:localhost:6720) file(with list of cmd)", argv[0]); //Prepare KNX connection if (argc > 3) sw_verbose = strncmp(argv[3], "--v", 3); // Выводить сообщения в stdout если присутствует ключ --v else sw_verbose = 1; eibcon = EIBSocketURL (argv[1]); if (!eibcon) die ("Open failed"); if (EIBOpen_GroupSocket (eibcon, 0) == -1) die ("Connect failed"); //Fill array from file if((fh_cfg_file = fopen(argv[2], "r")) == NULL) die ("Error Open file with list of group address"); // Читаем командные строки из конфигурационного файла и заполняем массив структур myListGA index_gaddr = 0; parsed_cfg_str = (char*)malloc(LENGTH_OF_CMD_STR * sizeof(char)); while(fgets(parsed_cfg_str, LENGTH_OF_CMD_STR, fh_cfg_file) != NULL) { // Здесь парсим строку convert_str_to_myListGA(parsed_cfg_str, myListGA, index_gaddr); index_gaddr++; if(index_gaddr == LENGTH_OF_LIST_OF_GADDR) break; } free(parsed_cfg_str); size_of_list_gaddr=index_gaddr; // real number of monitoring group address if(sw_verbose == 0) { for(index_gaddr=0; index_gaddr != size_of_list_gaddr; index_gaddr++) printf("Result N:%d -> %s - %d - %s - %d - %s - %X\n", index_gaddr, myListGA[index_gaddr].group_addr,\ myListGA[index_gaddr].value, myListGA[index_gaddr].send_to_ip, myListGA[index_gaddr].send_to_port,\ myListGA[index_gaddr].cmd_string, myListGA[index_gaddr].group_addr_in_hex); } fclose(fh_cfg_file); while (1) { len = EIBGetGroup_Src (eibcon, sizeof (eibbuf), eibbuf, &eibsrc, &eibdest); if (len == -1) die ("Read failed"); if (len < 2) die ("Invalid Packet"); if ((eibbuf[0] & 0x3) || (eibbuf[1] & 0xC0) == 0xC0) { if(sw_verbose == 0) { printf ("Unknown APDU from "); printIndividual (eibsrc); printf (" to "); printGroup (eibdest); printf (": "); printHex (len, eibbuf); printf ("\n"); } } else { if(sw_verbose == 0) { switch (eibbuf[1] & 0xC0) { case 0x00: printf ("Read"); break; case 0x40: printf ("Response"); break; case 0x80: printf ("Write"); break; } printf (" from "); printIndividual (eibsrc); printf (" to "); printGroup (eibdest); if (eibbuf[1] & 0xC0) { printf (": "); if (len == 2) { printf ("%02X", eibbuf[1] & 0x3F); } else printHex (len - 2, eibbuf + 2); } printf(" Destination in HEX is -> %X ", eibdest); } tmpeibval = eibbuf[1] & 0x3F; for(index_gaddr=0; index_gaddr != size_of_list_gaddr; index_gaddr++) { if((myListGA[index_gaddr].group_addr_in_hex == eibdest) && (myListGA[index_gaddr].value == tmpeibval)) { if(sw_verbose == 0) { printf("\n Caught command => %s \n", myListGA[index_gaddr].cmd_string); } mpdControl(myListGA[index_gaddr].cmd_string, myListGA[index_gaddr].send_to_ip, myListGA[index_gaddr].send_to_port, sw_verbose); } } fflush (stdout); } } EIBClose (eibcon); return 0; }