关于的DCMTK的交叉编译:Howto CompileAndroid - DCMTK - OFFIS DCMTK and DICOM Projects
SVID_20260704_221235_1
一.Mac Pro上的DCMTK的服务搭建:
dcmtk-3.6.8.tar.gz的下载地址:https://support.dcmtk.org/redmine/attachments/197
1.解压压缩包:
bash
tar -zxvf dcmtk-3.6.8.tar.gz
2.在dcmtk-3.6.8创建build目录:
bash
cd dcmtk-3.6.8
# 创建编译目录
mkdir build && cd build
3.cmake配置:
bash
cmake .. \
-DCMAKE_INSTALL_PREFIX=$HOME/dcmtk-3.6.8-install \
-DCMAKE_CXX_STANDARD=11 \
-DCMAKE_CXX_STANDARD_REQUIRED=ON \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \
-DDCMTK_WITH_WLSTORAGE=ON \
-DCMAKE_BUILD_RPATH=$HOME/dcmtk-3.6.8-install/lib \
-DCMAKE_INSTALL_RPATH=$HOME/dcmtk-3.6.8-install/lib
下面是cmake的过程:

4.make编译:
bash
make -j$(sysctl -n hw.ncpu)

make的效果:

5.make install:
bash
make install
make install效果:


最终编译结构会在自己的/Users/用户/dcmtk-3.6.8-install/bin目录下。
6.配置环境变量:
bash
echo 'export PATH="/Users/用户名/dcmtk-3.6.8-install/bin:$PATH"' >> ~/.zshrc
bash
source ~/.zshrc
配置操作如下: 
7.本地C-EHCO/C-STORE/C-FIND回环测试:
新建文件目录:
建议纯英文路径,提前建好所有文件夹,避免路径不存在导致解析静默失败:
/Users/wangyao/software/dcmtk/DCMTK_PACS_TEST/
├─ SCP # 服务端目录
│ ├─ database # PACS影像存储库(必须提前新建)
│ └─ dcmqrscp.cfg # 核心配置文件
└─ SCU # 客户端目录
├─ test.dcm # 测试DICOM文件
└─ recv_db # C-MOVE拉取影像存放目录(提前新建)

向dcmqrscp.cfg写入如下配置:
bash
# 全局网络配置
NetworkTCPPort = 11112
MaxPDUSize = 16384
MaxAssociations = 16
# 客户端白名单表
HostTable BEGIN
# 格式:自定义标识 = (客户端AET, 本机真实主机名, MOVE接收端口)
acme1 = (ACME1, 192.168.43.104, 1234)
acme_local = (ACME1, 127.0.0.1, 1234)
# macbookpro本机主机名
acme_macbook = (ACME1, macbookpro, 1234)
acmeCTcompany = acme1, acme_local,acme_macbook
HostTable END
# 厂商表(可保留默认,不影响核心功能)
VendorTable BEGIN
"Acme CT Company" = acmeCTcompany
VendorTable END
# 服务端存储AE表
AETable BEGIN
# 格式:服务端AE名称 存储路径 权限 配额 允许访问的客户端组
ACME_STORE /Users/wangyao/software/dcmtk/DCMTK_PACS_TEST/SCP/database RW (9, 1024mb) acmeCTcompany
AETable END
开启服务:
在../SCP目录下打开命令行窗口:
bash
dcmqrscp -d --config dcmqrscp.cfg 11112

测试C-FIND:
bash
echoscu -d -aec ACME_STORE -aet ACME1 192.168.43.104 11112

如下最终打印"Received Echo Response (Success)"表示C-ECHO测试通过:

而服务端同样有C-EHCO的打印如下:

测试C-STORE:
bash
storescu -d -aet ACME1 -aec ACME_STORE 192.168.43.104 11112 +sd /Users/wangyao/software/dcmtk/DCMTK_PACS_TEST/SCU/test.dcm

如下提示"DIMSE Status : 0x0000: Success"表示成功:

而服务端同样有C-STORE的打印如下:

测试C-FIN:
这里限定查询规则:
bash
findscu -v -S -aec ACME_STORE -aet ACME1 192.168.43.104 11112 -k QueryRetrieveLevel=STUDY -k StudyInstanceUID
如下提示查询到结果:

服务端的打印如下:

