Dcm2cheStoreSCU.java 4.21 KB
package com.sw.laryngoscope.dicom;

import com.sw.laryngoscope.utils.Logger;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.Tag;
import org.dcm4che3.data.UID;
import org.dcm4che3.io.DicomInputStream;
import org.dcm4che3.io.DicomInputStream.IncludeBulkData;
import org.dcm4che3.net.ApplicationEntity;
import org.dcm4che3.net.Association;
import org.dcm4che3.net.Connection;
import org.dcm4che3.net.Device;
import org.dcm4che3.net.DimseRSPHandler;
import org.dcm4che3.net.IncompatibleConnectionException;
import org.dcm4che3.net.InputStreamDataWriter;
import org.dcm4che3.net.Priority;
import org.dcm4che3.net.pdu.AAssociateRQ;
import org.dcm4che3.net.pdu.PresentationContext;
import org.dcm4che3.net.service.BasicCStoreSCP;
import org.dcm4che3.util.SafeClose;

public class Dcm2cheStoreSCU {

	private Connection remote = new Connection();
	private ApplicationEntity ae = new ApplicationEntity("STORESCU");//设备AE标题
	private final AAssociateRQ rq = new AAssociateRQ();
	private Association as;
	ExecutorService executorService = null;

	public Dcm2cheStoreSCU() {
		initDevice();
		rq.setApplicationContext(UID.DICOMApplicationContext);
		rq.setImplClassUID("1.2.276.0.7230010.3.0.3.5.4");
		rq.addPresentationContext(new PresentationContext(1,
				UID.Verification, UID.ImplicitVRLittleEndian));
	}

	public void initDevice() {
		Device device = new Device("storescu");
		Connection conn = new Connection();
		device.addConnection(conn);
		device.addApplicationEntity(ae);

		executorService = Executors.newSingleThreadExecutor();
		device.setExecutor(executorService);
		remote.setTlsProtocols(conn.getTlsProtocols());
        remote.setTlsCipherSuites(conn.getTlsCipherSuites());
        
        ae.addConnection(conn);
	}

	public void initServerInfo(String devAETitle, String strAETitle, String strRemoteIP, int nRemotPort) {
		ae.setAETitle(devAETitle);
		rq.setCalledAET(strAETitle);
		remote.setHostname(strRemoteIP);
		remote.setPort(nRemotPort);
	}

	public void sendDicomFile(String strFilePath)
			throws IOException, InterruptedException,
			IncompatibleConnectionException, GeneralSecurityException {
		File file = new File(strFilePath);

		if(!file.exists()) {
			return;
		}

		DicomInputStream in = null;
		try {
			in = new DicomInputStream(file);
			in.setIncludeBulkData(IncludeBulkData.NO);
			Attributes fmi = in.readFileMetaInformation();
			String cuid = fmi.getString(Tag.MediaStorageSOPClassUID);
			String iuid = fmi.getString(Tag.MediaStorageSOPInstanceUID);
			String ts = fmi.getString(Tag.TransferSyntaxUID);

			rq.addPresentationContext(new PresentationContext(rq.getNumberOfPresentationContexts() * 2 + 1, cuid, ts));
			Logger.d("=======sendDicomFile==1====== cuid " + cuid + " iuid " + iuid + " ts " + ts + " Number " +
					rq.getNumberOfPresentationContexts());
			as = ae.connect(remote, rq);
			iuid = iuid == null ? "1" : iuid;

			long fmiEndPos = in.getPosition();
			FileInputStream input = new FileInputStream(file);
			Logger.d("=======sendDicomFile==2======");
			input.skip(fmiEndPos);
			InputStreamDataWriter data = new InputStreamDataWriter(input);
			Logger.d("=======sendDicomFile==3======");
			as.cstore(cuid, iuid, Priority.NORMAL, data, ts, new DimseRSPHandler(as.nextMessageID()));
			Logger.d("=======sendDicomFile========");

		} finally {
			close();
			SafeClose.close(in);
		}
	}

	public void close() throws IOException, InterruptedException {
		if(executorService != null) {
			executorService.shutdown();
		}

		if (as != null) {
			if (as.isReadyForDataTransfer())
				as.release();
			as.waitForSocketClose();
		}
	}

	public void main(String devAETitle, String strAETitle, String strRemoteIP, int nRemotPort, String path) {//devAETitle AAAAA
		// TODO Auto-generated method stub
		initServerInfo(devAETitle, strAETitle, strRemoteIP, nRemotPort);
		try {
			sendDicomFile(path);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Logger.d("=======end.....========");
	}

}