public void TestCancelWithNotify() { // Check what happens with out of order delivery Uri uri = new Uri($"coap://localhost:{_serverPort}/{target1}"); CoapClient client = new CoapClient(uri); AutoResetEvent trigger = new AutoResetEvent(false); Response nextResponse = null; int lastObserve = -1; _expected = "No Content Yet"; CoapObserveRelation obs1 = client.Observe(response => { nextResponse = response; trigger.Set(); }); Assert.IsFalse(obs1.Canceled); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(_expected, nextResponse.ResponseText); Assert.IsTrue(nextResponse.HasOption(OptionType.Observe)); Assert.IsTrue(nextResponse.Observe.HasValue); int oNumber = nextResponse.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; _resource.Changed(); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(_expected, nextResponse.ResponseText); Assert.IsTrue(nextResponse.HasOption(OptionType.Observe)); Assert.IsTrue(nextResponse.Observe.HasValue); oNumber = nextResponse.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; _resource.Changed(); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(_expected, nextResponse.ResponseText); Assert.IsTrue(nextResponse.HasOption(OptionType.Observe)); Assert.IsTrue(nextResponse.Observe.HasValue); oNumber = nextResponse.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; _resource.Canceled(true); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(!Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(null, nextResponse.ResponseText); Assert.IsFalse(nextResponse.HasOption(OptionType.Observe)); _resource.Changed(); Assert.IsFalse(trigger.WaitOne(1000)); client = null; }
public void CheckOnTime() { Uri uri = new Uri($"coap://localhost:{_serverPort}/{target1}"); CoapClient client = new CoapClient(uri); AutoResetEvent trigger = new AutoResetEvent(false); Response nextResponse = null; int lastObserve = -1; _expected = "No Content Yet"; CoapObserveRelation obs1 = client.Observe(response => { nextResponse = response; trigger.Set(); }); Assert.IsFalse(obs1.Canceled); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(_expected, nextResponse.ResponseText); Assert.IsTrue(nextResponse.HasOption(OptionType.Observe)); Assert.IsTrue(nextResponse.Observe.HasValue); int oNumber = nextResponse.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; _config.NotificationCheckIntervalTime = 500; int count = 0; for (int i = 0; i < 20; i++) { Thread.Sleep(100); _expected = $"Content for {i}"; _resource.UpdateContent(_expected); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(_expected, nextResponse.ResponseText); Assert.IsTrue(nextResponse.HasOption(OptionType.Observe)); Assert.IsTrue(nextResponse.Observe.HasValue); oNumber = nextResponse.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; Console.WriteLine($"lastObserve = {lastObserve}, type = {nextResponse.Type}"); count += (nextResponse.Type == MessageType.CON) ? 1 : 0; } Assert.IsTrue(count > 0); }
public void TestOutOfOrder() { // Check what happens with out of order delivery Uri uri = new Uri($"coap://localhost:{_serverPort}/{target1}"); CoapClient client = new CoapClient(uri); _expected = "No Content Yet"; CoapObserveRelation obs1 = client.Observe(response => { Assert.AreEqual(_expected, response.ResponseText); Assert.IsTrue(response.HasOption(OptionType.Observe)); Assert.IsTrue(response.Observe.HasValue); int oNumber = response.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; }); Assert.IsFalse(obs1.Canceled); Thread.Sleep(100); _resource.Changed(); _resource2.ObserveNo = lastObserve + 3; }
/// <inheritdoc/> public override void ReceiveResponse(INextLayer nextLayer, Exchange exchange, Response response) { if (response.HasOption(OptionType.Observe)) { CoapObserveRelation relation = exchange.Request.ObserveRelation; if (relation == null || relation.Canceled) { // The request was canceled and we no longer want notifications log.Debug("ObserveLayer rejecting notification for canceled Exchange"); EmptyMessage rst = EmptyMessage.NewRST(response); SendEmptyMessage(nextLayer, exchange, rst); // Matcher sets exchange as complete when RST is sent return; } if (relation.Reconnect) { PrepareReregistration(exchange, response, msg => SendRequest(nextLayer, exchange, msg)); } } base.ReceiveResponse(nextLayer, exchange, response); }
public void ObserveTest13() { CoapConfig clientConfig = new CoapConfig() { NotificationReregistrationBackoff = 0 }; Pump = new MockMessagePump(); IEndPoint clientEndpoint = Pump.AddEndPoint("Client1", MockMessagePump.ClientAddress, clientConfig, new Type[] { typeof(ObserveLayer) }); clientEndpoint.Start(); CreateServer(); CoapClient coapClient = new CoapClient { EndPoint = clientEndpoint, Uri = new Uri($"coap://{MockMessagePump.ServerAddress}{_resource.Uri}"), Timeout = 0 }; Response lastResponse = null; int count = 1; _resource.UpdateContent($"First string {count - 1}"); AutoResetEvent trigger = new AutoResetEvent(false); CoapObserveRelation relation = coapClient.ObserveAsync( (r) => { lastResponse = r; trigger.Set(); }); AutoResetEvent reregistered = new AutoResetEvent(false); relation.Request.Reregistering += (a, b) => { reregistered.Set(); b.RefreshRequest.IsCancelled = true; }; byte[] tokenBytes = relation.Request.Token; bool dataSent = false; int requestNo = 0; int observerNo = 1; while (true) { Thread.Sleep(1); if (Pump.Queue.Count > 0) { MockQueueItem item = Pump.Queue.Peek(); switch (item.ItemType) { case MockQueueItem.QueueType.NetworkSend: if (item.Request != null) { if (tokenBytes == null) { tokenBytes = relation.Request.Token; } Assert.IsTrue(item.Request.HasOption(OptionType.Observe)); Assert.AreEqual(0, item.Request.Observe); CollectionAssert.AreEqual(tokenBytes, item.Request.Token); switch (requestNo) { case 0: Assert.IsFalse(item.Request.HasOption(OptionType.ETag)); break; case 1: case 2: Assert.AreEqual(4, item.Request.ETags.ToArray().Length); break; } requestNo += 1; Debug.WriteLine($"Request: {item.Request}"); } else if (item.Response != null) { Assert.IsTrue(item.Response.HasOption(OptionType.Observe)); Assert.AreEqual(observerNo, item.Response.Observe); CollectionAssert.AreEqual(tokenBytes, item.Response.Token); dataSent = true; Debug.WriteLine($"Response: {item.Response} {item.Response.Observe}"); } else { Assert.Fail(); } break; } Pump.Pump(); } else if (dataSent) { Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(lastResponse.HasOption(OptionType.Observe)); Assert.AreEqual(observerNo, lastResponse.Observe); dataSent = false; lastResponse = null; if (count == 4) { relation.UpdateETags(new byte[][] { new byte[] { 1 }, new byte[] { 3 }, new byte[] { 5 }, new byte[] { 7 } }); count += 1; } else if (count == 8) { Assert.IsTrue(reregistered.WaitOne(20 * 1000)); count += 1; } if (count == 9) { count += 1; _resource.UpdateContent($"New string {count}"); observerNo += 1; count += 1; } else if (count < 12) { _resource.UpdateContent($"New string {count}"); count += 1; observerNo += 1; } else { break; } } } Assert.AreEqual(12, count); }
public void ObserveTest1() { CoapConfig clientConfig = new CoapConfig(); Pump = new MockMessagePump(); IEndPoint clientEndpoint = Pump.AddEndPoint("Client1", MockMessagePump.ClientAddress, clientConfig, new Type[] { typeof(ObserveLayer) }); clientEndpoint.Start(); CreateServer(); CoapClient coapClient = new CoapClient { EndPoint = clientEndpoint, Uri = new Uri($"coap://{MockMessagePump.ServerAddress}{_resource.Uri}"), Timeout = 0 }; Response lastResponse = null; int count = 1; _resource.UpdateContent($"First string {count-1}"); AutoResetEvent trigger = new AutoResetEvent(false); CoapObserveRelation relation = coapClient.ObserveAsync( (r) => { lastResponse = r; trigger.Set(); }); byte[] tokenBytes = relation.Request.Token; bool dataSent = false; while (true) { Thread.Sleep(1); if (Pump.Queue.Count > 0) { MockQueueItem item = Pump.Queue.Peek(); switch (item.ItemType) { case MockQueueItem.QueueType.NetworkSend: if (item.Request != null) { if (tokenBytes == null) { tokenBytes = relation.Request.Token; } Assert.IsTrue(item.Request.HasOption(OptionType.Observe)); Assert.AreEqual(0, item.Request.Observe); CollectionAssert.AreEqual(tokenBytes, item.Request.Token); } else if (item.Response != null) { Assert.IsTrue(item.Response.HasOption(OptionType.Observe)); Assert.AreEqual(count, item.Response.Observe); CollectionAssert.AreEqual(tokenBytes, item.Response.Token); dataSent = true; } else { Assert.Fail(); } break; } Pump.Pump(); } else if (dataSent) { Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(lastResponse.HasOption(OptionType.Observe)); Assert.AreEqual(count, lastResponse.Observe); dataSent = false; lastResponse = null; if (count < 5) { _resource.UpdateContent($"New string {count}"); count += 1; } else { break; } } } Assert.AreEqual(5, count); }
public void ObserveTest3() { CoapConfig clientConfig = new CoapConfig() { MaxRetransmit = 0 }; LogManager.Level = LogLevel.Debug; Pump = new MockMessagePump(); IEndPoint clientEndpoint = Pump.AddEndPoint("Client1", MockMessagePump.ClientAddress, clientConfig, new Type[] { typeof(ObserveLayer), typeof(TokenLayer), typeof(ReliabilityLayer) }); clientEndpoint.Start(); CreateServer(); _config.NonTimeout = 100; // Change this value up - at 10 it cleans up the NON before the RST has a chance to get back. CoapClient coapClient = new CoapClient { EndPoint = clientEndpoint, Uri = new Uri($"coap://{MockMessagePump.ServerAddress}{_resource.Uri}"), Timeout = 0 }; Response lastResponse = null; int count = 1; _resource.UpdateContent($"First string {count - 1}"); AutoResetEvent trigger = new AutoResetEvent(false); CoapObserveRelation relation = coapClient.ObserveAsync( (r) => { lastResponse = r; trigger.Set(); }); int emptyCount = 0; bool dataSent = false; byte[] tokenBytes = relation.Request.Token; while (true) { Thread.Sleep(1); if (Pump.Queue.Count > 0) { MockQueueItem item = Pump.Queue.Peek(); switch (item.ItemType) { case MockQueueItem.QueueType.NetworkSend: if (item.Request != null) { Debug.WriteLine($"Request: {item.Request}"); if (tokenBytes == null) { tokenBytes = relation.Request.Token; } Assert.IsTrue(item.Request.HasOption(OptionType.Observe)); Assert.AreEqual(0, item.Request.Observe); CollectionAssert.AreEqual(tokenBytes, item.Request.Token); } else if (item.Response != null) { Debug.WriteLine($"Response: {item.Response}"); Assert.IsTrue(item.Response.HasOption(OptionType.Observe)); Assert.AreEqual(count, item.Response.Observe); CollectionAssert.AreEqual(tokenBytes, item.Response.Token); dataSent = true; } else { Debug.WriteLine($"RST: {item.EmptyMessage}"); emptyCount += 1; dataSent = true; } break; } Pump.Pump(); } else if (dataSent) { dataSent = false; if (count >= 3) { Assert.IsNull(lastResponse); } else { Assert.IsTrue(trigger.WaitOne(10 * 1000)); Assert.IsNotNull(lastResponse); Assert.IsTrue(lastResponse.HasOption(OptionType.Observe)); Assert.AreEqual(count, lastResponse.Observe); lastResponse = null; } if (count < 5) { _resource.UpdateContent($"New string {count}"); count += 1; if (count == 3) { relation.ReactiveCancel(); } } else { break; } } else if (count == 5) { break; } else if (emptyCount != 0) { _resource.UpdateContent($"New string {count}"); count += 1; } } Assert.AreEqual(1, emptyCount); Assert.AreEqual(5, count); }
public void ObserveTest2() { CoapConfig clientConfig = new CoapConfig() { NotificationReregistrationBackoff = 0 }; Pump = new MockMessagePump(); IEndPoint clientEndpoint = Pump.AddEndPoint("Client1", MockMessagePump.ClientAddress, clientConfig, new Type[] { typeof(ObserveLayer) }); clientEndpoint.Start(); CreateServer(); CoapClient coapClient = new CoapClient { EndPoint = clientEndpoint, Uri = new Uri($"coap://{MockMessagePump.ServerAddress}{_resource.Uri}"), Timeout = 0 }; Response lastResponse = null; int count = 1; int clientObserveNo = 0; _resource.UpdateContent($"First string {count - 1}"); AutoResetEvent trigger = new AutoResetEvent(false); CoapObserveRelation relation = coapClient.ObserveAsync( (r) => { lastResponse = r; trigger.Set(); }); AutoResetEvent reregistered = new AutoResetEvent(false); relation.Request.Reregistering += (a, b) => { reregistered.Set(); }; bool dataSent = false; byte[] tokenBytes = relation.Request.Token; while (true) { Thread.Sleep(1); if (Pump.Queue.Count > 0) { MockQueueItem item = Pump.Queue.Peek(); switch (item.ItemType) { case MockQueueItem.QueueType.NetworkSend: if (item.Request != null) { if (tokenBytes == null) { tokenBytes = relation.Request.Token; } Assert.IsTrue(item.Request.HasOption(OptionType.Observe)); Assert.AreEqual(clientObserveNo, item.Request.Observe); CollectionAssert.AreEqual(tokenBytes, item.Request.Token); clientObserveNo += 1; } else if (item.Response != null) { if (count < 4) { Assert.IsTrue(item.Response.HasOption(OptionType.Observe)); Assert.AreEqual(count, item.Response.Observe); } else { // Assert.IsFalse(item.Response.HasOption(OptionType.Observe)); } CollectionAssert.AreEqual(tokenBytes, item.Response.Token); dataSent = true; } else { Assert.Fail(); } break; } Pump.Pump(); } else if (dataSent) { dataSent = false; if (count > 4) { Assert.IsNull(lastResponse); } else { Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsNotNull(lastResponse); if (count == 4) { Assert.IsFalse(lastResponse.HasOption(OptionType.Observe)); } else { Assert.IsTrue(lastResponse.HasOption(OptionType.Observe)); Assert.AreEqual(count, lastResponse.Observe); } lastResponse = null; } if (count < 5) { if (count == 3) { relation.ProactiveCancel(); _resource.UpdateContent($"New string {count}"); } else { _resource.UpdateContent($"New string {count}"); } count += 1; } else { break; } } else if (count == 5) { break; } } Assert.AreEqual(2, clientObserveNo); Assert.AreEqual(5, count); // Total # of seconds is MaxAge = 1 + backoff = 0 + random(2, 15) Assert.IsFalse(reregistered.WaitOne(17 * 1000)); }
public void Reregister() { Uri uri = new Uri($"coap://localhost:{_serverPort}/{target1}"); CoapClient client = new CoapClient(uri); AutoResetEvent trigger = new AutoResetEvent(false); Response nextResponse = null; int lastObserve = -1; _expected = "No Content Yet"; CoapObserveRelation obs1 = client.Observe(response => { nextResponse = response; trigger.Set(); }); Assert.IsFalse(obs1.Canceled); Assert.IsTrue(trigger.WaitOne(1000)); int oNumber = -1; for (int i = 0; i < 20; i++) { _expected = $"Content for {i}"; _resource.UpdateContent(_expected); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(_expected, nextResponse.ResponseText); Assert.IsTrue(nextResponse.HasOption(OptionType.Observe)); Assert.IsTrue(nextResponse.Observe.HasValue); oNumber = nextResponse.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; Console.WriteLine($"lastObserve = {lastObserve}, type = {nextResponse.Type}"); } Request request = Request.NewGet(); request.URI = uri; request.MarkObserve(); request.Token = nextResponse.Token; client.Send(request); for (int i = 0; i < 20; i++) { _expected = $"Content for {i}"; _resource.UpdateContent(_expected); Assert.IsTrue(trigger.WaitOne(1000)); Assert.IsTrue(Code.IsSuccess(nextResponse.Code)); Assert.AreEqual(_expected, nextResponse.ResponseText); Assert.IsTrue(nextResponse.HasOption(OptionType.Observe)); Assert.IsTrue(nextResponse.Observe.HasValue); oNumber = nextResponse.Observe.Value; Assert.IsTrue(oNumber > lastObserve); lastObserve = oNumber; Console.WriteLine($"lastObserve = {lastObserve}, type = {nextResponse.Type}"); } }
static void Main(string[] args) { Com.AugustCellars.CoAP.Log.LogManager.Level = LogLevel.None; ; String Server = "192.168.53.55:5684"; OneKey userKey = new OneKey(); userKey.Add(CoseKeyKeys.KeyType, GeneralValues.KeyType_Octet); //userKey.Add(CoseKeyParameterKeys.Octet_k, CBORObject.FromObject(Encoding.UTF8.GetBytes("sesame"))); // userKey.Add(CoseKeyKeys.KeyIdentifier, CBORObject.FromObject(Encoding.UTF8.GetBytes("password"))); CoapClient client = new CoapClient(new Uri($"coaps://{Server}/.well-known/core")); CoAPEndPoint ep = new DTLSClientEndPoint(userKey); client.EndPoint = ep; ep.Start(); // Response r1 = client.Get(); Console.WriteLine("Links = " + r1.PayloadString); // // string str = "<//15001/65536>;ct=0;obs,<//15001/65537>;ct=0;obs,<//15004/136834>;ct=0;obs,<//15005/136834/217609>;ct=0;obs,<//15005/136834/218326>;ct=0;obs,<//15005/136834/224384>;ct=0;obs,<//15005/136834>;ct=0;obs,<//15001>;ct=0;obs,<//15001/reset>;ct=0,<//status>;ct=0;obs,<//15005>;ct=0;obs,<//15004>;ct=0;obs,<//15004/add>;ct=0,<//15004/remove>;ct=0,<//15006>;ct=0;obs,<//15011/15012>;ct=0;obs,<//15011/9034>;ct=0,<//15011/9030>;ct=0,<//15011/9031>;ct=0,<//15011/9063>;ct=0,<//15011/9033>;ct=0,<//15010>;ct=0;obs"; // IEnumerable<WebLink> links = LinkFormat.Parse(str); // foreach(var item in links) Console.WriteLine(item); // LogManager.Level = LogLevel.None; IEnumerable <WebLink> items = client.Discover(); foreach (var node in items) { Console.WriteLine($"Resource = {node}"); client.UriPath = node.Uri; if (false && node.Attributes.Observable) { CoapClient c2 = new CoapClient() { EndPoint = client.EndPoint, Uri = client.Uri, UriPath = node.Uri }; Console.WriteLine("Observe it"); CoapObserveRelation relation1 = c2.Observe(r => { EventIn(node.Uri, r); }); } else { Response response = client.Get(); Console.WriteLine(" Payload: " + response.PayloadString); Console.WriteLine(); } } client.Uri = new Uri($"coaps://{Server}"); client.UriPath = "/15004/166412"; client.Get(); Response rep = client.Put("{ \"5850\":1}"); Thread.Sleep(3000); //rep = client.Get(); Console.WriteLine(rep.PayloadString); client.UriPath = "/15001/65537"; ; for (int i = 0; i < 10; i++) { Thread.Sleep(3000); client.Put("{ \"5851\":127}"); Thread.Sleep(3000); client.Put("{ \"3311\":[{ \"5851\":0}]}"); Thread.Sleep(3000); client.Put("{ \"3311\":[{ \"5851\":255}]}"); } ep.Stop(); }