diff --git a/storeroom/src/main/java/com/storeroom/modules/device/domain/DeviceCamerBind.java b/storeroom/src/main/java/com/storeroom/modules/device/domain/DeviceCamerBind.java new file mode 100644 index 0000000..2658d5d --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/device/domain/DeviceCamerBind.java @@ -0,0 +1,59 @@ +package com.storeroom.modules.device.domain; + +import com.storeroom.base.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Objects; + + +@Entity +@Getter +@Setter +public class DeviceCamerBind extends BaseEntity implements Serializable { + + @Id + @Column(name = "id") + @NotNull(groups = Update.class) + @ApiModelProperty(value = "ID", hidden = true) + private String id; + + @Column(name = "device_info_id") + @ApiModelProperty(value = "设备信息id") + private String deviceInfoId; + + @Column(name = "storeroom_name") + @ApiModelProperty(value = "库房名称") + private String StoreroomName; + + @Column(name = "camera_id") + @ApiModelProperty(value = "摄像头id") + private String cameraId; + + @Column(name = "time_size") + @ApiModelProperty(value = "视频时长") + private String timeSize; + + @Column(name = "bind_state") + @ApiModelProperty(value = "绑定状态") + private Integer bindState; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DeviceCamerBind that = (DeviceCamerBind) o; + return Objects.equals(id, that.id) && Objects.equals(deviceInfoId, that.deviceInfoId) && Objects.equals(cameraId, that.cameraId); + } + + @Override + public int hashCode() { + return Objects.hash(id, deviceInfoId, cameraId); + } +} diff --git a/storeroom/src/main/java/com/storeroom/modules/device/repository/DeviceCamerBindRepository.java b/storeroom/src/main/java/com/storeroom/modules/device/repository/DeviceCamerBindRepository.java new file mode 100644 index 0000000..194d5c1 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/device/repository/DeviceCamerBindRepository.java @@ -0,0 +1,8 @@ +package com.storeroom.modules.device.repository; + +import com.storeroom.modules.device.domain.DeviceCamerBind; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface DeviceCamerBindRepository extends JpaRepository , JpaSpecificationExecutor { +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/common/VideoClient.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/common/VideoClient.java index cb9c270..1b5d893 100644 --- a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/common/VideoClient.java +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/common/VideoClient.java @@ -1,16 +1,23 @@ package com.storeroom.modules.storeroom3d.config.common; +import com.storeroom.modules.storeroom3d.config.common.NVSSDK.DOWNLOAD_TIMESPAN; +import com.storeroom.modules.storeroom3d.config.common.NVSSDK.RAWFRAME_INFO; +import com.storeroom.modules.storeroom3d.config.common.NVSSDK.RAWFRAME_NOTIFY; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + public class VideoClient { int m_iLogonID = -1; int m_iConnectID = -1; int m_iTotalCount = 0; int m_iCurrentCount = 0; - String[] suffix = {".sdv", "", "", ".ps", "", "", ".ts"}; + String[] suffix = {".sdv", ".mp4", "", ".ps", "", "", ".ts"}; public void LogonNotify(String strIP, String strID, int iLogonID, int iLogonState) { String strMsg = new String(); @@ -47,7 +54,7 @@ public class VideoClient { + "),ID(" + strID + "),LogonID(" + iLogonID + ")"); } - ; + NVSSDK.ALARM_NOTIFY cbkAlarm = new NVSSDK.ALARM_NOTIFY() { public void AlarmNotify(int _iLogonID, int _iChannel, @@ -170,15 +177,15 @@ public class VideoClient { VideoClient tPlayback = new VideoClient(); tPlayback.SDKInit(); //初始化SDK - // Scanner scanInput = new Scanner(System.in); - System.out.println("Logon" + strIP + ":" + iPort + "-" +strUserName + "-" + strUserPwd); + // Scanner scanInput = new Scanner(System.in); + System.out.println("Logon" + strIP + ":" + iPort + "-" + strUserName + "-" + strUserPwd); while (true) { m_iLogonID = NetClient.Logon("", strIP, strUserName, strUserPwd, "", iPort); int iLogonStatus = NetClient.GetLogonStatus(m_iLogonID); if (iLogonStatus == NVSSDK.LOGON_SUCCESS) { break; } - + tPlayback.PlaybackByTimespanMode(); try { Thread.currentThread(); Thread.sleep(1000); @@ -189,4 +196,130 @@ public class VideoClient { return 0; } + + RAWFRAME_NOTIFY cbkRawFrame = new RAWFRAME_NOTIFY() { + public void rawFrameNotify(int _uiID, Pointer _pcData, int _iLen, RAWFRAME_INFO _ptRawFrameInfo, Pointer _lpUserData) { + //打印数据信息 + System.out.println("recvRawData: _uiID=" + _uiID + ", _iLen=" + _iLen + ", nType=" + _ptRawFrameInfo.nType); + + //上层可保存处理裸流数据 + if (null != _pcData && 0 != _iLen) { + SaveRawData(_ptRawFrameInfo.nType, _pcData, _iLen); + } + } + }; + + public int SaveRawData(int type, Pointer data, int len) { + FileOutputStream fopRawVideo = null; + File fileRawVideo; + FileOutputStream fopRawAudio = null; + File fileRawAudio; + try { + if (null == fopRawVideo) { + fileRawVideo = new File("myVideoRawData.raw"); + fopRawVideo = new FileOutputStream(fileRawVideo, true); + + // if file doesnt exists, then create it + if (!fileRawVideo.exists()) { + fileRawVideo.createNewFile(); + } + } + + + if (null == fopRawAudio) { + fileRawAudio = new File("myAudioRawData.raw"); + fopRawAudio = new FileOutputStream(fileRawAudio, true); + + // if file doesnt exists, then create it + if (!fileRawAudio.exists()) { + fileRawAudio.createNewFile(); + } + } + + // get the content in bytes + byte[] contentInBytes = data.getByteArray(0, len); + if (NVSSDK.AUDIO_FRAME == type) { + //保存原始流音频数据 + fopRawAudio.write(contentInBytes); + fopRawAudio.flush(); + fopRawAudio.close(); + } else { + //保存原始流视频数据 + fopRawVideo.write(contentInBytes); + fopRawVideo.flush(); + fopRawVideo.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (null != fopRawVideo) { + fopRawVideo.close(); + fopRawVideo = null; + } + if (null != fopRawAudio) { + fopRawAudio.close(); + fopRawAudio = null; + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return 0; + } + + + public int PlaybackByTimespanMode() { + DOWNLOAD_TIMESPAN tDownloadTimeSpan = new DOWNLOAD_TIMESPAN(); + tDownloadTimeSpan.m_iSize = tDownloadTimeSpan.size(); + //Scanner scanInput = new Scanner(System.in); + System.out.print("请输入录像文件类型(sdv=0;PS=3;TS=6):"); + int iSaveFileType = 1; //scanInput.nextInt(); + tDownloadTimeSpan.m_iSaveFileType = iSaveFileType; + tDownloadTimeSpan.m_iFileFlag = 0; //0:Download multiple files 1:Download into a single file + + String strLocalSaveFileName = new String("myTimespanDownload" + suffix[iSaveFileType]); + tDownloadTimeSpan.m_cLocalFilename = strLocalSaveFileName.getBytes(); + tDownloadTimeSpan.m_iChannelNO = 0; //通道号按实际下载的设备通道号赋值 + tDownloadTimeSpan.m_iStreamNo = 0; //码流号:0-主码流,1-副码流 + //按时间段下载开始时间 + tDownloadTimeSpan.m_tTimeBegin.iYear = 2022; + tDownloadTimeSpan.m_tTimeBegin.iMonth = 8; + tDownloadTimeSpan.m_tTimeBegin.iDay = 24; + tDownloadTimeSpan.m_tTimeBegin.iHour = 0; + tDownloadTimeSpan.m_tTimeBegin.iMinute = 0; + tDownloadTimeSpan.m_tTimeBegin.iSecond = 0; + //按时间段下载结束时间 + tDownloadTimeSpan.m_tTimeEnd.iYear = 2022; + tDownloadTimeSpan.m_tTimeEnd.iMonth = 8; + tDownloadTimeSpan.m_tTimeEnd.iDay = 24; + tDownloadTimeSpan.m_tTimeEnd.iHour = 0; + tDownloadTimeSpan.m_tTimeEnd.iMinute = 5; + tDownloadTimeSpan.m_tTimeEnd.iSecond = 0; + + tDownloadTimeSpan.m_iPosition = -1; //定位功能使用 + tDownloadTimeSpan.m_iSpeed = 32; //下载速度,最大32,老设备按最大速度下载容易出现中断,因此下载成功后可将速度调成16倍速 + tDownloadTimeSpan.m_iReqMode = 1; //1:down frame mode,0= Flow pattern; if (mode == 0) Device do not send download time ! + tDownloadTimeSpan.write(); + IntByReference iConnID = new IntByReference(); + int iRet = NetClient.NetFileDownload(iConnID, m_iLogonID, NVSSDK.DOWNLOAD_CMD_TIMESPAN, tDownloadTimeSpan.getPointer(), tDownloadTimeSpan.size()); + if (0 == iRet) { + //设置裸流回调,在回调里接收音视频裸流数据 + m_iConnectID = iConnID.getValue(); + NetClient.SetRawFrameCallBack(m_iConnectID, cbkRawFrame, null); + //调整速度 + NVSSDK.DOWNLOAD_CONTROL tControl = new NVSSDK.DOWNLOAD_CONTROL(); + tControl.m_iSize = tControl.size(); + tControl.m_iPosition = -1; + tControl.m_iSpeed = 16; + tControl.m_iReqMode = 1; + tControl.write(); + NetClient.NetFileDownload(iConnID, m_iLogonID, NVSSDK.DOWNLOAD_CMD_CONTROL, tControl.getPointer(), tControl.size()); + } else { + System.err.println("NetFileDownload:DOWNLOAD_CMD_TIMESPAN fail! iRet=" + iRet); + } + + return iRet; + } } diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/DeviceCamerBindService.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/DeviceCamerBindService.java new file mode 100644 index 0000000..d493688 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/DeviceCamerBindService.java @@ -0,0 +1,12 @@ +package com.storeroom.modules.storeroom3d.service; + +import com.storeroom.modules.device.domain.DeviceCamerBind; + +public interface DeviceCamerBindService { + + + /** + * 设备摄像头绑定 + */ + void bind(DeviceCamerBind deviceCamerBind); +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/DeviceCamerBindImpl.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/DeviceCamerBindImpl.java new file mode 100644 index 0000000..a0857c1 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/DeviceCamerBindImpl.java @@ -0,0 +1,22 @@ +package com.storeroom.modules.storeroom3d.service.impl; + +import com.storeroom.modules.device.domain.DeviceCamerBind; +import com.storeroom.modules.device.repository.DeviceCamerBindRepository; +import com.storeroom.modules.storeroom3d.service.DeviceCamerBindService; +import com.storeroom.utils.NanoIdUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DeviceCamerBindImpl implements DeviceCamerBindService { + + private final DeviceCamerBindRepository deviceCamerBindRepository; + + + @Override + public void bind(DeviceCamerBind deviceCamerBind) { + deviceCamerBind.setId(NanoIdUtils.randomNanoId()); + deviceCamerBindRepository.save(deviceCamerBind); + } +}