// ReSharper disable UnusedAutoPropertyAccessor.Global using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using CommandLine; using Google.Protobuf.WellKnownTypes; using Grpc.Net.Client; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NucuCarSensorsProto; namespace NucuCar.TestClient.Sensors { public class SensorsCmd { [Verb("sensors", HelpText = "Test the gRPC sensors services.")] public class SensorsCmdOptions { [Option('u', "url", Required = false, HelpText = "The url and port of the gRPC server.", Default = "https://localhost:8000")] public string GrpcServiceAddress { get; set; } } public string GrpcServiceAddress { get; set; } private static ILogger _logger; public static async Task RunSensorsTestCommand(SensorsCmdOptions options) { _logger = LoggerFactory.Create(builder => { builder.AddConsole(); }).CreateLogger(); var sensorsCommandLine = new SensorsCmd(); sensorsCommandLine.GrpcServiceAddress = options.GrpcServiceAddress; await sensorsCommandLine.EnvironmentSensorGrpcServiceTest(); } public async Task EnvironmentSensorGrpcServiceTest() { // Used to allow gRPC calls over unsecured HTTP. AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); // Allow untrusted certificates. var httpClientHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }; var httpClient = new HttpClient(httpClientHandler); var channel = GrpcChannel.ForAddress(GrpcServiceAddress, new GrpcChannelOptions {HttpClient = httpClient}); var client = new EnvironmentSensorGrpcService.EnvironmentSensorGrpcServiceClient(channel); var cts = new CancellationTokenSource(); Console.CancelKeyPress += (s, e) => { e.Cancel = true; cts.Cancel(); Console.WriteLine("Shutting down..."); }; while (true) { if (cts.Token.IsCancellationRequested) { break; } await Task.Delay(1000); var reply = await client.GetStateAsync(new Empty()); var state = reply.State; _logger.LogInformation("EnvironmentSensorState: " + state); if (state != SensorStateEnum.Initialized) continue; var measurementJson = await client.GetMeasurementAsync(new Empty()); _logger.LogInformation(measurementJson.JsonData); } } } }