This is an old revision of the document!
Table of Contents
YaMMS - Yet another Medical Messaging System
Message Transport Procedure
Message IDs and logging
Message ids are based on two components; The capital letter 'Y' for YaMMS and a running serial number counting from 10000.
Each message is stored in a folder with the name generated from the generation date; [year]/[month].
When a new message id is to be generated the folder with the greatest year/month is opened and the file with the greatest serial number is identified. With this number as the base a new file is created with CREATE_EXCL
increasing the counter as long as the creation fails.
Receiving
- Message files drop into the inbox folder from ftp in regular intervals (ex. 10 minutes).
- Each message file is parsed and receipts are put in the outbox.
- Each message file is added to an index containing message metadata (ex. read/unread).
- Bad messages (syntax errors, unknown types etc.) are marked as such.
- Control messages are used to mark uploaded messages in the outbox-waiting-confirm folder.
Sending
- Inotify on the outbox triggers the sending event.
- Any newly written messages in the outbox is syntax checked and validated.
- Errornous messages are stalled and a message is put in the inbox that the message could not be sent.
- Validated messages are uploaded to the ftp server.
- Each uploaded file is put in a outbox-waiting-confirm folder and marked as uploaded but not confirmed.
- Each upload also makes a download.
Http protocol (client interface)
- Get inbox contents (list of messages containing id, type and resume tupples)
- Move message to [trash|archive|…]
- (Delete message entirely?)
- Send [hospitalreferral|…]
- Mark message as [read|unread|handled|…]
- Get address by id.
- Edit address (by id).
- Create address.
- Delete address.
Internal Message Format
All internal messages are in UTF-8 encoding.
All address ids maps to address entries in database on server.
Read Format
Contains:
- Message id
- Sender address id (ean number)
- Receiver address id (ean number)
- Message title (message type and one line resume)
- Message status
- Message times (sent/received/read etc)
- Message body (server generated resume based on MedCom XML)
- Original MedCom XML in base64.
<yamms> <message id="47720D608496E1" sender="1234567890" receiver="1234567891" status="unread" senttime="2011-01-01 12:01" recvtime="2011-01-01 13:01" readtime="2011-02-01 08:13"> <title>Some title</title> <body>Dette er et eller andet smart.</body> <msg>IDUgbWcgMSoxIGZvciBibG9kdHJ5a2tldCAtIFRhYmwgTm9ydmFzYyA1IG1nIDEqMSBmb3IgYmxv ZHRyeWtrZXQtIFRhYmwgQ2VudHlsIG0uIEtDbCAxIGRnbCAgZm9yIEJUIG9nIHZhbmRkcml2ZW5k ZSAtIFRhYmwgS2FsZW9yaWQgMSBkZ2wga2FsaXVtdGlsc2t1ZCA8QnJlYWsvPjwvQWN0dWFsTWVk aWNpbmU+CiAgICA8L1JlbGV2YW50Q2xpbmljYWxJbmZvcm1hdGlvbj4KICA8L0hvc3BpdGFsUmVm ZXJyYWw+CjwvRW1lc3NhZ2U+Cg==</msg> </message> <message ...> . . . </message> . . . </yamms>
Send Format
Contains:
- Sender address id
- Receiver address id
- A list of required fields
VANS communication
All VANS communication is done using existing scripts. YaMMS simply gets its own inbox/outbox. The path for these folders are stored in the server config file.
<!-- Gammelt: Connections to the VANS ftp server are done by using libcURL.\\ A connection session consists of the following actions: * Connect * Get VANS-inbox directory listing. * Download VANS-inbox files to local inbox. * Delete VANS-inbox files. * Get local outbox directory listing. * Upload local outbox files to tmp folder on VANS-server. * Move files from tmp folder on VANS-server to VANS-outbox. * Delete local outbox files (move to archive?). * Disconnect. The procedure is activated either by a timer-timeout event (eg. every 10 minutes) or when a client request the sending of a message (a message is put in the outbox). A separate single shot timer may be introduced connecting 10 seconds after an upload has been made in order to check for immediate negative-VANS control messages. Using libcURL with ftp: http://stackoverflow.com/questions/2162022/downloading-all-files-in-directory-using-libcurl -->