mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04:00 
			
		
		
		
	To facilitate interaction with other applications WSJT-X now sends status updates to a predefined UDP server or multicast group address. The status updates include the information currently posted to the decodes.txt and wsjtx_status.txt files. An optional back communications channel is also implemented allowing the UDP server application to control some basic actions in WSJT-X. A reference implementaion of a typical UDP server written in C++ using Qt is provided to demonstrate these facilities. This application is not intended as a user tool but only as an example of how a third party application may interact with WSJT-X. The UDP messages Use QDataStream based serialization. Messages are documented in NetworkMessage.hpp along with some helper classes that simplify the building and decoding of messages. Two message handling classes are introduced, MessageClient and MessageServer. WSJT-X uses the MessageClient class to manage outgoing and incoming UDP messages that allow communication with other applications. The MessageServer class implements the kind of code that a potential cooperating application might use. Although these classes use Qt serialization facilities, the message formats are easily read and written by applications that do not use the Qt framework. MessageAggregator is a demonstration application that uses MessageServer and presents a GUI that displays messages from one or more WSJT-X instances and allows sending back a CQ or QRZ reply invocation by double clicking a decode. This application is not intended as a user facing tool but rather as a demonstration of the WSJT-X UDP messaging facility. It also demonstrates being a multicast UDP server by allowing multiple instances to run concurrently. This is enabled by using an appropriate multicast group address as the server address. Cooperating applications need not implement multicast techniques but it is recomended otherwise only a single appliaction can act as a broadcast message (from WSJT-X) recipient. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5225 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			166 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef NETWORK_MESSAGE_HPP__
 | |
| #define NETWORK_MESSAGE_HPP__
 | |
| 
 | |
| /*
 | |
|  * WSJT-X Message Formats
 | |
|  * ======================
 | |
|  *
 | |
|  * All messages are written or  read using the QDataStream derivatives
 | |
|  * defined below.
 | |
|  *
 | |
|  *  Message is big endian format
 | |
|  *
 | |
|  *   Header format:
 | |
|  *
 | |
|  *      32-bit unsigned integer magic number 0xadbccbda
 | |
|  *      32-bit unsigned integer schema number
 | |
|  *
 | |
|  *   Payload format:
 | |
|  *
 | |
|  *      As per  the QDataStream format,  see below for version  used and
 | |
|  *      here:
 | |
|  *
 | |
|  *        http://doc.qt.io/qt-5/datastreamformat.html
 | |
|  *
 | |
|  *      for the serialization details for each type.
 | |
|  *
 | |
|  * Type utf8  is a  utf-8 byte  string formatted  as a  QByteArray for
 | |
|  * serialization purposes  (currently a quint32 size  followed by size
 | |
|  * bytes, no terminator is present or counted).
 | |
|  *
 | |
|  * Schema Version 1:
 | |
|  * -----------------
 | |
|  *
 | |
|  * Message       Direction Value                  Type
 | |
|  * ------------- --------- ---------------------- -----------
 | |
|  * Heartbeat     Out       0                      quint32
 | |
|  *                         Id (unique key)        utf8
 | |
|  *
 | |
|  * Status        Out       1                      quint32
 | |
|  *                         Id (unique key)        utf8
 | |
|  *                         Dial Frequency (Hz)    quint64
 | |
|  *                         Mode                   utf8
 | |
|  *                         DX call                utf8
 | |
|  *                         Report                 utf8
 | |
|  *                         Tx Mode                utf8
 | |
|  *
 | |
|  * Decode        Out       2                      quint32
 | |
|  *                         Id (unique key)        utf8
 | |
|  *                         New                    bool
 | |
|  *                         Time                   QTime
 | |
|  *                         snr                    qint32
 | |
|  *                         Delta time (S)         float
 | |
|  *                         Delta frequency (Hz)   quint32
 | |
|  *                         Mode                   utf8
 | |
|  *                         Message                utf8
 | |
|  *
 | |
|  * Clear         Out       3                      quint32
 | |
|  *                         Id (unique key)        utf8
 | |
|  *
 | |
|  * Reply         In        4                      quint32
 | |
|  *                         Id (target unique key) utf8
 | |
|  *                         Time                   QTime
 | |
|  *                         snr                    qint32
 | |
|  *                         Delta time (S)         float
 | |
|  *                         Delta frequency (Hz)   quint32
 | |
|  *                         Mode                   utf8
 | |
|  *                         Message                utf8
 | |
|  *
 | |
|  * QSO Logged    Out       5                      quint32
 | |
|  *                         Id (unique key)        utf8
 | |
|  *                         Date & Time            QDateTime
 | |
|  *                         DX call                utf8
 | |
|  *                         DX grid                utf8
 | |
|  *                         Dial frequency (Hz)    quint64
 | |
|  *                         Mode                   utf8
 | |
|  *                         Report send            utf8
 | |
|  *                         Report received        utf8
 | |
|  *                         Tx power               utf8
 | |
|  *                         Comments               utf8
 | |
|  *                         Name                   utf8
 | |
|  *
 | |
|  * Close         Out       6                      quint32
 | |
|  *                         Id (unique key)        utf8
 | |
|  *
 | |
|  * Replay        In        7                      quint32
 | |
|  *                         Id (unique key)        utf8
 | |
|  */
 | |
