地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
6.4 KiB

/*****************************************************************************
* Copyright (c) 2008, University of Florida
* All rights reserved.
*
* This file is part of OpenJAUS. OpenJAUS is distributed under the BSD
* license. See the LICENSE file for details.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of the University of Florida nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
****************************************************************************/
// File Name: JudpInterface.h
//
// Written By: Danny Kent (jaus AT dannykent DOT com)
//
// Version: 3.3.0a
//
// Date: 08/07/08
//
// Description: This file lists the functions associated with a UDP Jaus
// Transport interface. This interface confirms to the JUDP
// interface (with header compression) described in SAE
// document AS5669.
#ifndef JUDP_INTERFACE_H
#define JUDP_INTERFACE_H
#ifdef WIN32
#include <errno.h>
#include <hash_map>
#define HASH_MAP stdext::hash_map
#elif defined(__GNUC__)
#include <ext/hash_map>
#define HASH_MAP __gnu_cxx::hash_map
#endif
#include "JausTransportInterface.h"
#include "utils/multicastSocket.h"
#include "utils/inetAddress.h"
#include "utils/datagramPacket.h"
#include "utils/FileLoader.h"
#define JUDP_NAME "JUDP Interface"
#define JUDP_DATA_PORT 3794 // per AS5669 v1.0 and IANA assignment
#define JUDP_PER_PACKET_HEADER_SIZE_BYTES 1
#define JUDP_PER_MESSAGE_HEADER_SIZE_BYTES 4
#define JUDP_VERSION_NUMBER 1 // per AS5669 v1.0
#define JUDP_MAX_PACKET_SIZE 4101 // per AS5669 v1.0
// Header Compression Flag Values
#define JUDP_HC_NO_COMPRESSION 0
#define JUDP_HC_ENGAGE_COMPRESSION 1
#define JUDP_HC_COMPRESSION_ACKNOWLEDGE 2 // Note: This value has multiple interpretations, depending on the message length field
#define JUDP_HC_COMPRESSED_MESSAGE 3
// Default Configuration Values
// Component UDP Interface Default Values
#define JUDP_DEFAULT_COMPONENT_UDP_PORT 24629 // Per OpenJAUS Node Manager Interface document
#define JUDP_DEFAULT_COMPONENT_TTL 1
#define JUDP_DEFAULT_COMPONENT_UDP_TIMEOUT_SEC 1.0f
#define JUDP_DEFAULT_COMPONENT_MULTICAST false
#define JUDP_DEFAULT_COMPONENT_HEADER_COMPRESSION false
// Node UDP Interface Default Values
#define JUDP_DEFAULT_NODE_TTL 16 // per AS5669
#define JUDP_DEFAULT_NODE_UDP_TIMEOUT_SEC 1.0f
#define JUDP_DEFAULT_NODE_MULTICAST true
#define JUDP_DEFAULT_NODE_HEADER_COMPRESSION false
// Subsystem UDP Interface Default Values
#define JUDP_DEFAULT_SUBSYSTEM_TTL 16 // per AS5669
#define JUDP_DEFAULT_SUBSYSTEM_UDP_TIMEOUT_SEC 1.0f
#define JUDP_DEFAULT_SUBSYSTEM_MULTICAST true
#define JUDP_DEFAULT_SUBSYSTEM_HEADER_COMPRESSION false
static const std::string JUDP_DEFAULT_COMPONENT_IP = "127.0.0.1"; // Per OpenJAUS Node Manager Interface document
static const std::string JUDP_DEFAULT_SUBSYSTEM_MULTICAST_GROUP = "224.1.0.1"; // per AS5669
static const std::string JUDP_DEFAULT_NODE_MULTICAST_GROUP = "225.1.0.1"; // per AS5669 with slight modification
extern "C" void *JudpRecvThread(void *);
// Transport Data Structure
typedef struct
{
unsigned int addressValue;
unsigned short port;
}JudpTransportData;
typedef struct
{
unsigned char headerNumber;
unsigned char length;
unsigned char flags;
unsigned short messageLength;
}JudpHeaderCompressionData;
class JudpInterface : public JausTransportInterface
{
public:
JudpInterface(FileLoader *configData, EventHandler *handler, JausCommunicationManager *commMngr);
~JudpInterface(void);
InetAddress getInetAddress(void);
bool processMessage(JausMessage message);
bool startInterface();
bool stopInterface();
std::string toString();
void run();
void recvThreadRun();
private:
MulticastSocket socket;
bool openSocket(void);
void closeSocket(void);
bool multicast;
InetAddress ipAddress;
InetAddress multicastGroup;
unsigned short portNumber;
bool supportHeaderCompression;
int recvThreadId;
pthread_t recvThread;
pthread_attr_t recvThreadAttr;
void sendJausMessage(JudpTransportData data, JausMessage message);
void startRecvThread();
void stopRecvThread();
unsigned int headerCompressionDataToBuffer(JudpHeaderCompressionData *hcData, unsigned char *buffer, unsigned int bufferSizeBytes);
unsigned int headerCompressionDataFromBuffer(JudpHeaderCompressionData *hcData, unsigned char *buffer, unsigned int bufferSizeBytes);
void sendUncompressedMessage(JudpTransportData data, JausMessage message);
void sendCompressedMessage(JudpTransportData data, JausMessage message);
bool receiveUncompressedMessage(JausMessage rxMessage, unsigned char *buffer, unsigned int bufferSizeBytes);
bool receiveCompressedMessage(JausMessage rxMessage, JudpHeaderCompressionData *hcData, unsigned char *buffer, unsigned int bufferSizeBytes);
HASH_MAP <int, JudpTransportData> addressMap;
bool subsystemGatewayDiscovered;
JudpTransportData subsystemGatewayData;
JudpTransportData multicastData;
};
#endif