我正在尝试从一个监视器获取数据到一个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 TypeMSH-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/

10-10 09:40