📄 packet.h
字号:
/* Diagnostic packets */ PKT_CLIENT_DIAGNOSTIC = PKT_CLIENT_HEADER|0xD0, // Diagnostic codes // Payload: // 0:2 - Diagnostic code // 2:X - Diagnostic data /* Error packets */ PKT_CLIENT_ERROR = PKT_CLIENT_HEADER|0xE0, // Error codes // Payload: // 0:2 - Error code // 2:X - Error data /* File download packets? */ };typedef enum ClientPacketType_enum ClientPacketType_t;// ----------------------------------------------------------------------------// Server originated packets#define PKT_SERVER_HEADER ((UInt16)PACKET_HEADER_SERVER_BASIC << 8)enum ServerPacketType_enum { /* End-Of-Block packets */ PKT_SERVER_EOB_DONE = PKT_SERVER_HEADER|0x00, // "" : End of transmission, query response // Payload: // 0:1 - Optional maximum number of events to send per block // 1:X - Optional server key PKT_SERVER_EOB_SPEAK_FREELY = PKT_SERVER_HEADER|0x01, // "" : End of transmission, speak freely // Payload: // 0:1 - Optional maximum number of events to send per block // 1:X - Optional server key // The client may treat this packet the same as PKT_SERVER_EOB_DONE /* Acknowledge packet */ PKT_SERVER_ACK = PKT_SERVER_HEADER|0xA0, // "%*u" : Acknowledge // Payload: // 0:X - Acknowledged sequence /* Property packets */ PKT_SERVER_GET_PROPERTY = PKT_SERVER_HEADER|0xB0, // "%2u" : Get property // Payload: // 0:2 - Property ID PKT_SERVER_SET_PROPERTY = PKT_SERVER_HEADER|0xB1, // "%2u%*b" : Set property // Payload: // 0:2 - Property ID // 2:X - Property value /* File upload packets */ PKT_SERVER_FILE_UPLOAD = PKT_SERVER_HEADER|0xC0, // "%1x%3u%*b" : File upload // Payload: // 0:1 - Start/Data/End indicator // 1:3 - File length/offset // 4:X - Filename/Data/Checksum // The client may choose to ignore this packet /* Error packets */ PKT_SERVER_ERROR = PKT_SERVER_HEADER|0xE0, // "%2u" : NAK/Error codes // Payload: // 0:2 - Error code // 2:2 - Offending packet header // 4:2 - Ofending packet type // 6:X - Optional error data /* End-Of-Transmission */ PKT_SERVER_EOT = PKT_SERVER_HEADER|0xFF, // "" : End transmission (socket will be closed) // Payload: // (None)};typedef enum ServerPacketType_enum ServerPacketType_t;// ----------------------------------------------------------------------------typedef struct { ServerPacketType_t pktType; char *format; UInt16 flags;} ServerPacketEntry_t;// ----------------------------------------------------------------------------#define PACKET_MAX_ENCODED_LENGTH 600 // (with excess) largest possible ASCII encoded packet// ----------------------------------------------------------------------------enum PacketPriority_enum { PRIORITY_NONE = 0, PRIORITY_LOW = 1, // generally sent via Simplex only (GPRS) PRIORITY_NORMAL = 2, // generally sent via Duplex only (GPRS) PRIORITY_HIGH = 3 // generally sent via Duplex only (GPRS, then Satellite)};typedef enum PacketPriority_enum PacketPriority_t;// ----------------------------------------------------------------------------#define ENCODING_BASE64_CHAR '='#define ENCODING_HEX_CHAR ':'#define ENCODING_CSV_CHAR ','#define ENCODING_ASCII_CKSUM_ (0x8000)#define ENCODING_IS_CHECKSUM(E) (((E) & ENCODING_ASCII_CKSUM_) != 0)#define ENCODING_IS_ASCII(E) (ENCODING_VALUE(E) != ENCODING_BINARY)#define ENCODING_VALUE(E) ((E) & 0x0F)#define ENCODING_CHECKSUM(E) (ENCODING_VALUE(E) | ENCODING_ASCII_CKSUM_)#define ENCODING_MASK(E) (1 << ENCODING_VALUE(E))#define ENCODING_BINARY 0 // server must support#define ENCODING_BINARY_MASK ENCODING_MASK(ENCODING_BINARY) // 0x01#define ENCODING_BASE64 1 // server must support#define ENCODING_BASE64_CKSUM ENCODING_CHECKSUM(ENCODING_BASE64)#define ENCODING_BASE64_MASK ENCODING_MASK(ENCODING_BASE64) // 0x02#define ENCODING_HEX 2 // server must support#define ENCODING_HEX_CKSUM ENCODING_CHECKSUM(ENCODING_HEX)#define ENCODING_HEX_MASK ENCODING_MASK(ENCODING_HEX) // 0x04#define ENCODING_CSV 3 // server support optional#define ENCODING_CSV_CKSUM ENCODING_CHECKSUM(ENCODING_CSV)#define ENCODING_CSV_MASK ENCODING_MASK(ENCODING_CSV)#define ENCODING_UNDEFINED (0xFFFF)#define ENCODING_REQUIRED_MASK (ENCODING_BINARY_MASK | ENCODING_BASE64_MASK | ENCODING_HEX_MASK)#define ENCODING_ALL_MASK (ENCODING_REQUIRED_MASK | ENCODING_CSV_MASK)typedef UInt16 PacketEncoding_t;// ----------------------------------------------------------------------------// Internal packet function error codes#define PKTERR_NULL_PACKET -301 // internal#define PKTERR_BIN_PRINTF -302 // internal: buffer overflow or invalid format#define PKTERR_ENCODING -303 // internal: packet encoding error#define PKTERR_OVERFLOW -304 // internal: buffer overflow#define PKTERR_BIN_FORMAT_DIGIT -331 // internal: invalid format digit#define PKTERR_BIN_FORMAT_CHAR -332 // internal: invalid format char// ----------------------------------------------------------------------------// this value is used to indicate that 'all' sent event packets are to be acknowledged#define SEQUENCE_ALL 0xFFFFFFFFL#define SEQUENCE_MASK(N) ((1L << ((N) * 8)) - 1L)// ----------------------------------------------------------------------------typedef struct { UInt32 sequence; // sequence number (MUST MATCH PACKET ENCODED SEQUENCE!!!) ClientPacketType_t hdrType; // packet type (ie. EVENT_FIXED_FORMAT_TYPE) PacketPriority_t priority; // low/normal/high priority utBool sent; // 'true' if sent to server UInt8 seqPos; // sequence position UInt8 seqLen; // sequence length char dataFmt[(PACKET_MAX_FIELD_COUNT * 3) + 3]; // null terminated UInt8 dataLen; // length of data in payload UInt8 data[PACKET_MAX_PAYLOAD_LENGTH];} Packet_t; // sizeof(Packet_t) == 324 bytes// ----------------------------------------------------------------------------// ----------------------------------------------------------------------------utBool pktIsEventPacket(ClientPacketType_t pht);FmtBuffer_t *pktFmtBuffer(FmtBuffer_t *bf, Packet_t *pkt);int pktInit(Packet_t *pkt, ClientPacketType_t pktType, const char *fmt, ...);int pktVInit(Packet_t *pkt, ClientPacketType_t pktType, const char *fmt, va_list ap);int pktEncodePacket(Buffer_t *dest, Packet_t *pkt, PacketEncoding_t encoding);void pktPrintPacket(Packet_t *pkt, const char *msg, PacketEncoding_t encoding);// ----------------------------------------------------------------------------// ----------------------------------------------------------------------------#ifdef __cplusplus}#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -