internal async Task SendCommandAsync(IMessage m) { var bytes = new byte[(m.CalculateSize())]; var stream = new CodedOutputStream(bytes); m.WriteTo(stream); var chunker = new PacketChunker(mtu); //var all = chunker.Chunks(bytes).Select(x => characteristic.WriteValueAsync(x.AsBuffer(), GattWriteOption.WriteWithResponse).AsTask()); //await Task.WhenAll(all); foreach (var c in chunker.Chunks(bytes)) { try { Log.Information("Sending packet"); await characteristic.WriteValueAsync(c.AsBuffer(), GattWriteOption.WriteWithResponse); } catch (Exception e) { Log.Error(e, ""); throw; } } //await characteristic.WriteValueAsync(bytes.AsBuffer(), GattWriteOption.WriteWithResponse); Log.Information("Sent all packets"); }
public void Chunks_bytes_into_multiples_of_mtu_size() { byte[] total = Enumerable.Range(0, 200).Select(x => (byte)x).ToArray(); var chunks = new PacketChunker(20).Chunks(total); chunks.Should().HaveCountGreaterOrEqualTo(10); }
public void Appends_EOM_packet() { byte[] total = Enumerable.Range(0, 10).Select(x => (byte)x).ToArray(); var chunks = new PacketChunker(20).Chunks(total).ToArray(); chunks.Should().HaveCount(2); chunks[1].Should().BeEquivalentTo("EOM"); }
public void Chunks_bytes_with_correct_content() { byte[] total = Enumerable.Range(0, 200).Select(x => (byte)x).ToArray(); var chunks = new PacketChunker(20).Chunks(total).ToArray(); chunks[0].Should().BeEquivalentTo(Enumerable.Range(0, 20)); chunks[1].Should().BeEquivalentTo(Enumerable.Range(20, 20)); chunks[2].Should().BeEquivalentTo(Enumerable.Range(40, 20)); chunks[3].Should().BeEquivalentTo(Enumerable.Range(60, 20)); chunks[4].Should().BeEquivalentTo(Enumerable.Range(80, 20)); }
public void Builds_multiples_into_one_buffer() { var total = Enumerable.Range(0, 200).Select(x => (byte)x).ToArray(); var chunks = new PacketChunker(20).Chunks(total); chunks = chunks.Take(chunks.Count() - 1); foreach (var block in chunks) { sut.AddBlock(block); } var fullPacket = sut.GetCompletedPacket(); fullPacket.Should().BeEquivalentTo(total); }