[ipcamera] Fix warnings and improve logging (#15703)

Signed-off-by: Kai Kreuzer <kai@openhab.org>
This commit is contained in:
Kai Kreuzer 2023-10-17 16:03:25 +02:00 committed by GitHub
parent 7cb94f9238
commit 1e090bddae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 121 additions and 142 deletions

View File

@ -39,7 +39,6 @@ import org.slf4j.LoggerFactory;
/**
* The {@link Ffmpeg} class is responsible for handling multiple ffmpeg conversions which are used for many tasks
*
*
* @author Matthew Skinner - Initial contribution
*/
@ -90,7 +89,7 @@ public class Ffmpeg {
public void checkKeepAlive() {
if (keepAlive == 1) {
stopConverting();
} else if (keepAlive <= -1 && !getIsAlive()) {
} else if (keepAlive <= -1 && !isAlive()) {
logger.warn("HLS stream was not running, restarting it now.");
startConverting();
}
@ -124,9 +123,8 @@ public class Ffmpeg {
public void run() {
try {
process = Runtime.getRuntime().exec(commandArrayList.toArray(new String[commandArrayList.size()]));
Process localProcess = process;
if (localProcess != null) {
InputStream errorStream = localProcess.getErrorStream();
InputStream errorStream = process.getErrorStream();
InputStreamReader errorStreamReader = new InputStreamReader(errorStream);
BufferedReader bufferedReader = new BufferedReader(errorStreamReader);
String line = null;
@ -180,9 +178,8 @@ public class Ffmpeg {
break;
}
}
}
} catch (IOException e) {
logger.warn("An IO error occured trying to start FFmpeg:{}", e.getMessage());
logger.warn("An IO error occurred trying to start FFmpeg: {}", e.getMessage());
} finally {
switch (format) {
case GIF:
@ -217,7 +214,7 @@ public class Ffmpeg {
}
}
public boolean getIsAlive() {
public boolean isAlive() {
Process localProcess = process;
if (localProcess != null) {
if (localProcess.isAlive() && notFrozen) {

View File

@ -120,13 +120,11 @@ public class ReolinkHandler extends ChannelDuplexHandler {
ipCameraHandler.logger.debug("The GetAiStateResponse could not be parsed");
return;
}
if (aiResponse[0].value.dog_cat != null) {
if (aiResponse[0].value.dog_cat.alarm_state == 1) {
ipCameraHandler.setChannelState(CHANNEL_ANIMAL_ALARM, OnOffType.ON);
} else {
ipCameraHandler.setChannelState(CHANNEL_ANIMAL_ALARM, OnOffType.OFF);
}
}
if (aiResponse[0].value.face.alarm_state == 1) {
ipCameraHandler.setChannelState(CHANNEL_FACE_DETECTED, OnOffType.ON);
} else {

View File

@ -50,7 +50,6 @@ import org.slf4j.LoggerFactory;
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault
public class IpCameraGroupHandler extends BaseThingHandler {
private final Logger logger = LoggerFactory.getLogger(getClass());

View File

@ -123,7 +123,6 @@ import io.netty.util.concurrent.GlobalEventExecutor;
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault
public class IpCameraHandler extends BaseThingHandler {
public final Logger logger = LoggerFactory.getLogger(getClass());
@ -515,8 +514,8 @@ public class IpCameraHandler extends BaseThingHandler {
return;
} else if (ffmpegSnapshotGeneration) { // Use RTSP stream creating snapshots to know camera is online.
Ffmpeg localSnapshot = ffmpegSnapshot;
if (localSnapshot != null && !localSnapshot.getIsAlive()) {
cameraCommunicationError("FFmpeg Snapshots Stopped: Check your camera can be reached.");
if (localSnapshot != null && !localSnapshot.isAlive()) {
cameraCommunicationError("FFmpeg Snapshots Stopped: Check that your camera can be reached.");
return;
}
return; // ffmpeg snapshot stream is still alive
@ -882,9 +881,7 @@ public class IpCameraHandler extends BaseThingHandler {
ffmpegRecord = new Ffmpeg(this, format, cameraConfig.getFfmpegLocation(), inputOptions, rtspUri,
cameraConfig.getMp4OutOptions(), cameraConfig.getFfmpegOutput() + mp4Filename + ".mp4",
cameraConfig.getUser(), cameraConfig.getPassword());
Ffmpeg localRecord = ffmpegRecord;
if (localRecord != null) {
localRecord.startConverting();
ffmpegRecord.startConverting();
if (mp4History.isEmpty()) {
mp4History = mp4Filename;
} else if (!"ipcamera".equals(mp4Filename)) {
@ -894,7 +891,6 @@ public class IpCameraHandler extends BaseThingHandler {
mp4History = mp4History.substring(0, endIndex);
}
}
}
setChannelState(CHANNEL_MP4_HISTORY, new StringType(mp4History));
break;
case RTSP_ALARMS:
@ -930,10 +926,7 @@ public class IpCameraHandler extends BaseThingHandler {
}
ffmpegRtspHelper = new Ffmpeg(this, format, cameraConfig.getFfmpegLocation(), inputOptions, input,
filterOptions, "-f null -", cameraConfig.getUser(), cameraConfig.getPassword());
localAlarms = ffmpegRtspHelper;
if (localAlarms != null) {
localAlarms.startConverting();
}
ffmpegRtspHelper.startConverting();
break;
case MJPEG:
if (ffmpegMjpeg == null) {
@ -1448,7 +1441,7 @@ public class IpCameraHandler extends BaseThingHandler {
}
public void cameraConfigError(String reason) {
// wont try to reconnect again due to a config error being the cause.
// won't try to reconnect again due to a config error being the cause.
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, reason);
dispose();
}
@ -1640,13 +1633,13 @@ public class IpCameraHandler extends BaseThingHandler {
}
if (ffmpegMotionAlarmEnabled || ffmpegAudioAlarmEnabled) {
localFfmpeg = ffmpegRtspHelper;
if (localFfmpeg == null || !localFfmpeg.getIsAlive()) {
if (localFfmpeg == null || !localFfmpeg.isAlive()) {
setupFfmpegFormat(FFmpegFormat.RTSP_ALARMS);
}
}
// check if the thread has frozen due to camera doing a soft reboot
localFfmpeg = ffmpegMjpeg;
if (localFfmpeg != null && !localFfmpeg.getIsAlive()) {
if (localFfmpeg != null && !localFfmpeg.isAlive()) {
logger.debug("MJPEG was not being produced by FFmpeg when it should have been, restarting FFmpeg.");
setupFfmpegFormat(FFmpegFormat.MJPEG);
}

View File

@ -28,7 +28,6 @@ import io.netty.util.ReferenceCountUtil;
/**
* The {@link OnvifCodec} is used by Netty to decode Onvif traffic into message Strings.
*
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault
@ -66,11 +65,11 @@ public class OnvifCodec extends ChannelDuplexHandler {
}
if (evt instanceof IdleStateEvent) {
IdleStateEvent e = (IdleStateEvent) evt;
logger.trace("IdleStateEvent received {}", e.state());
logger.trace("IdleStateEvent received: {}", e.state());
onvifConnection.setIsConnected(false);
ctx.close();
} else {
logger.trace("Other ONVIF netty channel event occured {}", evt);
logger.trace("Other ONVIF netty channel event occurred: {}", evt);
}
}

View File

@ -67,8 +67,6 @@ import io.netty.handler.timeout.IdleStateHandler;
/**
* The {@link OnvifConnection} This is a basic Netty implementation for connecting and communicating to ONVIF cameras.
*
*
*
* @author Matthew Skinner - Initial contribution
*/
@ -146,7 +144,7 @@ public class OnvifConnection {
private Float tiltRangeMax = 1.0f;
private Float zoomMin = 0.0f;
private Float zoomMax = 1.0f;
// These hold the PTZ values for updating Openhabs controls in 0-100 range
// These hold the PTZ values for updating openHABs controls in 0-100 range
private Float currentPanPercentage = 0.0f;
private Float currentTiltPercentage = 0.0f;
private Float currentZoomPercentage = 0.0f;
@ -308,7 +306,7 @@ public class OnvifConnection {
}
public void processReply(String message) {
logger.trace("Onvif reply is:{}", message);
logger.trace("ONVIF reply is: {}", message);
if (message.contains("PullMessagesResponse")) {
eventRecieved(message);
} else if (message.contains("RenewResponse")) {
@ -317,7 +315,7 @@ public class OnvifConnection {
setIsConnected(true);
sendOnvifRequest(RequestType.GetCapabilities, deviceXAddr);
parseDateAndTime(message);
logger.debug("Openhabs UTC dateTime is:{}", getUTCdateTime());
logger.debug("openHAB UTC dateTime is: {}", getUTCdateTime());
} else if (message.contains("GetCapabilitiesResponse")) {// 2nd to be sent.
parseXAddr(message);
sendOnvifRequest(RequestType.GetProfiles, mediaXAddr);
@ -358,7 +356,7 @@ public class OnvifConnection {
logger.debug("ptzNodeToken={}", ptzNodeToken);
sendPTZRequest(RequestType.GetConfigurations);
} else if (message.contains("GetDeviceInformationResponse")) {
logger.debug("GetDeviceInformationResponse recieved");
logger.debug("GetDeviceInformationResponse received");
} else if (message.contains("GetSnapshotUriResponse")) {
snapshotUri = removeIPfromUrl(Helper.fetchXML(message, ":MediaUri", ":Uri"));
logger.debug("GetSnapshotUri:{}", snapshotUri);
@ -464,7 +462,7 @@ public class OnvifConnection {
String day = Helper.fetchXML(message, "UTCDateTime", "Day>");
String month = Helper.fetchXML(message, "UTCDateTime", "Month>");
String year = Helper.fetchXML(message, "UTCDateTime", "Year>");
logger.debug("Cameras UTC dateTime is:{}-{}-{}T{}:{}:{}", year, month, day, hour, minute, second);
logger.debug("Camera UTC dateTime is: {}-{}-{}T{}:{}:{}", year, month, day, hour, minute, second);
}
private String getUTCdateTime() {
@ -565,7 +563,7 @@ public class OnvifConnection {
bootstrap = localBootstap;
}
if (!mainEventLoopGroup.isShuttingDown()) {
bootstrap.connect(new InetSocketAddress(ipAddress, onvifPort)).addListener(new ChannelFutureListener() {
localBootstap.connect(new InetSocketAddress(ipAddress, onvifPort)).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(@Nullable ChannelFuture future) {
@ -576,15 +574,16 @@ public class OnvifConnection {
connectError = false;
Channel ch = future.channel();
ch.writeAndFlush(request);
} else { // an error occured
} else { // an error occurred
if (future.isDone() && !future.isCancelled()) {
Throwable cause = future.cause();
String msg = cause.getMessage();
logger.trace("connect failed - cause {}", cause.getMessage());
if (cause instanceof ConnectTimeoutException) {
logger.debug("Camera is not reachable on IP {}", ipAddress);
connectError = true;
} else if ((cause instanceof ConnectException)
&& cause.getMessage().contains("Connection refused")) {
} else if ((cause instanceof ConnectException) && msg != null
&& msg.contains("Connection refused")) {
logger.debug("Camera ONVIF port {} is refused.", onvifPort);
refusedError = true;
}
@ -616,7 +615,7 @@ public class OnvifConnection {
} else {// 192.168.1.1
ipAddress = url;
deviceXAddr = "http://" + ipAddress + "/onvif/device_service";
logger.debug("No Onvif Port found when parsing:{}", url);
logger.debug("No ONVIF Port found when parsing: {}", url);
return;
}
deviceXAddr = "http://" + ipAddress + ":" + onvifPort + "/onvif/device_service";
@ -644,7 +643,7 @@ public class OnvifConnection {
}
String dataName = Helper.fetchXML(eventMessage, "tt:Data", "Name=\"");
String dataValue = Helper.fetchXML(eventMessage, "tt:Data", "Value=\"");
logger.debug("Onvif Event Topic:{}, Data:{}, Value:{}", topic, dataName, dataValue);
logger.debug("ONVIF Event Topic: {}, Data: {}, Value: {}", topic, dataName, dataValue);
switch (topic) {
case "RuleEngine/CellMotionDetector/Motion":
if ("true".equals(dataValue)) {

View File

@ -61,7 +61,6 @@ import io.netty.util.concurrent.GlobalEventExecutor;
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault
@io.netty.channel.ChannelHandler.Sharable
public class OnvifDiscovery {
@ -150,7 +149,7 @@ public class OnvifDiscovery {
} catch (IOException e) {
brand = "onvif";
}
logger.info("Possible {} camera found at:{}", brand, packet.sender().getHostString());
logger.debug("Possible {} camera found at: {}", brand, packet.sender().getHostString());
if ("reolink".equals(brand)) {
ipCameraDiscoveryService.newCameraFound(brand, packet.sender().getHostString(), 8000);
} else {

View File

@ -22,7 +22,6 @@ import io.netty.handler.codec.http.LastHttpContent;
/**
* The {@link NettyRtspHandler} is used to decode RTSP traffic into message Strings.
*
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault

View File

@ -43,7 +43,6 @@ import io.netty.handler.timeout.IdleStateHandler;
* The {@link RtspConnection} is a WIP and not currently used, but will talk directly to RTSP and collect information
* about the camera and streams.
*
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault

View File

@ -109,7 +109,7 @@ public class CameraServlet extends IpCameraServlet {
Ffmpeg localFfmpeg = handler.ffmpegHLS;
if (localFfmpeg == null) {
handler.setupFfmpegFormat(FFmpegFormat.HLS);
} else if (!localFfmpeg.getIsAlive()) {
} else if (!localFfmpeg.isAlive()) {
localFfmpeg.startConverting();
} else {
localFfmpeg.setKeepAlive(8);

View File

@ -22,10 +22,8 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
* The {@link OpenStreams} Keeps track of all open mjpeg streams so the byte[] can be given to all FIFO buffers to allow
* 1 to many streams without needing to open more than 1 source stream.
*
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault
public class OpenStreams {
private List<StreamOutput> openStreams = Collections.synchronizedList(new ArrayList<StreamOutput>());

View File

@ -28,7 +28,6 @@ import org.slf4j.LoggerFactory;
*
* @author Matthew Skinner - Initial contribution
*/
@NonNullByDefault
public class StreamOutput {
public final Logger logger = LoggerFactory.getLogger(getClass());