I am currently working on the ASTM protocol to send orders tests request to medical instrument. But I cannot send a message to the equipment correctly. To be more explicit, I want for example to send these frames:
String h1, s2, s3, s4, s5, s6 = "";
h1 = "H|@^\\|ODM-IdfDGIWA-36|||GeneXpert PC^GeneXpert^4.8|||||LIS||P|1394-97|20070521100245";
s2 = "P|1";
s3 = "O|1|SID-818||^^^TestId-12|S|20070812140500|||||A||||ORH||||||||||Q";
s4 = "O|2|SID-818||^^^TestId-14|S|20070812140600|||||A||||ORH||||||||||Q";
s5 = "O|3|SID-818||^^^TestId-16|S|20070812140700|||||A||||ORH||||||||||Q";
s6 = "L|1|F";
and here is how I am doing now:
writeMeBytes(outToServer, h1.getBytes());
writeMeBytes(outToServer, s2.getBytes());
writeMeBytes(outToServer, s3.getBytes());
writeMeBytes(outToServer, s4.getBytes());
writeMeBytes(outToServer, s5.getBytes());
writeMeBytes(outToServer, s6.getBytes());
public static void writeMeBytes(DataOutputStream dos, byte [] b){
if (b.length >0){
int j = 0;
while (j <= b.length-1) {
try {
dos.write(b[j++]);
} catch (IOException ex) {
Logger.getLogger(SimpleServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
I turn it into byte and then send byte after byte.
Except that I do not see any change on the receiver side.
Update according to @Muhammad Answer
This is what I did to send order to GeneXpert DX System
public class SimpleServer {
private static ServerSocket server;
private static Socket connection;
public static void main(String args[]) throws IOException, InterruptedException {
server = new ServerSocket(12221);
boolean stopped = false;
System.out.println(" start... ");
connection = server.accept();
System.out.println("wait for connection");
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connection.getOutputStream());
String currentMsg = "";
int clientIntMessage;
String h1, s2, s3, s4, s5, s6 = "";
h1 = "1H|@^\\|ODM-IdfDGIWA-36|||GeneXpert PC^GeneXpert^4.8|||||LIS||P|1394-97|20070521100245" + ProtocolASCII.LF
+ "P|1" + ProtocolASCII.LF
+ "O|1|SID-818||^^^TestId-12|S|20070812140500|||||A||||ORH||||||||||Q" + ProtocolASCII.LF
+ "L|1|F" + ProtocolASCII.LF;
s2 = "P|1";
s3 = "O|1|SID-818||^^^TestId-12|S|20070812140500|||||A||||ORH||||||||||Q";
//s4 = "O|2|SID-818||^^^TestId-14|S|20070812140600|||||A||||ORH||||||||||Q";
//s5 = "O|3|SID-818||^^^TestId-16|S|20070812140700|||||A||||ORH||||||||||Q";
s6 = "L|1|F";
String retmsg = h1;
//logException("OrderMessae :" + retmsg);
retmsg = ProtocolASCII.STX + retmsg + ProtocolASCII.CR + ProtocolASCII.ETX + ProtocolMessage.getCheckSum(retmsg) + ProtocolASCII.CR + ProtocolASCII.LF;
clientIntMessage = inFromClient.read();
//while (clientIntMessage != ProtocolASCII.EOT) {
while (true) {
currentMsg += String.valueOf(Character.toChars(clientIntMessage));
if (clientIntMessage == ProtocolASCII.ENQ) {
outToClient.writeBytes("" + ProtocolASCII.ACK);
System.out.println(" <--- LIS [ACK] on DX [ENQ]");
} else if (clientIntMessage == ProtocolASCII.ACK) {
System.out.println(" ---> DX [ACK]");
// Send your order message here
outToClient.writeBytes(retmsg);
} else if (clientIntMessage == ProtocolASCII.CR) {
System.out.println(currentMsg);
outToClient.writeBytes("" + ProtocolASCII.ACK);
} else if (clientIntMessage == ProtocolASCII.NAK) {
System.out.println(" ---> DX sent [NAK] ");
System.out.println(" --- LIS now wait 10 sec... ");
Thread.sleep(10000);
outToClient.writeBytes("" + ProtocolASCII.ENQ);
System.out.println(" <--- LIS [ENQ] ");
} else if (clientIntMessage == ProtocolASCII.EOT) {
System.out.println(" ---> DX END OF TRANSMISSION");
outToClient.writeBytes("" + ProtocolASCII.ENQ);
System.out.println(" <--- LIS [ENQ] ");
}
if (stopped) {
break;
}
clientIntMessage = inFromClient.read();
}
connection.close();
stopped = true;
}}
And this is the result I get from the console:
start...
wait for connection
<--- LIS [ACK] on DX [ENQ]
1H|@^\|ODM-rQTcjIWA-66||GeneXpert PC^GeneXpert^4.8|||||LIS||P|1394-97|20180314003724
Q|1|ALL||||||||||O@N
L|1|N
B5
---> DX [EOT]
<--- LIS [ENQ]
---> DX [ACK]
---> DX sent [NAK]
--- LIS now wait 10 sec...
DX is the machine software and LIS is the host. Whenever I try to send the ENQ, the machine answers me with NAK.
UPDATE 2
It seem to be working. But now windows events shows me an error about why my records orders don't appear in the GeneXpert DX host record list. The header record have been sent first.
Before answering, lets discuss machine mechanism for Bidirectional.
First, viewing above String message, there isn't any tag numbering as every machine I have done so far requires Tag number. For example:
So, you must have NUMBERING for each tag.
Second, Machine sends following query at first time:
In, Query(2Q) Tag,
000038
rack id,01
rack sequence number,001H18074618
sample id (read from Barcode), further information can be verified from host or LIS manual provided by machine vendor.Third, When we receive this message, we will make message for machine that I have described above (writing again below) with additional checksum information. Again, this checksum can be found in host or LIS manual of machine.
Example of Checksum calculation. Note that it may vary from machine to machine.
And here is our complete message that will be sent to machine:
Last but not least, I don't know what is the machine as I don't have manual but I sense that you don't need to send every message one by one. You can send all at once.
here is the code snippet of sending and receiving message to and from machine.
Where ProtocolASCII.ACK is
'\006'
, ProtocolASCII.ENQ is'\005'
and ProtocolASCII.EOT is'\004'
.The code is pretty much self explanatory and I am using it in production.
Can you tell us which machine you are interfacing? It may help you if I have already integrated.
Thanks . If further assistance is required, let me know.
For your reference:
Update:
From your comments:
String retmsg = "3O|1|" + rackId + "^" + positionNumber + "^" + sampleId + "^B||" + testIds + "|" + priority + "|" + sysDate + "|||||" + orderType + "";
Where testIds is the list of tests to perform.example multitest order send
4O|1||4^1^ 12345678^B|^^^^WBC\^^^^RBC\^^^^HGB\^^^^HCT\^^^^MCV\^^^^MCH\^^^^MCHC\^^^^PLT\^^^^RDW-SD\^^^^RDW-CV\^^^^PDW\^^^^MPV\^^^^P-LCR\^^^^PCT\^^^^NEUT#\^^^^LYMPH#\^^^^MONO#\^^^^EO#\^^^^BASO#\^^^^NEUT%\^^^^LYMPH%\^^^^MONO%\^^^^EO%\^^^^BASO%\^^^^NRBC#\^^^^NRBC%\^^^^IG#\^^^^IG%|||||||N||||||||||||||F
Get test codes from LIS manual or from company engineer and make pattern accordingly.
Update 2