| 
 | |
| #include <QDataStream>
 | |
| 
 | |
| #include "pimpl_h.hpp"
 | |
| 
 | |
| class QIODevice;
 | |
| class QByteArray;
 | |
| class QString;
 | |
| 
 | |
| namespace NetworkMessage
 | |
| {
 | |
|   // NEVER DELETE MESSAGE TYPES
 | |
|   enum Type
 | |
|     {
 | |
|       Heartbeat,
 | |
|       Status,
 | |
|       Decode,
 | |
|       Clear,
 | |
|       Reply,
 | |
|       QSOLogged,
 | |
|       Close,
 | |
|       Replay,
 | |
|       maximum_message_type_     // ONLY add new message types
 | |
|                                 // immediately before here
 | |
|     };
 | |
| 
 | |
|   quint32 constexpr pulse {15}; // seconds
 | |
| 
 | |
|   //
 | |
|   // NetworkMessage::Build - build a message containing serialized Qt types
 | |
|   //
 | |
|   class Builder
 | |
|     : public QDataStream
 | |
|   {
 | |
|   public:
 | |
|     static quint32 constexpr magic {0xadbccbda}; // never change this
 | |
| 
 | |
|     // increment this if a newer Qt schema is required and add decode
 | |
|     // logic to InputMessageStream below
 | |
|     static quint32 constexpr schema_number {1};
 | |
| 
 | |
|     explicit Builder (QIODevice *, Type, QString const& id);
 | |
|     explicit Builder (QByteArray *, Type, QString const& id);
 | |
|     Builder (Builder const&) = delete;
 | |
|     Builder& operator = (Builder const&) = delete;
 | |
| 
 | |
|   private:
 | |
|     void common_initialization (Type type, QString const& id);
 | |
|   };
 | |
| 
 | |
|   //
 | |
|   // NetworkMessage::Reader - read a message containing serialized Qt types
 | |
|   //
 | |
|   // Message  is as  per NetworkMessage::Builder  above, the  schema()
 | |
|   // member  may be  used  to  determine the  schema  of the  original
 | |
|   // message.
 | |
|   //
 | |
|   class Reader
 | |
|     : public QDataStream
 | |
|   {
 | |
|   public:
 | |
|     explicit Reader (QIODevice *);
 | |
|     explicit Reader (QByteArray const&);
 | |
|     Reader (Reader const&) = delete;
 | |
|     Reader& operator = (Reader const&) = delete;
 | |
|     ~Reader ();
 | |
| 
 | |
|     quint32 schema () const;
 | |
|     Type type () const;
 | |
|     QString id () const;
 | |
| 
 | |
|   private:
 | |
|     class impl;
 | |
|     pimpl<impl> m_;
 | |
|   };
 | |
| }
 | |
| 
 | |
| #endif
 |