/**************************************************************************** * apps/examples/tcp_ipc_client/tcp_ipc_client_main.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /* This program consists of a client socket & custom messages that send * data (hex-string formatted data) to a server (server_tcp). Then, * server_tcp send this data over LoraWAN (using Radioenge LoRaWAn module) * Both client and server work on local network. * IMPORTANT NOTE: * In order to test client_tcp & server_tcp together, there are two * ways to proceed: * 1) Init server manually (command: SERVER &), and after successfull * server init, also init client manually (CLIENT 127.0.0.1) * 2) Init server automatically after boot using NuttShell start up scripts. */ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "protocol.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /**************************************************************************** * Private Types ****************************************************************************/ /**************************************************************************** * Private Function Prototypes ****************************************************************************/ /**************************************************************************** * Private Data ****************************************************************************/ /**************************************************************************** * Public Data ****************************************************************************/ /**************************************************************************** * Private Functions ****************************************************************************/ static void show_usage(FAR const char *progname) { fprintf(stderr, "USAGE: %s \n", progname); fprintf(stderr, " %s -h\n", progname); fprintf(stderr, "Where:\n"); fprintf(stderr, "\t<: IP of server TCP/IP socket for IPC.\n"); } /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Definitions ****************************************************************************/ #define SOCKET_PORT 5000 #define TCP_DATA_RCV_WITHOUT_FLAGS 0 #define RCV_BUFFER_SIZE 520 #define SEND_BUFFER_SIZE 500 #define TIME_SECONDS_TO_SEND_NEXT_DATA 15 /**************************************************************************** * Client_tcp_main ****************************************************************************/ int main(int argc, char *argv[]) { int socket_client = 0; char rcv_buffer[RCV_BUFFER_SIZE]; char buffer_to_send[SEND_BUFFER_SIZE]; int bytes_read_from_server = 0; struct sockaddr_in serv_addr; protocolo_ipc tprotocol; /* Check if there are sufficient arguments passed to this program */ if (argc != 2) { printf("\nNot enough parameters: %s.\n", argv[0]); return 1; } if (strcmp(argv[1], "-h") == 0) { show_usage(argv[0]); return EXIT_FAILURE; } /* Create client socket */ memset(rcv_buffer, 0x00, sizeof(rcv_buffer)); socket_client = socket(AF_INET, SOCK_STREAM, 0); if (socket_client < 0) { perror("Failed to create client socket"); exit(EXIT_FAILURE); } /* Connect to server socket */ memset(&serv_addr, 0x00, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SOCKET_PORT); if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0) { perror("Failed when executing inet_pton()"); exit(EXIT_FAILURE); } if (connect(socket_client, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("Failed to connect to server socket"); exit(EXIT_FAILURE); } /* Countinuosly send server data to be forwarded to LPWAN transceiver */ while (1) { /* Formats message to be sent to server (opcode, message size * and message content) */ tprotocol.opcode = 'U'; tprotocol.msg_size = 4; snprintf((char *)tprotocol.msg, sizeof(tprotocol.msg), "0102"); /* Send message to server */ memcpy(buffer_to_send, (unsigned char *)&tprotocol, sizeof(protocolo_ipc)); write(socket_client, buffer_to_send, strlen(buffer_to_send)); printf("Message sent to server!\n\n"); /* Waits for server response */ bytes_read_from_server = recv(socket_client, rcv_buffer, sizeof(protocolo_ipc), TCP_DATA_RCV_WITHOUT_FLAGS); if (bytes_read_from_server < 0) { perror("Failed to get server response"); exit(EXIT_FAILURE); } else { /* Server response successfully received. Print it on the screen */ memcpy((unsigned char *)&tprotocol, rcv_buffer, sizeof(protocolo_ipc)); printf("Protocol: opcode: %c\n", tprotocol.opcode); printf("Protocol: message size: %d\n", tprotocol.msg_size); printf("Protocol: message: %s\n", tprotocol.msg); } /* Wait to send again */ sleep(TIME_SECONDS_TO_SEND_NEXT_DATA); } return 0; }