4. DICOM服务类与SOP类

在DICOM网络中,两台设备之所以能“对话”,并不是因为它们碰巧使用相同的消息格式,而是因为它们事先约定了“要一起完成什么任务”以及“这个任务具体操作哪类信息对象”。DICOM用两个层层嵌套的概念来描述这种约定:服务类(Service Class)和SOP类(SOP Class)。理解这两者的定义与关系,是读懂后续所有DICOM服务(C-STORE、C-FIND、C-MOVE、C-ECHO等)的基础。

一、服务类:定义“能做什么”

服务类描述的是DICOM应用实体(Application Entity,AE)之间可以执行的一类操作能力。它回答的问题是:“这个设备能提供或使用哪种服务?”常见的服务类包括:

  • 验证服务类(Verification Service Class):用于确认对端AE是否在线、能否响应,对应操作是C-ECHO。
  • 存储服务类(Storage Service Class):用于把图像或其它复合对象发送到对端,对应操作是C-STORE。
  • 查询/检索服务类(Query/Retrieve Service Class):用于按条件查询患者、检查、序列、图像,并把结果取回,对应操作是C-FIND、C-MOVE、C-GET。
  • 工作列表管理服务类(Modality Worklist Management Service Class):用于让影像设备从RIS/HIS获取待检查患者的工作列表,对应操作是C-FIND(针对工作列表信息模型)。
  • 打印管理服务类(Print Management Service Class):用于把图像排版后送到DICOM打印机或打印服务器,对应操作包括N-CREATE、N-SET、N-ACTION、N-DELETE等。

服务类本身只规定“能力”,不规定“操作对象”。例如“存储服务类”只说“我能接收或发送存储请求”,但存储的到底是CT图像、MR图像还是超声图像,需要由SOP类来进一步限定。

二、SOP类:定义“对什么对象做什么”

SOP是Service-Object Pair的缩写,即“服务—对象对”。一个SOP类把某个信息对象定义(IOD)与一组允许在其上执行的服务操作绑定在一起。例如:

  • CT图像存储SOP类:信息对象是CT图像IOD,允许的操作是存储(C-STORE)。
  • MR图像存储SOP类:信息对象是MR图像IOD,允许的操作同样是存储。
  • 患者根查询/检索SOP类:信息对象是患者根查询模型,允许的操作是C-FIND、C-MOVE、C-GET。
  • 模态工作列表SOP类:信息对象是模态工作列表模型,允许的操作是C-FIND。
  • 基本灰度打印管理SOP类:信息对象是打印管理相关IOD,允许的操作是N-CREATE、N-SET、N-ACTION等。

因此,SOP类 = 信息对象 + 服务操作。它比服务类更具体,是设备在关联协商时真正声明和匹配的单元。

三、服务类与SOP类的关系

两者是“能力类别”与“具体实现单元”的关系。一个服务类可以包含多个SOP类;一个SOP类通常归属于某一个服务类。设备在建立DICOM关联(Association)时,会在A-ASSOCIATE请求中列出自己支持的表示上下文(Presentation Context),每个表示上下文由一个SOP类和一个传输语法组成。对端如果也支持该SOP类,就接受这个表示上下文,双方才能在该SOP类上执行对应操作。

举例来说,一台CT设备要发送图像到PACS:CT声明支持“CT图像存储SOP类”,PACS也声明支持该SOP类,双方协商成功后,CT才能发起C-STORE。如果PACS只支持“MR图像存储SOP类”而不支持CT,那么即使两者都声称支持“存储服务类”,也无法完成CT图像的存储。这说明:服务类决定“能不能做这类事”,SOP类决定“具体能不能做这件事”。

