企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 实现Onvif对海康摄像机进行抓图 调用类文件class.ponvif.php,内容如下: ``` <?php class Ponvif { /* $ipaddress ip address of the NVT device $username NVT authentication username $password NVT authentication password $mediauri media web service uri $deviceuri core web service uri $ptzuri ptz web service uri $baseuri url of the NVT (without service specification) $onvifversion onvif version supported by the NVT $deltatime time differential correction (used to synchronize NVC with NVT) $capabilites response of GetCapabilities $videosources response of GetVideoSources $sources array cotaining tokens for further requests $profiles response of GetProfiles $proxyhost proxy $proxyport proxy port $proxyusername proxy authentication username $proxypassword proxy authentication password $lastresponse last soap response $discoverytimeout WS-Discovery waiting time (sec) $discoverymcastip WS-Discovery multicast ip address $discoverymcastport WS-Discovery multicast port $discoveryhideduplicates WS-Discovery flag to show\hide duplicates via source IP */ protected $ipaddress=''; protected $username=''; protected $password=''; protected $mediauri=''; protected $deviceuri=''; protected $ptzuri=''; protected $baseuri=''; protected $onvifversion=array(); protected $deltatime=0; protected $capabilities=array(); protected $videosources=array(); protected $sources=array(); protected $profiles=array(); protected $proxyhost=''; protected $proxyport=''; protected $proxyusername=''; protected $proxypassword=''; protected $lastresponse=''; protected $intransingent=true; protected $discoverytimeout=2; protected $discoverybindip='0.0.0.0'; protected $discoverymcastip='239.255.255.250'; protected $discoverymcastport=3702; protected $discoveryhideduplicates=true; /* Properties wrappers */ public function setProxyHost($proxyHost) { $this->proxyhost = $proxyHost; } public function getProxyHost() { return $this->proxyhost; } public function setProxyPort($proxyPort) { $this->proxyport = $proxyPort; } public function getProxyPort() { return $this->proxyport; } public function setProxyUsername($proxyUsername) { $this->proxyusername = $proxyUsername; } public function getProxyUsername() { return $this->proxyusername; } public function setProxyPassword($proxyPassword) { $this->proxypassword = $proxyPassword; } public function getProxyPassword() { return $this->proxypassword; } public function setUsername($username) { $this->username = $username; } public function getUsername() { return $this->username; } public function setPassword($password) { $this->password = $password; } public function getPassword() { return $this->password; } public function getDeviceUri() { return $this->deviceuri; } public function setDeviceUri($deviceuri) { $this->deviceuri = $deviceuri; } public function getIPAddress($ipAddress) { return $this->ipAddress; } public function setIPAddress($ipAddress) { $this->ipaddress = $ipAddress; } public function getSources() { return $this->sources; } public function getMediaUri() { return $this->mediauri; } public function setMediaUri($mediauri) { $this->mediauri = $mediauri; } public function getCodecEncoders($codec) { return $this->_getCodecEncoders($codec); } public function getPTZUri() { return $this->ptzuri; } public function getBaseUrl() { return $this->baseuri; } public function getSupportedVersion() { return $this->onvifversion; } public function getCapabilities() { return $this->capabilities; } public function setBreakOnError($intransingent) { $this->intransingent=$intransingent; } public function getLastResponse() { return $this->lastresponse; } public function setDiscoveryTimeout($discoverytimeout) { $this->discoverytimeout = $discoverytimeout; } public function setDiscoveryBindIp($discoverybindip) { $this->discoverybindip = $discoverybindip; } public function setDiscoveryMcastIp($discoverymcastip) { $this->discoverymcastip = $discoverymcastip; } public function setDiscoveryMcastPort($discoverymcastport) { $this->discoverymcastport = $discoverymcastport; } public function setDiscoveryHideDuplicates($discoveryhideduplicates) { $this->discoveryhideduplicates = $discoveryhideduplicates; } /* Constructor & Destructor */ public function __construct() { // nothing to do } public function __destruct() { // nothing to do } /* WS-Discovery */ public function discover(){ $result = array(); $timeout = time() + $this->discoverytimeout; $post_string = '<?xml version="1.0" encoding="UTF-8"?><e:Envelope xmlns:e="http://www.w3.org/2003/05/soap-envelope" xmlns:w="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:dn="http://www.onvif.org/ver10/network/wsdl"><e:Header><w:MessageID>uuid:84ede3de-7dec-11d0-c360-f01234567890</w:MessageID><w:To e:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To><w:Action a:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</w:Action></e:Header><e:Body><d:Probe><d:Types>dn:NetworkVideoTransmitter</d:Types></d:Probe></e:Body></e:Envelope>'; try { if(FALSE == ($sock = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))){ echo('Create socket error: ['.socket_last_error().'] '.socket_strerror(socket_last_error())); } if(FALSE == @socket_bind($sock, $this->discoverybindip, rand(20000, 40000))){ echo('Bind socket error: ['.socket_last_error().'] '.socket_strerror(socket_last_error())); } socket_set_option($sock, IPPROTO_IP, MCAST_JOIN_GROUP, array('group' => $this->discoverymcastip)); socket_sendto($sock, $post_string, strlen($post_string), 0, $this->discoverymcastip, $this->discoverymcastport); $sock_read = array($sock); $sock_write = NULL; $sock_except = NULL; if ( socket_select( $sock_read, $sock_write, $sock_except, $this->discoverytimeout ) > 0 ) { if(FALSE !== @socket_recvfrom($sock, $response, 9999, 0, $from, $this->discoverymcastport)){ if($response != NULL && $response != $post_string){ $response = $this->_xml2array($response); if(!$this->isFault($response)){ $response['Envelope']['Body']['ProbeMatches']['ProbeMatch']['IPAddr'] = $from; if($this->discoveryhideduplicates){ $result[$from] = $response['Envelope']['Body']['ProbeMatches']['ProbeMatch']; } else { $result[] = $response['Envelope']['Body']['ProbeMatches']['ProbeMatch']; } } } } } socket_close($sock); } catch (Exception $e) {} sort($result); return $result; } /* Public functions (basic initialization method and other collaterals) */ public function initialize() { if(!$this->mediauri){ $this->mediauri='http://'.$this->ipaddress.'/onvif/device_service'; } try { $datetime=$this->core_GetSystemDateAndTime(); $timestamp=mktime($datetime['Time']['Hour'], $datetime['Time']['Minute'], $datetime['Time']['Second'], $datetime['Date']['Month'], $datetime['Date']['Day'], $datetime['Date']['Year']); $this->deltatime=time()-$timestamp-5; } catch (Exception $e) {} $this->capabilities=$this->core_GetCapabilities(); $onvifVersion=$this->_getOnvifVersion($this->capabilities); $this->mediauri=$onvifVersion['media']; $this->deviceuri=$onvifVersion['device']; $this->ptzuri=$onvifVersion['ptz']; preg_match("/^http(.*)onvif\//",$this->mediauri,$matches); $this->baseuri=$matches[0]; $this->onvifversion=array('major'=>$onvifVersion['major'], 'minor'=>$onvifVersion['minor']); $this->videosources=$this->media_GetVideoSources(); $this->profiles=$this->media_GetProfiles(); $this->sources=$this->_getActiveSources($this->videosources,$this->profiles); } public function isFault($response) { // Useful to check if response contains a fault return array_key_exists('Fault', $response) || array_key_exists('Fault', $response['Envelope']['Body']); } /* Public wrappers for a subset of ONVIF primitives */ public function core_GetSystemDateAndTime() { $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetSystemDateAndTime xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope>'; if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetSystemDateAndTime: Communication error'); } else return $response['Envelope']['Body']['GetSystemDateAndTimeResponse']['SystemDateAndTime']['UTCDateTime']; } public function core_GetCapabilities() { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetCapabilities xmlns="http://www.onvif.org/ver10/device/wsdl"><Category>All</Category></GetCapabilities></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP']), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetCapabilities: Communication error'); } else return $response['Envelope']['Body']['GetCapabilitiesResponse']['Capabilities']; } public function media_GetVideoSources() { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetVideoSources xmlns="http://www.onvif.org/ver10/media/wsdl"/></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP']), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetVideoSources: Communication error'); } else return $response['Envelope']['Body']['GetVideoSourcesResponse']['VideoSources']; } public function media_GetProfiles() { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetProfiles xmlns="http://www.onvif.org/ver10/media/wsdl"/></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP']), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetProfiles: Communication error'); } else return $response['Envelope']['Body']['GetProfilesResponse']['Profiles']; } public function media_GetServices() { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetServices xmlns="http://www.onvif.org/ver10/device/wsdl"><IncludeCapability>false</IncludeCapability></GetServices></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP']), $post_string); if ($this->isFault($this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetServices: Communication error'); } } public function core_GetDeviceInformation() { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP']), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetDeviceInformation: Communication error'); } else return $response['Envelope']['Body']['GetDeviceInformationResponse']; } public function media_GetStreamUri($profileToken,$stream="RTP-Unicast",$protocol="RTSP") { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetStreamUri xmlns="http://www.onvif.org/ver10/media/wsdl"><StreamSetup><Stream xmlns="http://www.onvif.org/ver10/schema">%%STREAM%%</Stream><Transport xmlns="http://www.onvif.org/ver10/schema"><Protocol>%%PROTOCOL%%</Protocol></Transport></StreamSetup><ProfileToken>%%PROFILETOKEN%%</ProfileToken></GetStreamUri></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%STREAM%%", "%%PROTOCOL%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $stream, $protocol), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetStreamUri: Communication error'); } else return $response['Envelope']['Body']['GetStreamUriResponse']['MediaUri']['Uri']; } public function media_GetSnapshotUri($profileToken) { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetSnapshotUri xmlns="http://www.onvif.org/ver10/media/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken></GetSnapshotUri></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetSnapshotUri: Communication error'); var_dump($response); } else return $response['Envelope']['Body']['GetSnapshotUriResponse']['MediaUri']['Uri']; } public function media_GetVideoEncoderConfigurations($filterToken = null) { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetVideoEncoderConfigurations xmlns="http://www.onvif.org/ver10/media/wsdl" /></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP']), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetVideoEncoderConfigurations: Communication error'); //var_dump($response); } else { if ( ! $filterToken ) { $resp = $response['Envelope']['Body']['GetVideoEncoderConfigurationsResponse']['Configurations']; } else { foreach( $response['Envelope']['Body']['GetVideoEncoderConfigurationsResponse']['Configurations'] as $resp ) { if ( $resp['@attributes']['token'] == $filterToken ) break; } } return $resp; } } public function media_GetVideoEncoderConfigurationOptions($profileToken) { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetVideoEncoderConfigurationOptions xmlns="http://www.onvif.org/ver10/media/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken></GetVideoEncoderConfigurationOptions></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetVideoEncoderConfigurationOptions: Communication error'); //var_dump($response); } else return $response['Envelope']['Body']['GetVideoEncoderConfigurationOptionsResponse']['Options']; } public function media_SetVideoEncoderConfiguration($vec) { $REQ = $this->_makeToken(); $post_string = '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex" xmlns:dom0="http://www.axis.com/2009/event" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 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:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:wsc="http://schemas.xmlsoap.org/ws/2005/02/sc" 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:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:xmime="http://tempuri.org/xmime.xsd" 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"> <s:Header> <wsse:Security s:mustUnderstand="true"> <wsse:UsernameToken> <wsse:Username>%%USERNAME%%</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</wsse:Password> <wsse:Nonce>%%NONCE%%</wsse:Nonce> <wsu:Created>%%CREATED%%</wsu:Created> </wsse:UsernameToken> </wsse:Security> </s:Header> %%BODY%% </s:Envelope>'; $optConfig = ""; if ( isset($vec['RateControl']) ) { $optConfig .= " <tt:RateControl> <tt:FrameRateLimit>{$vec['RateControl']['FrameRateLimit']}</tt:FrameRateLimit> <tt:EncodingInterval>{$vec['RateControl']['EncodingInterval']}</tt:EncodingInterval> <tt:BitrateLimit>{$vec['RateControl']['BitrateLimit']}</tt:BitrateLimit> </tt:RateControl>"; } if ( isset($vec['MPEG4']) ) { $optConfig .= " <tt:MPEG4> <tt:GovLength>{$vec['MPEG4']['GovLength']}</tt:GovLength> <tt:Mpeg4Profile>{$vec['MPEG4']['Mpeg4Profile']}</tt:H264Profile> </tt:MPEG4>"; } if ( isset($vec['H264']) ) { $optConfig .= " <tt:H264> <tt:GovLength>{$vec['H264']['GovLength']}</tt:GovLength> <tt:H264Profile>{$vec['H264']['H264Profile']}</tt:H264Profile> </tt:H264>"; } // FIXME: Create function array2xml with XML-Namespaces $post_string_body = " <s:Body> <trt:SetVideoEncoderConfiguration> <trt:Configuration xsi:type=\"tt:VideoEncoderConfiguration\" token=\"{$vec['@attributes']['token']}\"> <tt:Name>{$vec['Name']}</tt:Name> <tt:UseCount>{$vec['UseCount']}</tt:UseCount> <tt:Encoding>{$vec['Encoding']}</tt:Encoding> <tt:Resolution> <tt:Width>{$vec['Resolution']['Width']}</tt:Width> <tt:Height>{$vec['Resolution']['Height']}</tt:Height> </tt:Resolution> <tt:Quality>{$vec['Quality']}</tt:Quality> {$optConfig} <tt:Multicast> <tt:Address> <tt:Type>{$vec['Multicast']['Address']['Type']}</tt:Type> <tt:IPv4Address>{$vec['Multicast']['Address']['IPv4Address']}</tt:IPv4Address> </tt:Address> <tt:Port>{$vec['Multicast']['Port']}</tt:Port> <tt:TTL>{$vec['Multicast']['TTL']}</tt:TTL> <tt:AutoStart>{$vec['Multicast']['AutoStart']}</tt:AutoStart> </tt:Multicast> <tt:SessionTimeout>{$vec['SessionTimeout']}</tt:SessionTimeout> </trt:Configuration> <trt:ForcePersistence>true</trt:ForcePersistence> </trt:SetVideoEncoderConfiguration> </s:Body>"; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%BODY%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $post_string_body), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('SetVideoEncoderConfiguration: Communication error'); } } public function media_GetOSDs() { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetOSDs xmlns="http://www.onvif.org/ver10/media/wsdl"></GetOSDs></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP']), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('GetOSDs: Communication error'); } else return $response['Envelope']['Body']['GetOSDsResponse']['OSDs']; } public function media_DeleteOSD($OSDToken) { $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><DeleteOSD xmlns="http://www.onvif.org/ver10/media/wsdl"><OSDToken>%%OSDToken%%</OSDToken></DeleteOSD></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%OSDToken%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $OSDToken), $post_string); if ($this->isFault($response=$this->_send_request($this->mediauri,$post_string))) { if ($this->intransingent) throw new Exception('DeleteOSD: Communication error'); } } public function ptz_GetPresets($profileToken) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetPresets xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken></GetPresets></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken), $post_string); if ($this->isFault($response=$this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('GetPresets: Communication error'); } else { $getpresetsresponse=$response['Envelope']['Body']['GetPresetsResponse']['Preset']; $presets=array(); foreach ($getpresetsresponse as $preset) { $presets[]=array('Token'=>$preset['@attributes']['token'], 'Name'=>$preset['Name'], 'PTZPosition'=>$preset['PTZPosition']); } return $presets; } } public function ptz_GetNode($ptzNodeToken) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetNode xmlns="http://www.onvif.org/ver20/ptz/wsdl"><NodeToken>%%NODETOKEN%%</NodeToken></GetNode></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%NODETOKEN%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $ptzNodeToken), $post_string); if ($this->isFault($response=$this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('GetNode: Communication error'); } else return $response['Envelope']['Body']['GetNodeResponse']; } public function ptz_GotoPreset($profileToken,$presetToken,$speed_pantilt_x,$speed_pantilt_y,$speed_zoom_x) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GotoPreset xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><PresetToken>%%PRESETTOKEN%%</PresetToken><Speed><PanTilt x="%%SPEEDPANTILTX%%" y="%%SPEEDPANTILTY%%" xmlns="http://www.onvif.org/ver10/schema"/><Zoom x="%%SPEEDZOOMX%%" xmlns="http://www.onvif.org/ver10/schema"/></Speed></GotoPreset></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%PRESETTOKEN%%", "%%SPEEDPANTILTX%%", "%%SPEEDPANTILTY%%", "%%SPEEDZOOMX%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $presetToken, $speed_pantilt_x, $speed_pantilt_y, $speed_zoom_x), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('GotoPreset: Communication error'); } } public function ptz_RemovePreset($profileToken,$presetToken) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><RemovePreset xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><PresetToken>%%PRESETTOKEN%%</PresetToken></RemovePreset></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%PRESETTOKEN%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $presetToken), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('RemovePreset: Communication error'); } } public function ptz_SetPreset($profileToken,$presetName) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SetPreset xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><PresetName>%%PRESETNAME%%</PresetName></SetPreset></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%PRESETNAME%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $presetName), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('SetPreset: Communication error'); } } public function ptz_RelativeMove($profileToken,$translation_pantilt_x,$translation_pantilt_y,$speed_pantilt_x,$speed_pantilt_y) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><RelativeMove xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><Translation><PanTilt x="%%TRANSLATIONPANTILTX%%" y="%%TRANSLATIONPANTILTY%%" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace" xmlns="http://www.onvif.org/ver10/schema"/></Translation><Speed><PanTilt x="%%SPEEDPANTILTX%%" y="%%SPEEDPANTILTY%%" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace" xmlns="http://www.onvif.org/ver10/schema"/></Speed></RelativeMove></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%TRANSLATIONPANTILTX%%", "%%TRANSLATIONPANTILTY%%", "%%SPEEDPANTILTX%%", "%%SPEEDPANTILTY%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $translation_pantilt_x, $translation_pantilt_y, $speed_pantilt_x, $speed_pantilt_y), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('RelativeMove: Communication error'); } } public function ptz_RelativeMoveZoom($profileToken,$zoom,$speedZoom) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><RelativeMove xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><Translation><Zoom x="%%ZOOM%%" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace" xmlns="http://www.onvif.org/ver10/schema"/></Translation><Speed><Zoom x="%%SPEEDZOOM%%" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace" xmlns="http://www.onvif.org/ver10/schema"/></Speed></RelativeMove></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%SPEEDZOOM%%", "%%ZOOM%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $speedZoom, $zoom), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('RelativeMoveZoom: Communication error'); } } public function ptz_AbsoluteMove($profileToken,$position_pantilt_x,$position_pantilt_y,$zoom) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><AbsoluteMove xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><Position><PanTilt x="%%POSITIONPANTILTX%%" y="%%POSITIONPANTILTY%%" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace" xmlns="http://www.onvif.org/ver10/schema"/><Zoom x="%%ZOOM%%" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace" xmlns="http://www.onvif.org/ver10/schema"/></Position></AbsoluteMove></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%POSITIONPANTILTX%%", "%%POSITIONPANTILTY%%", "%%ZOOM%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $position_pantilt_x, $position_pantilt_y, $zoom), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('AbsoluteMove: Communication error'); } } public function ptz_ContinuousMove($profileToken,$velocity_pantilt_x,$velocity_pantilt_y) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><ContinuousMove xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><Velocity><PanTilt x="%%VELOCITYPANTILTX%%" y="%%VELOCITYPANTILTY%%" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace" xmlns="http://www.onvif.org/ver10/schema"/></Velocity></ContinuousMove></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%VELOCITYPANTILTX%%", "%%VELOCITYPANTILTY%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $velocity_pantilt_x, $velocity_pantilt_y), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('ContinuousMove: Communication error'); } } public function ptz_ContinuousMoveZoom($profileToken,$zoom) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><ContinuousMove xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><Velocity><Zoom x="%%ZOOM%%" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace" xmlns="http://www.onvif.org/ver10/schema"/></Velocity></ContinuousMove></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%ZOOM%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $zoom), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('ContinuousMoveZoom: Communication error'); } } public function ptz_Stop($profileToken,$pantilt,$zoom) { if ($this->ptzuri=='') return array(); $REQ=$this->_makeToken(); $post_string='<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>%%USERNAME%%</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%%PASSWORD%%</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%%NONCE%%</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%%CREATED%%</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Stop xmlns="http://www.onvif.org/ver20/ptz/wsdl"><ProfileToken>%%PROFILETOKEN%%</ProfileToken><PanTilt>%%PANTILT%%</PanTilt><Zoom>%%ZOOM%%</Zoom></Stop></s:Body></s:Envelope>'; $post_string=str_replace(array("%%USERNAME%%", "%%PASSWORD%%", "%%NONCE%%", "%%CREATED%%", "%%PROFILETOKEN%%", "%%PANTILT%%", "%%ZOOM%%"), array($REQ['USERNAME'], $REQ['PASSDIGEST'], $REQ['NONCE'], $REQ['TIMESTAMP'], $profileToken, $pantilt, $zoom), $post_string); if ($this->isFault($this->_send_request($this->ptzuri,$post_string))) { if ($this->intransingent) throw new Exception('Stop: Communication error'); } } /* Internal functions */ protected function _makeToken() { $timestamp=time()-$this->deltatime; return $this->_passwordDigest($this->username,$this->password,date('Y-m-d\TH:i:s.000\Z',$timestamp)); } protected function _getOnvifVersion($capabilities) { $version=array(); if (isset($capabilities['Device']['System']['SupportedVersions']['Major'])) { // NVT supports a specific onvif version $version['major']=$capabilities['Device']['System']['SupportedVersions']['Major']; $version['minor']=$capabilities['Device']['System']['SupportedVersions']['Minor']; } else { // NVT supports more onvif versions $currentma=0; $currentmi=0; foreach ($capabilities['Device']['System']['SupportedVersions'] as $cver) { if ($cver['Major']>$currentma) { $currentma=$cver['Major'];$currentmi=$cver['Minor']; } } $version['major']=$currentma; $version['minor']=$currentmi; } $version['media']=$capabilities['Media']['XAddr']; $version['device']=$capabilities['Device']['XAddr']; $version['event']=$capabilities['Events']['XAddr']; if (isset($capabilities['PTZ']['XAddr'])) $version['ptz']=$capabilities['PTZ']['XAddr']; else $version['ptz']=''; return $version; } protected function _getActiveSources($videoSources,$profiles) { $sources=array(); if (isset($videoSources['@attributes'])) { // NVT is a camera $sources[0]['sourcetoken']=$videoSources['@attributes']['token']; $this->_getProfileData($sources,0,$profiles); } else { // NVT is an encoder for ($i=0;$i<count($videoSources);$i++) { if (strtolower($videoSources[$i]['@attributes']['SignalActive'])=='true') { $sources[$i]['sourcetoken']=$videoSources[$i]['@attributes']['token']; $this->_getProfileData($sources,$i,$profiles); } } // for } return $sources; } protected function _getProfileData(&$sources,$i,$profiles) { $inprofile=0; for ($y=0; $y < count($profiles); $y++) { if ($profiles[$y]['VideoSourceConfiguration']['SourceToken']==$sources[$i]['sourcetoken']) { $sources[$i][$inprofile]['profilename']=$profiles[$y]['Name']; $sources[$i][$inprofile]['profiletoken']=$profiles[$y]['@attributes']['token']; if ( isset($profiles[$y]['VideoEncoderConfiguration'])) { $sources[$i][$inprofile]['encodername']=$profiles[$y]['VideoEncoderConfiguration']['Name']; $sources[$i][$inprofile]['encoding']=$profiles[$y]['VideoEncoderConfiguration']['Encoding']; $sources[$i][$inprofile]['width']=$profiles[$y]['VideoEncoderConfiguration']['Resolution']['Width']; $sources[$i][$inprofile]['height']=$profiles[$y]['VideoEncoderConfiguration']['Resolution']['Height']; $sources[$i][$inprofile]['fps']=$profiles[$y]['VideoEncoderConfiguration']['RateControl']['FrameRateLimit']; $sources[$i][$inprofile]['bitrate']=$profiles[$y]['VideoEncoderConfiguration']['RateControl']['BitrateLimit']; } if ( isset($profiles[$y]['PTZConfiguration'])) { $sources[$i][$inprofile]['ptz']['name']=$profiles[$y]['PTZConfiguration']['Name']; $sources[$i][$inprofile]['ptz']['nodetoken']=$profiles[$y]['PTZConfiguration']['NodeToken']; } $inprofile++; } } } protected function _getCodecEncoders($codec) { // 'JPEG', 'MPEG4', 'H264' $encoders = Array(); foreach( $this->sources as $ncam => $sCam ) { $encoders[$ncam] = Array(); foreach( $sCam as $sCamProfile ) { if ( isset($sCamProfile['profiletoken']) ) { $profileToken = $sCamProfile['profiletoken']; $encoderName = $sCamProfile['encodername']; $VideoEncoderConfiguration = $this->media_GetVideoEncoderConfigurationOptions($profileToken); if ( isset($VideoEncoderConfiguration[$codec]) ) { $enc = Array(); $enc['Name'] = $encoderName; $enc['profileToken'] = $profileToken; $enc['QualityRange'] = $VideoEncoderConfiguration['QualityRange']; $encoders[$ncam][] = array_merge($enc, $VideoEncoderConfiguration[$codec]); } } } } return $encoders; } protected function _xml2array($response) { $sxe = new SimpleXMLElement($response); $dom_sxe = dom_import_simplexml($sxe); $dom = new DOMDocument('1.0'); $dom_sxe = $dom->importNode($dom_sxe, true); $dom_sxe = $dom->appendChild($dom_sxe); $element = $dom->childNodes->item(0); foreach ($sxe->getDocNamespaces() as $name => $uri) { $element->removeAttributeNS($uri, $name); } $xmldata=$dom->saveXML(); $xmldata=substr($xmldata,strpos($xmldata,"<Envelope>")); $xmldata=substr($xmldata,0,strpos($xmldata,"</Envelope>")+strlen("</Envelope>")); $xml=simplexml_load_string($xmldata); $data=json_decode(json_encode((array)$xml),1); $data=array($xml->getName()=>$data); return $data; } protected function _passwordDigest( $username, $password, $timestamp = "default", $nonce = "default" ) { if ($timestamp=='default') $timestamp=date('Y-m-d\TH:i:s.000\Z'); if ($nonce=='default') $nonce=mt_rand(); $REQ=array(); $passdigest = base64_encode(pack('H*', sha1(pack('H*', $nonce) . pack('a*',$timestamp).pack('a*',$password)))); //$passdigest=base64_encode(sha1($nonce.$timestamp.$password,true)); // alternative $REQ['USERNAME']=$username; $REQ['PASSDIGEST']=$passdigest; $REQ['NONCE']=base64_encode(pack('H*', $nonce)); //$REQ['NONCE']=base64_encode($nonce); // alternative $REQ['TIMESTAMP']=$timestamp; return $REQ; } protected function _send_request($url,$post_string) { $soap_do = curl_init(); curl_setopt($soap_do, CURLOPT_URL, $url ); if ($this->proxyhost!='' && $this->proxyport!='') { curl_setopt($soap_do, CURLOPT_PROXY, $this->proxyhost); curl_setopt($soap_do, CURLOPT_PROXYPORT, $this->proxyport); if ($this->proxyusername!='' && $this->proxypassword!='') curl_setopt($soap_do, CURLOPT_PROXYUSERPWD, $this->proxyusername.':'.$this->proxypassword); } curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($soap_do, CURLOPT_TIMEOUT, 10); curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true ); curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($soap_do, CURLOPT_POST, true ); curl_setopt($soap_do, CURLOPT_POSTFIELDS, $post_string); curl_setopt($soap_do, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($post_string) )); //curl_setopt($soap_do, CURLOPT_USERPWD, $user . ":" . $password); // HTTP authentication if ( ($result = curl_exec($soap_do)) === false) { $err = curl_error($soap_do); $this->lastresponse=array("Fault"=>$err); } else { $this->lastresponse=$this->_xml2array($result); } return $this->lastresponse; } } // end class ?> ``` 实例(抓图) ``` <?php require './class.ponvif.php'; $onvif \= new Ponvif(); $onvif\->setUsername('admin'); $onvif\->setPassword('pg123456'); $onvif\->setIPAddress('192.168.60.121'); try { //初始化 $onvif\->initialize(); //获取设备资源 $sources \= $onvif\->getSources(); //获取token值 $profileToken \= $sources\[0\]\[1\]\['profiletoken'\]; //获取onvif网址 $Snapshort\=$onvif\->media\_GetSnapshotUri($profileToken); //模拟登录并获取网页内容 $curl\=curl\_init(); curl\_setopt($curl,CURLOPT\_URL,$Snapshort); curl\_setopt($curl,CURLOPT\_USERPWD,"admin:pg123456"); curl\_setopt($curl, CURLOPT\_TIMEOUT, 3); curl\_setopt($curl, CURLOPT\_CONNECTTIMEOUT, 10); curl\_setopt($curl,CURLOPT\_RETURNTRANSFER,1); curl\_setopt($curl, CURLOPT\_SSL\_VERIFYPEER, false); curl\_setopt($curl, CURLOPT\_SSL\_VERIFYHOST, false); $data\=curl\_exec($curl); echo $data; //保存图片 $filename\=time(); $file \= "./".$filename.".jpg"; file\_put\_contents( $file, $data); } catch(Exception $e) { echo "erro\\n"; } ```