For anyone interested: it's an extraordinarily simple protocol (it predates complexity in protocols), consisting of key=value pairs, where the keys are all numbers (look up "fix tag dictionary" for 100 different decoder rings), everything's in text, and, IIRC, all the KVPs are separated by ASCII 01h (SOH), which by convention is written with the pipe filter. That's it, that's the protocol.
A real-world FIX gateway will demand a BodyLength tag, so you have to compute your message length, and it'll want SenderCompID and TargetCompID ("from" and "to", respectively). So it's like, well, that much more complicated.
The complexity in these systems will all be the semantics given to the messages and the zillion fields your vendor/partner supports.