RTSP config for Night Owl CAM-FWIP2-IN IP camera
TLDR: rtsp://<ip>:554/av0_0
I recently got a 3D printer, and I wanted to set up an IP camera to monitor it while I'm away from home.
I got the cheapest one at the newly-opened Santa Clara Microcenter, a Night Owl CAM-FWIP2-IN, for $30.
Initial impressions: somehow, an American company produced a camera that competes with no-name Chinese manufacturers for the dubious title of “I can't believe it's not AliExpress shovelware!” Terrible app whose backend is probably a breach waiting to happen. It's unfortunately required to set up the camera — there's no local configuration web UI.
I had trouble getting my phone to do the whole “connect to the no-internet-available AP it's broadcasting and give it the wifi credentials” song and dance. I had to disable always-on VPN (tailscale, in my case) for it to go through.
It took some time to discover the RTSP stream url for this one. (RTSP is a standard protocol that most IP cameras speak, and would allow me to add it to Home Assistant, Octoprint, Frigate, etc.)
I found the camera on the network, and confirmed the rtsp port (554) was open. However, none of the RTSP stream URLs in this table worked — I had Claude write a script to try them all against the camera.
The next best approach was to snoop in on what RTSP url the app would give the camera when it connected. I tried putting my laptop into promiscuous mode to sniff the traffic between the camera and the app to no avail. I later realized that my understanding of how sniffing on a WPA2 network works was incorrect — I needed to capture the initial handshake between the client and the AP to be able to decode subsequent frames.
I realized I could instead install the app in the Android Studio emulator so that the app's traffic would be sent through my laptop's network interface and could be decoded. I'm surprised it actually let me log into the Play Store and download the camera app just like on a normal phone.
After starting Wireshark, setting it to capture on en0
, setting the filter to rtsp
, and connecting to the camera through the app, I finally got what I was searching for. There are actually three RTSP streams requested by the app for this camera:
rtsp://ip:554/av0_0
rtsp://ip:554/av0_0/track1
rtsp://ip:554/av0_0/track2
I have not been able to determine the difference between them. All appear identical, codec-wise. At least the specs are honest. It's a full 1080p stream, 15fps, with audio.
With RTSP url in hand, I was able to set up the generic camera integration and monitor my printer through the web interface and through my Samsung phone's built-in smart home grid.
I then cut off Internet access to the camera, and gave it a static IP address on my local network. The phone app can no longer communicate with the camera, but because my Home Assistant instance proxies the stream over Tailscale to my phone and other devices, I can still view the camera's feed without it ever touching the public internet.
Good night, happy little Prusa in my phone!