TestCommunication.h /* * TestCommunication.h * * Created on: 2010-1-26 * Author: Administrator */ #ifndef TESTCOMMUNICATION_H_ #define TESTCOMMUNICATION_H_ #include <stdlib.h> #include <unistd.h> #include <strings.h> #include <pthread.h> #include <netdb.h> #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #include "TestDebug.h" #include "TestNET.h" // 创建监听线程,接收检测命令 void start_udp_listener(); // 广播检测结果 unsigned long broadcast_testres(unsigned long device, unsigned long cmd, unsigned long res); //心跳广播检测 unsigned long broadcast_tick(); #endif /* TESTCOMMUNICATION_H_ */ TestCommunication.c /* * TestCommunication.c * * Created on: 2010-1-26 * Author: Administrator */ #include "TestCommunication.h" #include "TestCPU.h" #include "TestMemory.h" #include "TestNET.h" #include "TestSerial.h" #include "TestPS2.h" #include "TestCommunication.h" void handle_cmd(unsigned long device, unsigned long cmd) { unsigned char testResult = DEVICE_ERROR; switch (device) { case DEVICE_CPU: /* * 执行CPU诊断 */ if ((testResult = cpu_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("CPU test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("CPU test fault!/n"); #endif } break; case DEVICE_MEMORY: /* * 执行内存诊断 */ if ((testResult = mem_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("Memory test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("Memory test fault!/n"); #endif } break; case DEVICE_SERIAL_01: /* * 执行串口1诊断 */ if ((testResult = serial_port_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("Serial test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("Serial test fault!/n"); #endif } break; case DEVICE_SERIAL_02: /* * 执行串口2诊断 */ if ((testResult = serial_port_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("Serial test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("Serial test fault!/n"); #endif } break; case DEVICE_SERIAL_03: /* * 执行串口3诊断 */ if ((testResult = serial_port_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("Serial test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("Serial test fault!/n"); #endif } break; case DEVICE_SERIAL_04: /* * 执行串口4诊断 */ if ((testResult = serial_port_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("Serial test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("Serial test fault!/n"); #endif } break; case DEVICE_AMD_NET: /* * 执行AMD网卡诊断 */ testResult = DEVICE_NO_ERROR; break; case DEVICE_INTEL_NET1: /* * 执行Intel网卡诊断 */ break; case DEVICE_INTEL_NET2: /* * 执行Intel网卡2诊断 */ break; case DEVICE_PARALLEL: /* * 执行并口诊断 */ break; case DEVICE_KEYBOARD: /* * 执行键盘诊断 */ if ((testResult = ps2_keyboard_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("PS2 keyboard test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("PS2 keyboard test fault!/n"); #endif } break; case DEVICE_MOUSE: /* * 执行鼠标诊断 */ if ((testResult = ps2_mouse_test(device, cmd)) != DEVICE_ERROR) { #ifdef __DEBUG__ printf("PS2 mouse test fine!/n"); #endif } else { #ifdef __DEBUG__ printf("PS2 mouse test fault!/n"); #endif } break; } if(device==DEVICE_AMD_NET||device==DEVICE_INTEL_NET1||device==DEVICE_INTEL_NET2) { serial_send(device,cmd,testResult); } else { broadcast_testres(device, cmd, testResult); } return; } void handle_data(char buf[], unsigned long buflen) { char *pbuf = &buf[0]; unsigned long header_len = strlen(COMM_HEADER); unsigned long device; unsigned long cmd; char* pheader = malloc(strlen(COMM_HEADER)); /* * 处理文件头 */ // 处理报文头 strcpy(pheader, COMM_HEADER); if (strncmp(pbuf, pheader, strlen(COMM_HEADER)) != 0) return; free(pheader); pbuf += header_len; memcpy(&device, pbuf, sizeof(device)); pbuf += sizeof(device); memcpy(&cmd, pbuf, sizeof(cmd)); handle_cmd(device, cmd); return; } /* * UDP接收测试函数 */ unsigned long udp_server(unsigned long port, char * clientIP, char * buf, int buflen) { struct sockaddr_in serverAddr; struct sockaddr_in clientAddr; int sockAddrSize; int sFd; int ret; int i; /*设置服务器网卡地址*/ sockAddrSize = sizeof(struct sockaddr_in); bzero((char *) &serverAddr, sockAddrSize); //清空结构体 //初始化结构体 serverAddr.sin_len = sockAddrSize; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* create a UDP-based socket */ if ((sFd = socket(AF_INET, SOCK_DGRAM, 0)) == 0) { return -1; } /* bind socket to local address */ if (bind(sFd, (struct sockaddr *) &serverAddr, sockAddrSize) == -1) { close(sFd); return -1; } /*read data from a socket and satisfy requests */ bzero(buf, buflen); #ifdef __DEBUG__ printf("UDP receiver begin works./n"); #endif for (;;) { ret = recvfrom(sFd, buf, buflen, 0, (struct sockaddr *) &clientAddr, &sockAddrSize); if (ret == -1) { close(sFd); return -1; } else { clientIP = (char *) inet_ntoa(clientAddr.sin_addr); /*发送收到报文信息*/ #ifdef __DEBUG__ printf("Receive %d Bytes from %s(port:%d)./nData:/t", ret, clientIP, ntohs(clientAddr.sin_port)); for (i = 0; i < ret; i++) { printf("%#04X ", buf[i]); if ((i % 16) == 0) printf("/n"); } printf("/n"); #endif /* * 处理接收到的数据 */ handle_data(buf, ret); /* * 同步主线程,返回接收到的数据 */ continue; } } /*关闭socket*/ close(sFd); #ifdef __DEBUG__ printf("UDP receiver stopped./n"); #endif return ret; } void* udp_test_threadfunc(void* arg) { char clientIP[MAX_PATH]; char buf[MAX_BUFLEN]; int buflen = MAX_BUFLEN; // 增加线程权限 ThreadCtl(_NTO_TCTL_IO, 0); if (udp_server(UDP_RECV_PORT, &clientIP[0], &buf[0], buflen) == -1) { #ifdef __DEBUG__ printf("UDP receiver is wrong."); #endif } else { #ifdef __DEBUG__ printf("UDP receiver receive packets from remote, now exit."); #endif } return NULL; } void start_udp_listener() { pthread_create(NULL, NULL, udp_test_threadfunc, NULL); } unsigned long broadcast_tick() { unsigned long device =DEVICE_AMD_NET; unsigned long cmd = TEST_TICK_NET; unsigned long res = DEVICE_NO_ERROR; unsigned char buf[MAX_PATH]; unsigned long buflen = 0; unsigned char *pdata = buf; // 清空内存 memset(pdata, 0, MAX_PATH); // 组织内容 memcpy(pdata, COMM_HEADER, strlen(COMM_HEADER)); buflen += strlen(COMM_HEADER); pdata += strlen(COMM_HEADER); memcpy(pdata, &device, sizeof(device)); buflen += sizeof(device); pdata += sizeof(device); memcpy(pdata, &cmd, sizeof(cmd)); buflen += sizeof(cmd); pdata += sizeof(cmd); memcpy(pdata, &res, sizeof(res)); buflen += sizeof(res); if (udp_send("222.1.6.188", "255.255.255.255", UDP_BROADCASR_PORT, &buf[0], buflen) != 0) return 0; return 1; } unsigned long broadcast_testres(unsigned long device, unsigned long cmd, unsigned long res) { unsigned char buf[MAX_PATH]; unsigned long buflen = 0; unsigned char *pdata = buf; // 清空内存 memset(pdata, 0, MAX_PATH); // 组织内容 memcpy(pdata, COMM_HEADER, strlen(COMM_HEADER)); buflen += strlen(COMM_HEADER); pdata += strlen(COMM_HEADER); memcpy(pdata, &device, sizeof(device)); buflen += sizeof(device); pdata += sizeof(device); memcpy(pdata, &cmd, sizeof(cmd)); buflen += sizeof(cmd); pdata += sizeof(cmd); memcpy(pdata, &res, sizeof(res)); buflen += sizeof(res); if (udp_send("222.1.6.188", "255.255.255.255", UDP_BROADCASR_PORT, &buf[0], buflen) != 0) return 0; return 1; }