dmitrif / onvif2mqtt

Translate ONVIF events (from IP Cameras) to MQTT messages.
Other
114 stars 31 forks source link

Multiple camera issue seems to have returned #55

Open ratsputin opened 2 years ago

ratsputin commented 2 years ago

Most recent version:

Run with a single camera, no issues.

mqtt:
  host: 127.0.0.1
  port: 1883
onvif:
  - name: "Master Bathroom Door"
    hostname: reolink-master-bath.dante.local
    port: 8000
    username: user
    password: password
root@ha:/srv/onvif2mqtt# npm run dev

> onvif-cam@1.0.4 dev
> cross-env CONFIG_PATH=./config.dev.yml nodemon -e js,yml --exec babel-node src/index.js | pino-pretty

[nodemon] 2.0.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,yml
[nodemon] starting `babel-node src/index.js`
[1644111564667] INFO : Loading configuration. {"configPath":"./config.dev.yml"}
[1644111564675] INFO : Validating configuration file.
[1644111564680] INFO  (Manager): Beginning initialization...
[1644111564681] INFO  (MQTT on 127.0.0.1:1883 ): Connecting.
[1644111564723] INFO  (MQTT on 127.0.0.1:1883 ): Successfully connected.
[1644111564725] INFO  (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): Attempting connection.
[1644111564984] INFO  (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): Successfully connected.
[1644111567388] INFO  (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door

Add a second camera:

mqtt:
  host: 127.0.0.1
  port: 1883
onvif:
  - name: "Master Bathroom Door"
    hostname: reolink-master-bath.dante.local
    port: 8000
    username: user
    password: password
  - name: "Back Yard"
    hostname: reolink-back-yard.dante.local
    port: 8000
    username: user
    password: password

Connects but can't successfully createa a PullPointSubscription

root@ha:/srv/onvif2mqtt# npm run dev

> onvif-cam@1.0.4 dev
> cross-env CONFIG_PATH=./config.dev.yml nodemon -e js,yml --exec babel-node src/index.js | pino-pretty

[nodemon] 2.0.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,yml
[nodemon] starting `babel-node src/index.js`
[1644111833516] INFO : Loading configuration. {"configPath":"./config.dev.yml"}
[1644111833524] INFO : Validating configuration file.
[1644111833530] INFO  (Manager): Beginning initialization...
[1644111833530] INFO  (MQTT on 127.0.0.1:1883 ): Connecting.
[1644111833575] INFO  (MQTT on 127.0.0.1:1883 ): Successfully connected.
[1644111833578] INFO  (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): Attempting connection.
[1644111833578] INFO  (ONVIF/Back Yard on reolink-back-yard.dante.local): Attempting connection.
[1644111833810] INFO  (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): Successfully connected.
[1644111833812] INFO  (ONVIF/Back Yard on reolink-back-yard.dante.local): Successfully connected.
[1644111834416] ERROR (ONVIF/Back Yard on reolink-back-yard.dante.local): CreatePullPointSubscription Back Yard
[1644111836600] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644111838402] ERROR (ONVIF/Back Yard on reolink-back-yard.dante.local): CreatePullPointSubscription Back Yard
[1644111838593] ERROR (ONVIF/Back Yard on reolink-back-yard.dante.local): CreatePullPointSubscription Back Yard
[1644111839101] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644111839120] ERROR (ONVIF/Back Yard on reolink-back-yard.dante.local): CreatePullPointSubscription Back Yard
[1644111842275] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644111843220] ERROR (ONVIF/Back Yard on reolink-back-yard.dante.local): CreatePullPointSubscription Back Yard
[1644111845202] ERROR (ONVIF/Back Yard on reolink-back-yard.dante.local): CreatePullPointSubscription Back Yard
[1644111845764] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644111845917] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644111846619] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644111849547] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644111849865] ERROR (ONVIF/Back Yard on reolink-back-yard.dante.local): CreatePullPointSubscription Back Yard
[1644111850653] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
^C
root@ha:/srv/onvif2mqtt#

What's interesting is that I have to reboot cameras or wait a long time (45 minutes) before a new subscription can be established. This only happens after adding a second camera.

Putting the config back the way it was (single camera) and running it again:

root@ha:/srv/onvif2mqtt# npm run dev

> onvif-cam@1.0.4 dev
> cross-env CONFIG_PATH=./config.dev.yml nodemon -e js,yml --exec babel-node src/index.js | pino-pretty

[nodemon] 2.0.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,yml
[nodemon] starting `babel-node src/index.js`
[1644112141246] INFO : Loading configuration. {"configPath":"./config.dev.yml"}
[1644112141254] INFO : Validating configuration file.
[1644112141259] INFO  (Manager): Beginning initialization...
[1644112141260] INFO  (MQTT on 127.0.0.1:1883 ): Connecting.
[1644112141302] INFO  (MQTT on 127.0.0.1:1883 ): Successfully connected.
[1644112141304] INFO  (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): Attempting connection.
[1644112141548] INFO  (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): Successfully connected.
[1644112143993] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644112147732] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644112152234] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644112153668] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
[1644112158024] ERROR (ONVIF/Master Bathroom Door on reolink-master-bath.dante.local): CreatePullPointSubscription Master Bathroom Door
^C
root@ha:/srv/onvif2mqtt#

Note, the above does not happen (I can restart onvif2mqtt all I want) if I never add a second camera.

I did do a tcpdump and captured the following response from the CreatePullPointSubscription request that keeps failing:

HTTP/1.1 400 Bad Request
Server: gSOAP/2.8
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 3079
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:ns1="http://www.onvif.org/ver10/actionengine/wsdl" xmlns:ns10="http://www.onvif.org/ver10/events/wsdl/PullPointBinding" xmlns:ns11="http://www.onvif.org/ver10/events/wsdl/CreatePullPointBinding" xmlns:ns12="http://www.onvif.org/ver10/events/wsdl/PausableSubscriptionManagerBinding" xmlns:ns13="http://www.onvif.org/ver10/network/wsdl/RemoteDiscoveryBinding" xmlns:ns14="http://www.onvif.org/ver10/network/wsdl/DiscoveryLookupBinding" xmlns:ns3="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding" xmlns:ns4="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding" xmlns:ns5="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding" xmlns:ns6="http://www.onvif.org/ver10/events/wsdl/EventBinding" xmlns:ns7="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding" xmlns:ns8="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding" xmlns:ns9="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding" xmlns:tad="http://www.onvif.org/ver10/analyticsdevice/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tdn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tls="http://www.onvif.org/ver10/display/wsdl" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:trv="http://www.onvif.org/ver10/receiver/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xmime5="http://www.w3.org/2005/05/xmlmime" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Header />
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <SOAP-ENV:Code>
            <SOAP-ENV:Value>SOAP-ENV:Sender</SOAP-ENV:Value>
         </SOAP-ENV:Code>
         <SOAP-ENV:Reason>
            <SOAP-ENV:Text xml:lang="en" />
         </SOAP-ENV:Reason>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
ratsputin commented 2 years ago

Another piece of interesting information:

While I'm still having the issue I showed in the last dump (single camera but can't connect to it after having connected to two previously), I was able to successfully connect to and establish a PullPointSubscription from a different machine, so it's not an issue with the camera itself.

Apparently, having connected to more than one camera breaks something on the host that is residual even after exiting onvif2mqtt. Out of curiosity, I checked a netstat -a and didn't see any residual connections.