DICOM服务类与SOP类关系图 服务类(Service Class)—— 定义能力类别 验证服务类 C-ECHO 确认对端在线 存储服务类 C-STORE 发送/接收对象 查询/检索服务类 C-FIND/C-MOVE/C-GET 按条件查询与取回 工作列表服务类 C-FIND 获取待检查列表 打印管理服务类 N-CREATE/N-SET等 胶片排版与打印 SOP类(Service-Object Pair)—— 信息对象 + 服务操作 验证SOP类 信息对象:无 操作:C-ECHO UID: 1.2.840.10008.1.1 CT图像存储SOP类 信息对象:CT图像IOD 操作:C-STORE UID: 1.2.840.10008.5.1.4.1.1.2 患者根查询SOP类 信息对象:患者根模型 操作:C-FIND/C-MOVE UID: 1.2.840.10008.5.1.4.1.2.1.1 模态工作列表SOP类 信息对象:工作列表模型 操作:C-FIND UID: 1.2.840.10008.5.1.4.31 基本灰度打印SOP类 信息对象:打印管理IOD 操作:N-CREATE/N-SET UID: 1.2.840.10008.5.1.1.9 关联协商(A-ASSOCIATE)中的匹配逻辑: 发起方列出「SOP类 + 传输语法」作为表示上下文 → 接收方逐项比对自身支持的SOP类 → 接受则建立该上下文 → 双方才能在该SOP类上执行对应DIMSE操作 关键:服务类决定“能不能做这类事”,SOP类决定“具体能不能做这件事”

四、关联协商中的实际匹配过程

在实际工程中,服务类与SOP类的关系最终体现在关联协商上。以一台CT向PACS发送图像为例,典型过程如下:

  1. CT作为发起方,在A-ASSOCIATE请求中列出多个表示上下文,每个上下文包含一个SOP类UID和一个传输语法(如Implicit VR Little Endian、Explicit VR Little Endian)。
  2. PACS作为接收方,逐项检查自己是否支持该SOP类。如果支持,就在A-ASSOCIATE响应中接受该表示上下文,并指定最终使用的传输语法。
  3. 协商成功后,CT才能在该SOP类对应的表示上下文上发起C-STORE请求。
  4. 如果PACS不支持某个SOP类,该表示上下文被拒绝,CT无法通过该上下文发送对应对象。

这里有一个容易混淆的点:服务类不是协商单元,SOP类才是。 设备在配置DICOM连接时,通常需要填写“支持的SOP类列表”,而不是“支持的服务类列表”。服务类更多是标准文档中的分类框架,用于组织SOP类。

五、常见服务类与SOP类的对应关系

服务类 典型SOP类 主要DIMSE操作 典型应用场景
验证服务类 验证SOP类 C-ECHO PACS连通性测试、AE在线检测
存储服务类 CT/MR/US等图像存储SOP类 C-STORE 设备向PACS发送图像
查询/检索服务类 患者根/研究根/序列根查询SOP类 C-FIND、C-MOVE、C-GET PACS查询、调阅历史检查
工作列表服务类 模态工作列表SOP类 C-FIND CT/MR从RIS获取待检查患者
打印管理服务类 基本灰度/彩色打印SOP类 N-CREATE、N-SET、N-ACTION 图像排版后送DICOM打印机

六、工程配置中的注意事项

在实际配置DICOM连接时,工程师需要关注以下几点:

  • SOP类UID必须精确匹配:不同厂商可能对同一类对象使用不同的SOP类UID,配置时要核对标准UID,不能凭名称猜测。
  • 传输语法要兼容:即使SOP类匹配,如果传输语法不被接受,关联仍可能失败。常见做法是同时声明隐式VR小端、显式VR小端和显式VR大端。
  • 角色选择:查询/检索服务类中,发起方可以是SCU(请求查询)或SCP(响应查询),配置时要明确设备扮演的角色。
  • 工作列表与查询/检索的区别:两者都使用C-FIND,但信息模型不同,SOP类UID也不同,不能混用。
记忆要点:服务类是“能力大类”,SOP类是“具体任务包”。关联协商匹配的是SOP类,不是服务类。配置DICOM连接时,先确认对端支持哪些SOP类,再确认传输语法,最后确认角色(SCU/SCP)。

掌握服务类与SOP类的定义和关系后,后续学习C-ECHO、C-STORE、C-FIND、C-MOVE等具体操作时,就能清楚知道每个操作属于哪个服务类、作用于哪个SOP类、在关联协商中如何被匹配,从而在实际工程中快速定位连接失败、传输失败或查询无结果等问题。