Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
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;
}