Skip to content
πŸ“Ή Realtime IP camera network device discovery. Pings all cameras on your network conforming to the ONVIF standard.
TypeScript JavaScript
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.vscode fix: ip-scan is more robust (#19) Feb 12, 2019
src fix: emit error from internal socket stream (#41) Nov 12, 2019
.editorconfig ci: introduce circle ci Jan 3, 2019
.gitignore
.node-version perf: stream is now a cold observable (#36) Oct 5, 2019
.nvmrc perf: stream is now a cold observable (#36) Oct 5, 2019
LICENSE Initial commit Jan 3, 2019
README.md feat: automatic dispose of probe on unsubscribe (#40) Nov 10, 2019
circle.yml feat: rewrite (#28) Oct 2, 2019
cli.ts fix: cli paths (#29) Oct 2, 2019
package-lock.json perf: stream is now a cold observable (#36) Oct 5, 2019
package.json perf: stream is now a cold observable (#36) Oct 5, 2019
rollup.config.js fix: update dependencies (#20) Mar 30, 2019
tsconfig.json feat: rewrite (#28) Oct 2, 2019
tslint.json init Jan 3, 2019

README.md

camera-probe

Realtime scanning and discovery of networked cameras.

circeci codeclimate

greenkeeper greenkeeper greenkeeper

semantic-release npm latest version

Installation

This package is designed to be run in Node. For the best developer experience use Typescript.

$ npm i camera-probe

CLI Usage

For CLI usage its easier to install globally like so:

$ npm i -g camera-probe

// starting listening
$ camera-probe

// This table will update as cameras come online and offline.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ (index) β”‚   Name    β”‚    Model    β”‚       IP        β”‚                   URN                    β”‚                   Endpoint                     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚    0    β”‚ 'Amcrest' β”‚ 'IP2M-841B' β”‚ '192.168.1.1'   β”‚  '38b4eeff-f5bd-46b9-92e4-30e6acffee73'  β”‚  'http://192.168.1.1/onvif/device_service'     β”‚
β”‚    1    β”‚  'IPCAM'  β”‚   '631GA'   β”‚ '192.168.1.2'   β”‚  '4f5dcb4f-eea6-4cda-b290-f2b2b7d2f14f'  β”‚  'http://192.168.1.2:80/onvif/device_service'  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Programmatic Usage

import { onvifDevices$ } from 'camera-probe'
import { takeUntil } from 'rxjs/operators'

const subscription = onvifDevices$().subscribe(console.log)

// be sure to close the socket connection when complete with your query
// by unsubscribing from the observable.
subscription.unsubscribe()

// or using an rxjs operator like take
onvifDevices$().pipe(takeUntil(someObservaleFires)).subscribe(console.log)

// results
[ { name: 'Amcrest',
    hardware: 'IP2M-8200',
    location: 'china',
    deviceServiceUri: 'http://192.168.5.191/onvif/device_service',
    ip: '192.168.5.191',
    metadataVersion: '1',
    urn: 'fae40e7f-91e2-489a-afe6-66e19b667952',
    scopes:
     [ 'onvif://www.onvif.org/location/country/china',
       'onvif://www.onvif.org/name/Amcrest',
       'onvif://www.onvif.org/hardware/IP2M-8200',
       'onvif://www.onvif.org/Profile/Streaming',
       'onvif://www.onvif.org/type/Network_Video_Transmitter',
       'onvif://www.onvif.org/extension/unique_identifier',
       'onvif://www.onvif.org/Profile/G' ],
    profiles: [ 'Streaming', 'G' ],
    xaddrs: [ 'http://192.168.5.191/onvif/device_service' ] },
  { name: 'IPCAM',
    hardware: '421FZ',
    location: 'china',
    deviceServiceUri: 'http://192.168.5.13:80/onvif/device_service',
    ip: '192.168.5.13',
    metadataVersion: '1',
    urn: '0cbc0d5b-a7a1-47c7-bb60-85c878bb540e',
    scopes:
     [ 'onvif://www.onvif.org/Profile/Streaming',
       'onvif://www.onvif.org/Model/421FZ',
       'onvif://www.onvif.org/Name/IPCAM',
       'onvif://www.onvif.org/location/country/china' ],
    profiles: [ 'Streaming' ],
    xaddrs: [ 'http://192.168.5.13:80/onvif/device_service' ] } ]
You can’t perform that action at this time.