Как сгенерировать GetSystemDateAndTime xml

У меня есть следующий фрагмент кода, который я взял из этого источника< /а>...

public bool Initialise(string cameraAddress, string userName, string password)
    {
        bool result = false;

        try
        {
            var messageElement = new TextMessageEncodingBindingElement()
            {
                MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
            };

            HttpTransportBindingElement httpBinding = new HttpTransportBindingElement()
            {
                AuthenticationScheme = AuthenticationSchemes.Digest
            };

            CustomBinding bind = new CustomBinding(messageElement, httpBinding);


            mediaClient = new MediaClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/Media"));
            mediaClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
            mediaClient.ClientCredentials.HttpDigest.ClientCredential.UserName = userName;
            mediaClient.ClientCredentials.HttpDigest.ClientCredential.Password = password;

            var profs = mediaClient.GetProfiles();

            //rest of the code...

Когда я запускаю wireshark, просматривая часть GetProfiles() в отладчике, я вижу, что сгенерированный XML выглядит так:

xml0

Какой код потребуется, чтобы изменить xml, чтобы он выглядел так:

xml1

Как мне вызвать функцию GetSystemDateAndTime?

Чтобы вызвать функцию GetProfiles, мне пришлось создать MediaClient, а затем вызвать эту функцию...

Есть ли такая вещь, как MediaClient, чтобы получить доступ к GetSystemDateAndTime??

Изменить:

Я обнаружил, что вы можете использовать DeviceClient, чтобы получить доступ к функции GetSystemDateAndTime...

Вам потребуется добавить wsdl для управления устройствами в подключенные службы до: https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl

Я также добавил туда System.Net.ServicePointManager.Expect100Continue = false;, потому что видел, как кто-то сказал, что это помогло в эта ссылка...

Поэтому я добавил:

CustomBinding bind = new CustomBinding(messageElement, httpBinding);
System.Net.ServicePointManager.Expect100Continue = false;
DeviceClient d = new DeviceClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/device_service"));
var time = d.GetSystemDateAndTime();

Примечание. Я все еще получаю сообщение об ошибке:

        ErrorMessage    "The header 'To' from the namespace 'http://www.w3.org/2005/08/addressing' was not understood by the recipient of this message, causing the message to not be processed.  This error typically indicates that the sender of this message has enabled a communication protocol that the receiver cannot process.  Please ensure that the configuration of the client's binding is consistent with the service's binding. "   string

person LoukMouk    schedule 07.05.2018    source источник


Ответы (1)


Эта ошибка говорит о том, что при попытке прочитать сообщение возникают проблемы, поэтому я уверен, что это, вероятно, связано с какой-то кодировкой ...

И Я БЫЛ ПРАВ!!

Все, что мне нужно было сделать, это изменить параметр в создании TextMessageEncodingBindingElement.

MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10)

Все, что вам нужно сделать, это убедиться, что у вас хорошая кодировка и Схема аутентификации...

Вот мой окончательный код для получения системы камеры onvif (здесь камера cohuHD), а также настроек даты и времени:

public bool Initialise(string cameraAddress, string userName, string password)
    {
        bool result = false;

        try
        {
            var messageElement = new TextMessageEncodingBindingElement()
            {
                MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10)
            };

            HttpTransportBindingElement httpBinding = new HttpTransportBindingElement()
            {
                AuthenticationScheme = AuthenticationSchemes.Digest
            };

            CustomBinding bind = new CustomBinding(messageElement, httpBinding);

            System.Net.ServicePointManager.Expect100Continue = false;

            DeviceClient deviceClient = new DeviceClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/device_service"));

            var temps = deviceClient.GetSystemDateAndTime();
        }
        catch (Exception ex)
        {
            ErrorMessage = ex.Message;
        }
        return result;
    }

Бонус:

Если вы хотите выполнить функцию, для которой требуются учетные данные, вы можете добавить их в свой deviceClient следующим образом:

//DIGEST (httpBinding)
deviceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
deviceClient.ClientCredentials.HttpDigest.ClientCredential.UserName = userName;
deviceClient.ClientCredentials.HttpDigest.ClientCredential.Password = password;

Следите также за URL-адресом EndpointAddress'... Я думаю, что некоторые камеры используют Device_service и другой device_service .

person LoukMouk    schedule 08.05.2018