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协议中的消息格式和数据交互细节可能会根据具体情况有所不同,你需要根据实际需求进行相应的编码和解码操作。