The trading desk and the hospital, on the same desk.
FIX with a real session layer, not a message formatter. HL7 v2 over MLLP in both directions, every segment named. FHIR and OData read the way their specifications mean them, with verdicts and paging. All of it from a project in Sonda, next to the REST calls that surround it.
At a glance
A session, kept the way a venue expects.
TCP or TLS with a client certificate, because many venues ask for one. CompIDs and SubIDs, a logon with username and password masked in the log, ResetOnLogon, extra logon fields.
The session layer
Heartbeats and test requests when the counterparty goes quiet; the counterparty's test requests answered. Resend requests honoured — application messages resent with PossDupFlag, administrative ones gap-filled. Gaps in what arrives asked for again. Sequence resets followed, logout both ways, sequence numbers set by hand while disconnected. Garbled messages reported and skipped.
The composer
Tags by number or by name, in the order you give them, repeating groups as written. "now" and "today" filled in. Rows or text, one tag=value per line. Templates for a new order, a cancel, a replace, an order status, market data, a quote request, a security list and a mass status. Paste a message with SOH, pipe or ^A separators. Build a cancel from an order already in the log.
The answer
Wait for the reply matched by a shared tag — ClOrdID, MDReqID — with a Reject or a BusinessMessageReject counted as the answer. Every field named, with its value's meaning: 54=1 Buy. Filter the log by ClOrdID or by symbol. A test request with its round-trip time.
Send to the engine. Listen like one.
MLLP over TCP or TLS to Mirth, Rhapsody, Cloverleaf, an EHR or a lab — and a listener that opens a port of its own and acknowledges the way the sender asked.
Sending
Empty MSH fields filled in: the time, a control ID, the applications and facilities, the processing ID, the version. "now" in any date field. The ACK carrying your control ID is waited for: AA, AE or AR, or the enhanced-mode CA, CE and CR.
Listening
A port for this computer only or for the LAN, up to 32 peers. Answers AA, AE, AR or nothing, with an MSA-3 text, in original or enhanced mode as MSH-15 and MSH-16 ask. An ERR segment on errors and rejects from 2.5 on. A flow can produce the acknowledgement.
Reading
UTF-8 or ISO-8859-1, MSH-18 respected, escapes handled. A parsed view with every segment, field, repetition and component named for the message's version, coded values explained, problems flagged. Templates for ADT A01, A04, A08 and A03, ORM O01, ORU R01, SIU S12, VXU V04 and MDM T02. Filter the log by control ID or by patient.
Read as the specification means it.
Both import into a project from the server's own description, and both get a verdict the HTTP status cannot give.
FHIR
Import a CapabilityStatement and get every interaction the server declares. An OperationOutcome in a 200 is named by its worst issue. A Bundle shows its count and a Next page button that follows the link.
OData v4
Import $metadata and get entity sets with $filter, $select and the rest, the CRUD calls, navigations, functions and actions. @odata.error is a verdict, @odata.count is shown, @odata.nextLink is a button.