测试C-MOVE:
bash
movescu -v -S \
-aec ACME_STORE \
-aet ACME1 \
-aem ACME1 \
--port 1234 \
-od /Users/wangyao/software/dcmtk/DCMTK_PACS_TEST/SCU/recv_db \
192.168.43.104 11112 \
-k QueryRetrieveLevel=STUDY \
-k StudyInstanceUID="用C-FIND查询到的UID"
C-FIND查询到的UID:

将以上的UID添加到C-MOVE中:

服务端打印如下:

之后在/DCMTK_PACS_TEST/SCU/recv_db 路径下,有了c-move下的dcm文件:

8.Mac Pro端的DCMTK的服务已经搭建完成:
经过以上的1-7步骤已经在Mac Pro端搭建好了完全能运行DCMTK服务。
二.Android DCMTK的实现:
首先把DCMTK与Android平台交叉编译的静态库或动态库/.h文件引入到工程中。
GitHub项目地址为:https://github.com/wangyongyao1989/DcmtkDemo
1.修改dcmqrscp.cfg文件:
与Android设备同连一个局域网下的本地服务电脑的ip:
bash
ipconfig getifaddr en0
查询Android的IP,将Android端的IP写入到dcmqrscp.cfg中的"acme1 = (ACME1, 192.168.1.19(Android端IP), 1234)"
bash
# 全局网络配置
NetworkTCPPort = 11112
MaxPDUSize = 16384
MaxAssociations = 16
# 客户端白名单表
HostTable BEGIN
android_client = (ANDROID_SCU, 192.168.1.11, 1234)
acme1 = (ACME1,macbookpro, 1234)
acmeCTcompany = acme1, android_client
HostTable END
VendorTable BEGIN
"Acme CT Company" = acmeCTcompany
VendorTable END
# 服务端存储AE表
AETable BEGIN
# 格式:服务端AE名称 存储路径 权限 配额 允许访问的客户端组
ACME_STORE /Users/wangyao/software/dcmtk/DCMTK_PACS_TEST/SCP/database RW (9, 1024mb) android_client
AETable END
dcmqrscp -d --disable-host-lookup --config dcmqrscp.cfg 11112 打开服务。
2.Android输入服务端的参数:
- Host:192.168.1.11(电脑的IP地址)
- Port:11112
- Local AET: ANDROID_SCU
- Remote AET:ACME_STORE
3.Android端的C-STORE:
演示效果如下:

4.Android端的C-FIND:
演示效果如下:

5.Android端的C-MOVE:
将c-move下来的dcm转成图片并显示
演示效果如下:


上面就是dcmtk是实现从dcmtk服务的搭建,再到c-ehco/c-store/c-find/c-move的测试的全过程。基本实现PACS传输的基础要求。
三.Worklist服务的搭建:
1.创建wordlist的工作目录空间:
复制官方模板:从 DCMTK 安装包中复制模板文件到工作目录:

将/dcmtk/dcmtk-3.6.8/dcmwlm/data中的wlistdb和wlistqry拷贝到如下目录中
..\DCMTK_PACS_TEST\Worklist
├─ wlistdb # 待检查单数据库根目录
│ └─ OFFIS # 以 AE Title 命名的子目录,对应设备的目标AE
│ └─ lockfile # 空锁文件,无内容,必须创建(核心踩坑点)
└─ wlistqry # 查询模板目录
2.编辑待检查单模板:
打开 wlistdb\sample.dump,修改核心业务字段(可直接使用默认模板测试):
患者信息
(0010,0010) PN 张三\^测试
(0010,0020) LO P20260630001
检查信息
(0008,0060) CS CT
(0040,0001) AE OFFIS # 必须与目录名、查询AE保持一致
(0032,1060) LO 胸部平扫
3.转换为二进制 .wl 待检查单:
在wlistdb/OFFIS/目录下用dump2dcm将.dump转成.wl:

4.用findscu命令查询Worklist:
bash
findscu 127.0.0.1 1104 /Users/wangyao/software/dcmtk/DCMTK_PACS_TEST/Worklist/wlistqry/wlist1.wl -aec OFFIS -aet TESTSCU -d

查询到的预约单的数据为:

5.Android端的Worklist查询:
GitHub项目地址为:https://github.com/wangyongyao1989/DcmtkDemo
Worklist的查询效果如下: 
GitHub项目地址为:https://github.com/wangyongyao1989/DcmtkDemo