# имя: 'CCTMK client 2' # описание: клиент протокола ССТМК # тип триггера: 'EgsScheduled' # создан: 2018.01.19 16.53.25, Сельченков Н.Ю. # изменен: '2018.04.25 17.20.43', Сельченков Н.Ю. # подробности: https://redmine.integra-s.com:11000/projects/eilyacuario/wiki/CCTMK_client_2 use acuario2.utils.TextExtension use System.IO.StringReader use System.Xml.XmlConvert use System.Xml.Serialization.XmlSerializer use System.Uri use System.Text.RegularExpressions.Regex use acuario2.webserver.soap12.UsernameToken use acuario2.webserver.soap12.Security use acuario2.webserver.soap12.ReplyTo use acuario2.webserver.soap12.Header use acuario2.webserver.soap12.Envelope use acuario2.webserver.onvif.wsdl.GetServicesRequest from acuario2.onvif use acuario2.webserver.onvif.wsdl.GetServicesResponse from acuario2.onvif use acuario2.webserver.onvif.wsdl.CreatePullPointSubscriptionRequest from acuario2.onvif use acuario2.webserver.onvif.wsdl.CreatePullPointSubscriptionResponse from acuario2.onvif use acuario2.webserver.onvif.wsdl.PullMessagesRequest from acuario2.onvif use acuario2.webserver.onvif.wsdl.PullMessagesResponse from acuario2.onvif use acuario2.webserver.onvif.wsdl.Renew from acuario2.onvif use acuario2.webserver.onvif.wsdl.RenewResponse from acuario2.onvif use acuario2.webserver.onvif.wsdl.NotificationMessageHolderType from acuario2.onvif use acuario2.webserver.onvif.Message use acuario2.webserver.onvif.CCTMK use acuario2.types.OnvifItem let regexFind(text as string, pattern as string) = with Regex(pattern).Match(text) do if Success then Groups[1].Value ### settings ### use typedef ` http://192.168.10.84:9000/onvif/device_service PT10M 1024 PT10S ` as Settings const settings = Settings(trigger.settings) const deviceUri = Uri(settings.deviceUrl) const initialTerminationTime = XmlConvert.ToTimeSpan(settings.initialTerminationTime) const timeout = XmlConvert.ToTimeSpan(settings.timeout) let serializer = XmlSerializer(Message) once eventsUrl = "" if eventsUrl is empty then print("deviceUrl:", deviceUri) let request = GetServicesRequest() request.IncludeCapability = false let response = Envelope(request, null, null).Post(deviceUri, GetServicesResponse) as GetServicesResponse eventsUrl = from response.Service select new { type = regexFind(Namespace, "http://www.onvif.org/ver10/(.+)/wsdl"), url = XAddr } where type is "events" select url single print("eventsUrl:", eventsUrl) end once subscription = "" if subscription is empty then let request = CreatePullPointSubscriptionRequest() request.InitialTerminationTime = settings.initialTerminationTime let envelope = Envelope(request, null, null) let response = envelope.Post(Uri(eventsUrl), CreatePullPointSubscriptionResponse) as CreatePullPointSubscriptionResponse subscription = response.SubscriptionReference.Address.Value print("subscription:", subscription) end let header = Header() header.To = subscription subscription = null with void do let request = PullMessagesRequest() request.MessageLimit = settings.messageLimit request.Timeout = settings.timeout let envelope = Envelope(request, null, null) envelope.Header = header let response = envelope.Post(Uri(eventsUrl), PullMessagesResponse) as PullMessagesResponse if response.NotificationMessage isnt empty then from response.NotificationMessage do let topic = Topic.Any[0].Value let type = regexFind(topic, ".+/(.+)/.+") let state = regexFind(topic, ".+/.+/(.+)") let msg = serializer.Deserialize(StringReader(it.Message.OuterXml)) as Message let id = from msg.Source where Name is "Id" select Value single let item = from graph.Values of type OnvifItem where onvifId is id try single if item isnt null then state = try CCTMK.Systems[type].Events.FromCCTMK(state).Replace('.', '_') else "DEFAULT" item["state"].Set(state, null, msg.UtcTime) from msg.Data do let param = item[TextExtension.LowercaseFirst(Name)] param?.Set?(Value, null, msg.UtcTime) now else print("NOT FOUND", type, id) end now end end with void do let request = Renew() request.TerminationTime = settings.initialTerminationTime let envelope = Envelope(request, null, null) envelope.Header = header envelope.Post(Uri(eventsUrl), RenewResponse) end subscription = header.To