Ejemplo n.º 1
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;
}
Ejemplo n.º 2
0
int KnxConnection::checkInput(pth_event_t ev)
{
    int len;
    eibaddr_t dest;
    eibaddr_t src;
    uint8_t buf[200];
    if (!con_m)
        return 0;
    if (ev)
        EIBSetEvent (con_m, ev);
    len = EIBGetGroup_Src (con_m, sizeof (buf), buf, &src, &dest);
    if (ev)
    {
        EIBSetEvent (con_m, stop_m);
        if (pth_event_status (ev) == PTH_STATUS_OCCURRED)
            return -1;
    }
    if (pth_event_status (stop_m) == PTH_STATUS_OCCURRED)
        return -1;
    if (len == -1)
    {
        logger_m.errorStream() << "Read failed" << endlog;
        return 0;
    }
    if (len < 2)
    {
        logger_m.warnStream() << "Invalid Packet (too short)" << endlog;
        return 0;
    }
    if (buf[0] & 0x3 || (buf[1] & 0xC0) == 0xC0)
    {
        logger_m.warnStream() << "Unknown APDU from "<< src << " to " << dest << endlog;
    }
    else
    {
        if (logger_m.isDebugEnabled())
        {
            DbgStream dbg = logger_m.debugStream();
            switch (buf[1] & 0xC0)
            {
            case 0x00:
                dbg << "Read";
                break;
            case 0x40:
                dbg << "Response";
                break;
            case 0x80:
                dbg << "Write";
                break;
            }
            dbg << " from " << Object::WriteAddr(src) << " to " << Object::WriteGroupAddr(dest);
            if (buf[1] & 0xC0)
            {
                dbg << ": " << std::hex << std::setfill ('0') << std::setw (2);
                if (len == 2)
                    dbg << (int)(buf[1] & 0x3F);
                else
                {
                    for (uint8_t *p = buf+2; p < buf+len; p++)
                        dbg << (int)*p << " ";
                }
            }
            dbg << std::dec << endlog;
        }
        if (listener_m)
        {
            switch (buf[1] & 0xC0)
            {
            case 0x00:
                listener_m->onRead(src, dest, buf, len);
                break;
            case 0x40:
                listener_m->onResponse(src, dest, buf, len);
                break;
            case 0x80:
                listener_m->onWrite(src, dest, buf, len);
                break;
            }
        }
    }
    return 1;
}