David Wallis
David Wallis

Reputation: 315

Streaming Api consumption

I have an api http://oversea-download.hikvision.com/uploadfile/Leaflet/ISAPI/HIKVISION%20ISAPI_2.0-IPMD%20Service.pdf I want to receive which uses a HTTP get and wants connection keep-alive.

Once connected it sends XML responses which I want to deserialise. I've created a class to represent the data structure, but I'm not sure how to continually update a list or similar as and when the data is sent back, for example the response (from wireshark) looks like:

wireshark

I'm not concerned with the parsing of data and updating the list, more how I can keep listening on a socket and see that its XML data and needs to be serialised.. without processing the stream into a buffer and looking for delimiters?

So far the code I had been unsuccessfully playing with looks like:

    public static async Task NewTask()
    {
        var client = new RestClient("http://192.168.0.152:80/");
        client.Authenticator = new HttpBasicAuthenticator("admin", "ThePassword");
        client.Encoding = Encoding.UTF8;

        var request = new RestRequest("ISAPI/Event/notification/alertStream", Method.GET);
        request.AddHeader("Connection", "keep-alive");
        request.AddHeader("Content-Type", "application/xml");

        IRestResponse<EventNotificationAlert> response2 = client.Execute<EventNotificationAlert>(request);
        var name = response2.Data.eventType;
        Console.WriteLine(name);
        //var asyncHandle = client.ExecuteAsync<EventNotificationAlert>(request, response => {
        //    Console.WriteLine(response.Data.eventDescription);
        //});
    }

and the class:

    public class EventNotificationAlert
{
    public string version { get; set; }
    public string ipAddress { get; set; }
    public string portNo { get; set; }
    public string protocol { get; set; }
    public string macAddress { get; set; }
    public string channelID { get; set; }
    public string dateTime { get; set; }
    public string activePostCount { get; set; }
    public string eventType { get; set; }
    public string eventState { get; set; }
    public string eventDescription { get; set; }
}

Upvotes: 1

Views: 1524

Answers (1)

David Wallis
David Wallis

Reputation: 315

disregard my comment, can't format it.. this kind of works.. but given I get boundary and content-type text I've got crude processing in...

        var messageBuffer = string.Empty;

        var request = WebRequest.Create("http://192.168.0.152:80/ISAPI/Event/notification/alertStream");
        request.Credentials = new NetworkCredential("admin", "ThePassword");
        request.BeginGetResponse(ar =>
        {
            var req = (WebRequest)ar.AsyncState;
            // TODO: Add exception handling: EndGetResponse could throw
            using (var response = req.EndGetResponse(ar))
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                // This loop goes as long as the api is streaming
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();

                    if (line == xmlEndStr)
                    {
                        messageBuffer += line;
                        GotMessage(messageBuffer);
                        messageBuffer = string.Empty;
                    }
                    else if (line.StartsWith("<"))
                    {
                        messageBuffer += line;
                    }
                }
            }
        }, request);

    static void GotMessage(string msg)
    {

        var mySerializer = new XmlSerializer(typeof(EventNotificationAlert));
        var stringReader = new StringReader(msg);

        var eventAlert = (EventNotificationAlert)mySerializer.Deserialize(stringReader);

        Console.WriteLine($"DateTime: {eventAlert.dateTime} Channel: {eventAlert.channelID} Type: {eventAlert.eventType} Description: {eventAlert.eventDescription}");
    }

Happy to hear of better ways (as you can tell I'm not great with c#!)

Upvotes: 2

Related Questions