Golang通过TCP连接发送接收HL7协议数据

HL7简介及结构组成

  • HL7 缩写于Health Level Seven(健康信息交换第七层协议),是创建于1987年,用来发展独立卫生保健行业的电子交换交换标准。HL7组织参考了国际标准组织ISO(International Standards Organization),采用开放式系统互联OSI(Open System Interconnection)的通信模式,将HL7纳为最高的一层,也就是应用层。
  • 简单的理解是正如市场上XML,JSON格式比较广泛一样,HL7也是一种数据格式,可以理解为一个字符串,只是这个字符串分为了好几个段而已。
  • 主流解析语言为C、Java,以Golang、Python作为解析语言的库及其示例较少。

HL7 协议通过 TCP 传输层协议与信息系统通信,HL7 是应用层协议,只定义了消息的 格式,对于消息的开始和结束,eGateway 采用 HL7 组织定义的最小底层协议(MLLP: Minimum Lower Layer Protocol)来标记消息的开始和结束边界:

本文主要是介绍在与网关层通讯过程中,发送和接收HL7数据的简单实现方法。

要在Go语言中使用TCP推送HL7协议的数据,可以使用net包来建立TCP连接,并通过该连接发送和接收HL7消息。

作为客户端向服务端发送HL7数据时,不仅要实现发送数据的逻辑,同时也要实现接收数据的逻辑,当我们发送数据到服务端后,服务端会向客户端反馈数据,用以判断发送的HL7数据格式是否正确,能否被正常解析。

创建TCP连接

golang提供的net包能够让我们非常方便的去创建一个TCP连接,连接到服务端。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func main() {
  conn, err := net.Dial("tcp", "服务器地址:端口号")
  if err != nil {
    fmt.Println("连接失败:", err)
    return
  }
  defer conn.Close()

  fmt.Println("连接成功")
}

创建读写bufio

在连接建立后,你可以创建一个bufio.Writer来写入数据到连接,以及一个bufio.Reader来读取连接上的数据:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func main() {
  conn, err := net.Dial("tcp", "服务器地址:端口号")
  if err != nil {
    fmt.Println("连接失败:", err)
    return
  }
  defer conn.Close()

  fmt.Println("连接成功")

  writer := bufio.NewWriter(conn)
  reader := bufio.NewReader(conn)

  // 在此处编写发送和接收数据的逻辑
}

构建HL7消息并发送

接下来,你需要构建HL7消息并将其发送到服务器。HL7消息通常是字符串格式,你可以使用writer.WriteString()方法将消息写入连接:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
func main() {
  conn, err := net.Dial("tcp", "服务器地址:端口号")
  if err != nil {
    fmt.Println("连接失败:", err)
    return
  }
  defer conn.Close()

  fmt.Println("连接成功")

  writer := bufio.NewWriter(conn)
  reader := bufio.NewReader(conn)

  // 发送HL7消息
  hl7Message := "MSH|^~\\&|Sender|Receiver|System|Timestamp||ACK^A01^ACK|MessageID12345|P|2.5\r"
  writer.WriteString(hl7Message)
  writer.Flush()
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//构建hl7数据时,需要注意每行结尾用\r断行,首尾添加消息标志
//以下是个数据示例
hl7mesgsub := `MSH|^~\&|HL7Server|ServerDemo|||20231030145221+0800||ADT^A04|2|P|2.6|` + "\r" +
    `EVN|A04|20231030145221+0800|` + "\r" +
    `PID|||M1030_00001||张三^名^中间名||20231030|M||1002-5|住址^^^^邮政编码||XXXXX:|XXXXX:|||||XXXXX:||||||||||||||||自定义1^自定义1名称|自定义2^自定义2名称||自定义3^自定义3名称|自定义4^自定义4名称` + "\r" +
    `PV1||I|XXXX^1^1^ADT Server^^^^^XX-XX-XX-00-00-XX-XX-XX^MRD#XX-XX-XX-XX-XX-XX-XX-XX|&&0|||^XXXX|^XXXX||||||||||N|XXXX|||||||||||||||||||||||自定义1^自定义1名称|自定义2^自定义2名称|20231030000000+0800||||||自定义3^自定义3名称||自定义4^自定义4名称` + "\r" +
    `OBR||||69952^MDC_DEV_MON_PT_PHYSIO_MULTI_PARAM^MDC|||00000000000|` + "\r" +
    `OBX||NM|68060^MDC_ATTR_PT_HEIGHT||169.0||||||F` + "\r" +
    `OBX||NM|68063^MDC_ATTR_PT_WEIGHT||59.0||||||F` + "\r" +
    `OBX||ST|2302^MNDRY_ATTR_PT_BLOOD_TYPE||AB||||||F` + "\r" +
  hl7mesg := "\v" + hl7mesgsub + "\x1C" + "\r"

接收HL7数据

在发送完消息后,你可以等待服务器的响应并读取数据。使用reader.ReadString()方法从连接中读取数据:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func main() {
  conn, err := net.Dial("tcp", "服务器地址:端口号")
  if err != nil {
    fmt.Println("连接失败:", err)
    return
  }
  defer conn.Close()

  fmt.Println("连接成功")

  writer := bufio.NewWriter(conn)
  reader := bufio.NewReader(conn)

  // 发送HL7消息
  hl7Message := "MSH|^~\\&|Sender|Receiver|System|Timestamp||ACK^A01^ACK|MessageID12345|P|2.5\r"
  writer.WriteString(hl7Message)
  writer.Flush()

  // 读取服务器响应
  response, err := reader.ReadString('\n')
  if err != nil {
    fmt.Println("读取响应失败:", err)
    return
  }

  fmt.Println("服务器响应:", response)
}

以上就是一个简单的使用TCP推送HL7协议的数据的示例代码。根据需要构建和解析HL7消息。注意,HL7协议中的消息格式和数据交互细节可能会根据具体情况有所不同,你需要根据实际需求进行相应的编码和解码操作。

0%