#include "stm32f4xx_hal.h" #include "lwip.h" #include "udp.h" #include "string.h" #include "udpclient.h" #include "socket.h" #include "sockets.h" #include "def.h" #include "protocol.h" #include "encoder.h" static bool udp_client_active_flag; /* 定义端口号 */ #define UDP_REMOTE_PORT 8881 /* 远端端口 */ #define UDP_LOCAL_PORT 8880 /* 本地端口 */ #define SERVER_FAMILY AF_INET #define SOCKET_ERROR -1 #define BUFFER_SIZE 256 // 缓冲区大小 #define ACTIVE_ID 0XDD #define DEVICE_ID 0X01 static char s_sendBuf[BUFFER_SIZE]; // 发送数据的缓冲区 static char s_receBuf[BUFFER_SIZE]; // 接收数据的缓冲区 SOCKET sock_Client = 0; // 客户端用于通信的Socket static struct sockaddr_in addr_server; static struct sockaddr_in addr_client; static struct sockaddr_in sock; socklen_t sock_len = sizeof(sock); active_report_data_t active_report_data_structer; static void active_report_data_structer_init(void) { active_report_data_structer.index = 0; /* */ active_report_data_structer.cmd_id = ACTIVE_ID; /* 指令id */ active_report_data_structer.time_stamp_s = 0; /* 时间戳 */ active_report_data_structer.encoder_1_count = 0; /* 编码器1计数 */ active_report_data_structer.encoder_2_count = 0; /* 编码器2计数 */ active_report_data_structer.device_id = DEVICE_ID; /* 设备ID号 */ } static void active_report_data_structer_update(void) { /* 时间戳暂时先不管,后续完善 */ encoder_read_with_encoder(CAMERA_ENCODER, &active_report_data_structer.encoder_1_count); encoder_read_with_encoder(DRIVEN_ENCODER_GEAR, &active_report_data_structer.encoder_2_count); } static void udp_client_recv_data_dump(int recv_datalen) { for (size_t i = 0; i < recv_datalen; i++) { printf("%d ", s_receBuf[i]); } printf("\r\n"); } static void udp_client_create_basic_response(basic_report_data_t *rxcmd, int recv_datalen) { /* 因为发送和接收是一致的,所以不需要二次校验,直接把接收的数据发送即可 */ if (sendto(sock_Client, rxcmd, sizeof(basic_report_data_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { printf("send basic_response error\r\n"); } } void config_server(struct sockaddr_in *addr_server) { addr_server->sin_family = SERVER_FAMILY; addr_server->sin_port = htons(UDP_REMOTE_PORT); addr_server->sin_addr.s_addr = htonl(INADDR_BROADCAST); } void config_client(struct sockaddr_in *addr_client) { addr_client->sin_family = AF_INET; addr_client->sin_addr.s_addr = inet_addr("0.0.0.0"); addr_client->sin_port = htons(UDP_LOCAL_PORT); } void udp_client_send_string(char *pData) { memcpy(s_sendBuf, pData, strlen(pData)); if (sendto(sock_Client, s_sendBuf, strlen(pData), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { printf("send string error\n"); } } void udp_client_init(void) { active_report_data_structer_init(); // bool bOpt = true; struct timeval tv = {0, 20000}; config_server(&addr_server); config_client(&addr_client); // 创建客户端用于通信的Socket sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock_Client == SOCKET_ERROR) { printf("create socket error...\n"); } else { printf("create socket success!\n"); } // /* 开启广播 */ // if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_BROADCAST, (char *)&bOpt, sizeof(bOpt)) == SOCKET_ERROR) // { // printf("enable broadcast error...\n"); // } // else // { // printf("enable broadcast success!\n"); // } /* 设置超时 */ if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)) == SOCKET_ERROR) { printf("enable receive timeout error...\n"); } else { printf("enable receive timeout success!\n"); } /* 绑定 */ if (bind(sock_Client, (struct sockaddr *)&addr_client, sizeof(addr_client)) == SOCKET_ERROR) { printf("Bind failed"); return; } } void udp_client_recv(void) { int recv_datalen = recvfrom(sock_Client, s_receBuf, sizeof(s_receBuf), 0, (struct sockaddr *)&sock, &sock_len); if (recv_datalen > 0) { printf("udp recv data len:%d\r\n", recv_datalen); udp_client_parse(recv_datalen); } } void udp_client_parse(int recv_datalen) { udp_client_recv_data_dump(recv_datalen); if (recv_datalen >= adwin_config_protocol_size) { // adwin_config_protocol_t *rxcmd = (adwin_config_protocol_t *)s_receBuf; } else if (recv_datalen <= basic_report_data_size) { basic_report_data_t *rxcmd = (basic_report_data_t *)s_receBuf; if (computesum8((char *)rxcmd, recv_datalen - 1) != rxcmd->checksum) { /* 校验失败 */ printf("checksum error\r\n"); return; } switch (rxcmd->cmd_id) { case CMD_SET_AUTOMATIC_REPORTING_FREQUENCY: /* 设置自动上报频率 */ /* code */ break; case CMD_GET_ENCODER_DATA: /* 获取编码器数据 */ /* code */ break; case CMD_SET_ACTIVE: /* 设置主动上报 */ if ((rxcmd->data == 0) || (rxcmd->data == 1)) { udp_client_active_flag = rxcmd->data; } udp_client_create_basic_response(rxcmd, recv_datalen); break; default: break; } } } void udp_cllient_active(void) { if (udp_client_active_flag) { active_report_data_structer_update(); printf("encoder1:%d,encoder2:%d\r\n", active_report_data_structer.encoder_1_count, active_report_data_structer.encoder_2_count); } }