我正在尝试从一个监视器获取数据到一个Android应用程序,我已经把ihe-pcd-01事务作为一个模型。
该方案简单,基于实现显示器与平板电脑的互联,显示器不断发送信息,应用程序监听。
但我不明白的是,我是否需要在每次留言后确认。有人能帮我吗?
最佳答案
是的,这里没有什么特别的,支持通常由msh-15,msh-16字段驱动的hl7 ack/nack。默认情况下,确认一切“比道歉更安全”
文件“IHE患者护理设备(PCD),技术框架,第2卷(PCD TF-2)交易,第1.0版-最终文本,2011年8月12日”在http://www.ihe.net/technical_framework/upload/ihe_pcd_tf_vol2_ft_2011-08-12.pdf上提供
…HL7确认(ACK)消息的通用静态定义如附录G“HL7实现说明”所述。
上面写着
G.1网络指南
HL7 2.6标准没有定义网络通信协议。从hl7 2.2开始,较低层协议的定义被移到了实现指南中,但不是hl7的要求。IHE框架提出了以下建议:
应用程序应使用HL7实施指南附录C中定义的最低层协议。
希望发送消息(启动事务)的应用程序将启动网络连接以启动事务。接收器应用程序将以确认或响应查询来响应,但不会在此网络连接上启动新事务
G.1.1确认模式
确认消息
确认消息可以在应用程序的基础上定义。但是,在应用程序未定义特殊消息(应用程序级确认)的情况下,以及在第2.9节“消息处理规则”所述的其他情况下,可以使用简单的一般确认消息(ack)。
IHE PCD事务PCD-03支持“增强模式”确认。参见PCD-03事务以及B.1 MSH-消息头段和B.2 MSA-消息确认段中的讨论
文档“Health Level Seven,Version 2.6©2007,Chapter 2:Control”来自“HL7 Messaging Standard Version 2.6”包,可从http://www.hl7.org/implement/standards/product_brief.cfm?product_id=185下载,该包描述了
2.9.2使用原始处理规则的消息响应
..太长了不能引用..
2.9.3使用增强确认的响应
..太长了不能引用..
取决于hl7消息中MSH-15 Accept Acknowledgement Type
和MSH-16 Application Acknowledgment Type
字段的值
HL7标准的上述章节包含您想要阅读和实现/支持的内容。
编辑:
简单地说,在hl7协议中,在发送的每一条消息中,发送者可以通过标记消息头段中的适当字段来请求ACK
接收。IHE不删除此规则,也不强制执行任何其他规则,但允许在应用程序基础上定义任何其他约定。正确的预期行为由HL7规范定义,为了使其正确并创建一致的实现(不给第三方带来隐藏的惊喜),您可能需要多次阅读(另请参见Stack Overflow: How can I make my system HL7 certified?)
例如,这就是HAPI库处理打包的方式,代码段来自http://sourceforge.net/p/hl7api/code/764/tree/tags/Root_REL_1_2/hapi-mvn/hapi-base/src/main/java/ca/uhn/hl7v2/protocol/impl/ProcessorImpl.java
/**
* @see ca.uhn.hl7v2.protocol.Processor#cycle(boolean)
*/
public void cycle(boolean expectingAck) throws HL7Exception {
log.debug("In cycle({})", expectingAck);
cleanReservations();
cleanAcceptAcks();
cleanReservedMessages();
Transportable in = null;
try {
if (expectingAck) {
in = tryReceive(myContext.getLocallyDrivenTransportLayer());
} else {
in = tryReceive(myContext.getRemotelyDrivenTransportLayer());
}
} catch (TransportException e) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {}
throw e;
}
// log
if (in != null) {
log.debug("Received message: {}", in.getMessage());
} else {
log.debug("Received no message");
}
// If we have a message, handle it
if (in != null) {
String acceptAckNeeded = null;
// String appAckNeeded = null;
String ackCode = null;
String ackId = null;
try {
String[] fieldPaths = {"MSH-15", "MSH-16", "MSA-1", "MSA-2"};
String[] fields = PreParser.getFields(in.getMessage(), fieldPaths);
acceptAckNeeded = fields[0];
// appAckNeeded = fields[1];
ackCode = fields[2];
ackId = fields[3];
} catch (HL7Exception e) {
log.warn("Failed to parse accept ack fields in incoming message", e);
}
if (ackId != null && ackCode != null && ackCode.startsWith("C")) {
long expiryTime = System.currentTimeMillis() + 1000 * 60;
myAcceptAcks.put(ackId, new ExpiringTransportable(in, expiryTime));
} else {
AcceptAcknowledger.AcceptACK ack = AcceptAcknowledger.validate(getContext(), in);
if ((acceptAckNeeded != null && acceptAckNeeded.equals(AL))
|| (acceptAckNeeded != null && acceptAckNeeded.equals(ER) && !ack.isAcceptable())
|| (acceptAckNeeded != null && acceptAckNeeded.equals(SU) && ack.isAcceptable())) {
trySend(myContext.getRemotelyDrivenTransportLayer(), ack.getMessage());
}
if (ack.isAcceptable()) {
if (isReserved(ackId)) {
log.debug("Received expected ACK message with ACK ID: {}", ackId);
removeReservation(ackId);
long expiryTime = System.currentTimeMillis() + 1000 * 60 * 5;
myAvailableMessages.put(ackId, new ExpiringTransportable(in, expiryTime));
} else {
log.debug("Sending message to router");
Transportable out = myContext.getRouter().processMessage(in);
sendAppResponse(out);
}
} else {
// TODO: should we do something more here? Might be nice to
// allow a configurable handler for this situation
log.warn("Incoming message was not acceptable");
}
}
} else {
String transport = expectingAck ? " Locally driven " : "Remotely driven";
log.debug("{} TransportLayer.receive() returned null.", transport);
}
sleepIfNeeded();
log.debug("Exiting cycle()");
}
关于android - IHE和HL7。 PCD-01确认,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26779901/