/* simple test to packetize the data and print it */ int main( int argc, char *argv[]) { volatile struct mstp_port_struct_t *mstp_port; long my_baud = 38400; uint32_t packet_count = 0; #if defined(_WIN32) unsigned long hThread = 0; uint32_t arg_value = 0; #else int rc = 0; pthread_t hThread; #endif int sockfd = -1; char *my_interface = "eth0"; /* mimic our pointer in the state machine */ mstp_port = &MSTP_Port; if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) { printf("mstsnap [serial] [baud] [network]\r\n" "Captures MS/TP packets from a serial interface\r\n" "and sends them to a network interface using SNAP \r\n" "protocol packets (mimics Cimetrics U+4 packet).\r\n" "\r\n" "Command line options:\r\n" "[serial] - serial interface.\r\n" " defaults to /dev/ttyUSB0.\r\n" "[baud] - baud rate. 9600, 19200, 38400, 57600, 115200\r\n" " defaults to 38400.\r\n" "[network] - network interface.\r\n" " defaults to eth0.\r\n" ""); return 0; } /* initialize our interface */ if (argc > 1) { RS485_Set_Interface(argv[1]); } if (argc > 2) { my_baud = strtol(argv[2], NULL, 0); } if (argc > 3) { my_interface = argv[3]; } sockfd = network_init(my_interface, ETH_P_ALL); if (sockfd == -1) { return 1; } RS485_Set_Baud_Rate(my_baud); RS485_Initialize(); MSTP_Port.InputBuffer = &RxBuffer[0]; MSTP_Port.InputBufferSize = sizeof(RxBuffer); MSTP_Port.OutputBuffer = &TxBuffer[0]; MSTP_Port.OutputBufferSize = sizeof(TxBuffer); MSTP_Port.This_Station = 127; MSTP_Port.Nmax_info_frames = 1; MSTP_Port.Nmax_master = 127; MSTP_Port.SilenceTimer = Timer_Silence; MSTP_Port.SilenceTimerReset = Timer_Silence_Reset; MSTP_Init(mstp_port); mstp_port->Lurking = true; fprintf(stdout, "mstpcap: Using %s for capture at %ld bps.\n", RS485_Interface(), (long) RS485_Get_Baud_Rate()); #if defined(_WIN32) hThread = _beginthread(milliseconds_task, 4096, &arg_value); if (hThread == 0) { fprintf(stderr, "Failed to start timer task\n"); } (void) SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); #else /* start our MilliSec task */ rc = pthread_create(&hThread, NULL, milliseconds_task, NULL); signal_init(); #endif atexit(cleanup); /* run forever */ for (;;) { RS485_Check_UART_Data(mstp_port); MSTP_Receive_Frame_FSM(mstp_port); /* process the data portion of the frame */ if (mstp_port->ReceivedValidFrame) { mstp_port->ReceivedValidFrame = false; snap_received_packet(mstp_port, sockfd); packet_count++; } else if (mstp_port->ReceivedInvalidFrame) { mstp_port->ReceivedInvalidFrame = false; fprintf(stderr, "ReceivedInvalidFrame\n"); snap_received_packet(mstp_port, sockfd); packet_count++; } if (!(packet_count % 100)) { fprintf(stdout, "\r%hu packets", packet_count); } } return 0; }
/* simple test to packetize the data and print it */ int main( int argc, char *argv[]) { volatile struct mstp_port_struct_t *mstp_port; long my_baud = 38400; uint32_t packet_count = 0; int sockfd = -1; char *my_interface = "eth0"; /* mimic our pointer in the state machine */ mstp_port = &MSTP_Port; if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) { printf("mstsnap [serial] [baud] [network]\r\n" "Captures MS/TP packets from a serial interface\r\n" "and sends them to a network interface using SNAP \r\n" "protocol packets (mimics Cimetrics U+4 packet).\r\n" "\r\n" "Command line options:\r\n" "[serial] - serial interface.\r\n" " defaults to /dev/ttyUSB0.\r\n" "[baud] - baud rate. 9600, 19200, 38400, 57600, 115200\r\n" " defaults to 38400.\r\n" "[network] - network interface.\r\n" " defaults to eth0.\r\n" ""); return 0; } /* initialize our interface */ if (argc > 1) { RS485_Set_Interface(argv[1]); } if (argc > 2) { my_baud = strtol(argv[2], NULL, 0); } if (argc > 3) { my_interface = argv[3]; } sockfd = network_init(my_interface, ETH_P_ALL); if (sockfd == -1) { return 1; } RS485_Set_Baud_Rate(my_baud); RS485_Initialize(); MSTP_Port.InputBuffer = &RxBuffer[0]; MSTP_Port.InputBufferSize = sizeof(RxBuffer); MSTP_Port.OutputBuffer = &TxBuffer[0]; MSTP_Port.OutputBufferSize = sizeof(TxBuffer); MSTP_Port.This_Station = 127; MSTP_Port.Nmax_info_frames = 1; MSTP_Port.Nmax_master = 127; MSTP_Port.SilenceTimer = Timer_Silence; MSTP_Port.SilenceTimerReset = Timer_Silence_Reset; MSTP_Init(mstp_port); fprintf(stdout, "mstpcap: Using %s for capture at %ld bps.\n", RS485_Interface(), (long) RS485_Get_Baud_Rate()); atexit(cleanup); #if defined(_WIN32) SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_PROCESSED_INPUT); SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlCHandler, TRUE); #else signal_init(); #endif /* run forever */ for (;;) { RS485_Check_UART_Data(mstp_port); MSTP_Receive_Frame_FSM(mstp_port); /* process the data portion of the frame */ if (mstp_port->ReceivedValidFrame) { mstp_port->ReceivedValidFrame = false; snap_received_packet(mstp_port, sockfd); packet_count++; } else if (mstp_port->ReceivedInvalidFrame) { mstp_port->ReceivedInvalidFrame = false; fprintf(stderr, "ReceivedInvalidFrame\n"); snap_received_packet(mstp_port, sockfd); packet_count++; } if (!(packet_count % 100)) { fprintf(stdout, "\r%hu packets", packet_count); } } return 0; }