Introduction
This example shows how to use the llp.lua module to use LLP connections directly from within a Translator script. The LLP module enables the use of LLP connections (over TCP/IP) from any module (as opposed to using a From LLP component). The module has just one function, llp.connect{}
, to open new LLP connections.
If you have any questions please contact us at support@interfaceware.com.
Using the Code [top]
- Import the LLP custom Client channel from the Builtin: Iguana Tools repository
- Experiment with the code to find out how it works
- Then add the module(s) to your Translator project
- Copy the require statement from the channel and add it at the top of your script
Note: This module uses require to return a single function
- Adapt the code to your own requirements
- Use the
llp.connect{}
function to open an LLP connection - Use the functions in the returned LLP (socket) connection (table) to send and receive messages:
s:recv()
– receive LLP messages:send()
– send LLP messages:close()
– close the LLP connection
- Interactive scripting help is included for this module
This is the github code for the main module:
How it works [top]
The LLP module has just one function, connect(), to open new LLP connections. You give it a table with the hostname (as “host”), port, and an optional “timeout” value (in seconds). If you don’t specify a timeout, all operations are given 5 seconds to complete.
local s = llp.connect{host='localhost',port=7013, timeout=20}
Connect returns a table, s, with three functions: s:send(msg)
for sending messages, s:recv()
for receiving, and s:close()
to close the connection.
s:recv()
actually returns two values: the message received and a lost-data string. If any data is sent before the LLP message-begin byte (0x0B), that data is placed in the lost-data string. Normally this string is empty, and is mainly useful for debugging LLP connections.
s:close()
should be called before opening a new connection to the same location (unless you really want multiple connections). Many hosts will reject multiple connections, and most will become overwhelmed if you make too many. If s is stored globally (with a better name), it can be left open between calls to main(); verify that s is nil (if not s then…) before setting it to llp.connect()
.
Something like this:
local llp = require 'llp' local s function main(Data) local Success, Err = pcall(SendMessage, Data) if not Success then if s then s:close() end s = nil iguana.logInfo('Message not sent. Reason: '..Err) else iguana.logInfo('Message sent successfully.') end end function SendMessage(Msg) if not s then s = llp.connect{host='localhost',port=7013,timeout=100,live=false} end s:send(Msg) local Ack = s:recv() trace(Ack) end
Simulation and Live Testing
If you try out the above examples yourself, you may notice that no actual LLP connections are made. The LLP module contains a simulator that accepts HL7 messages and returns ACKs. This is provided to avoid accidentally sending test data out while editing your script.
If you want to work with live LLP connections inside the editor, you can enable them by passing live=true into your llp.connect() call.
local s = llp.connect{host='localhost',port=7013, live=true}
More information [top]
- Source code for the main module on github
- Source code for the llp.lua module on github