int Agent_cloud_process(void) { EdpPacket* connect_pkg = NULL; int ret; unsigned char failedcnt = 0; cloud_conn_status.conn_status = SOCK_DONE; #ifndef Devid_RestFul AGAIN: /* 向Onenet服务器发送EDP连接报文 */ connect_pkg = PacketConnect1((char*)SRC_DEVID, (char*)CLOUD_API_KEY); /* dump package data */ log_info("Packet connect data(len:%d):\n", connect_pkg->_write_pos); dump_hex(connect_pkg->_data, connect_pkg->_write_pos); log_info("SRC_DEVID:%s CLOUD_API_KEY:%s\r\n",SRC_DEVID,CLOUD_API_KEY); ret = Socket_TCPClientSendData((char *)connect_pkg->_data, connect_pkg->_write_pos); DeleteBuffer(&connect_pkg); if (ret < 0) { cloud_conn_status.conn_status = CLOUD_CONN_ERROR; log_info("Send connect data failed(ret:%d).\n", ret); failedcnt++; /* 发送连接次数超过3次则退出连接 */ if (failedcnt > 3) { Socket_TCPClientClose(); return -1; } OSTimeDly(50); goto AGAIN; } else { log_notice("Send connect data success.\n"); } #endif /* 主进程用于接收云端服务器的数据 */ while (1) { ret = Socket_TCPClientRecvData(recv_buf, CLOUD_RECV_BUFFER_SIZE); if (ret > 0) { recv_buf[ret] = '\0'; #if (4 & Devid_Mode) //restful方式 log_notice("%s\r\n",recv_buf); RestFul_RecvProcess(recv_buf,ret); #else recv_data_process(recv_buf, ret); #endif } if (ret < 0 || TCPClient_reset_flag == 0xa5 ) { //关闭TCP链接 log_err("Recv tcp client data error(%d)\n", ret); Socket_TCPClientClose(); return -1; } } }
int Socket_TCPClientRecvData(char *recvbuf, int len) { fd_set readfds; int recv_count = 0; struct timeval tmv; tmv.tv_sec = 1; /* user can change this value */ tmv.tv_usec = 0; memset(recvbuf, 0, len); FD_ZERO (&readfds); FD_SET (TCPClientFd, &readfds); if ((select((TCPClientFd + 1), &readfds, NULL, NULL, &tmv) == -1) || (TCPClient_reset_flag == 0xa5)) { return -1; } if (FD_ISSET(TCPClientFd, &readfds)) { recv_count = recv(TCPClientFd, recvbuf, len, 0); if((recv_count) <= 0) { log_info("TCP client(%d) receive data failed.\n", TCPClientFd); Socket_TCPClientClose(); return -2; } } return recv_count; }
int Socket_CreateTCPServer(void) { struct sockaddr_in addr; if (TCPServerFd == -1) { TCPServerFd = socket(AF_INET, SOCK_STREAM, 0); if (TCPServerFd < 0) { log_err("Create TCP server socket failed, errno:%d\n", errno); TCPServerFd = -1; return -1; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(TCP_SERVER_PORT); addr.sin_addr.s_addr = INADDR_ANY; if (bind(TCPServerFd, (struct sockaddr *)&addr, sizeof(addr)) != 0) { log_err("Bind TCP server failed, errno:%d\n", errno); Socket_TCPClientClose(); return -1; } if (listen(TCPServerFd, 0) != 0) { log_err("Listen TCP server failed, errno:%d.\n", errno); Socket_TCPClientClose(); return -1; } log_debug("TCP Server socketid:%d(port:%d).\n", TCPServerFd, TCP_SERVER_PORT); return TCPServerFd; } else { //log_debug("TCP server socket exist, create UDP server failed.\n"); return -1; } }