public override Task <RoutingResponse> EnqueueControlMessage(ControlMessage request, ServerCallContext context)
        {
            RoutingResponse response;

            using (this.m_duration.NewTimer()) {
                this.m_logger.LogDebug("Received egress routing request for sensor {sensorId}.", request.SensorID);

                try {
                    var dto = ControlMessageProtobufConverter.Convert(request);

                    this.m_requests.Inc();
                    this.m_queue.Add(dto);

                    response = new RoutingResponse {
                        Count      = 1,
                        Message    = "Messages queued.",
                        ResponseID = ByteString.CopyFrom(Guid.NewGuid().ToByteArray())
                    };
                } catch (FormatException ex) {
                    this.m_logger.LogWarning("Received messages from an invalid sensor. Exception: {exception}", ex);

                    response = new RoutingResponse {
                        Count      = 0,
                        Message    = "Messages not queued. Invalid sensor ID.",
                        ResponseID = ByteString.CopyFrom(Guid.NewGuid().ToByteArray())
                    };
                }
            }

            return(Task.FromResult(response));
        }
        public void EnqueueControlMessageToTarget(IPlatformMessage message, RoutingTarget target)
        {
            this.m_liveDataLock.Lock();

            try {
                this.m_controlMessageQueues[target.Target].Messages.Add(ControlMessageProtobufConverter.Convert(message as ControlMessage));
                this.m_gaugeLiveDataService.Inc();
            } finally {
                this.m_liveDataLock.Unlock();
            }
        }
        public async Task <IActionResult> EnqueueControlMessageAsync([FromBody] ActuatorMessage message)
        {
            var response = new Response <GatewayResponse>();

            if (!ObjectId.TryParse(message.SensorId, out var id))
            {
                response.AddError("Invalid sensor ID.");
                return(this.BadRequest(response));
            }

            var sensor = await this.m_sensors.GetAsync(id).ConfigureAwait(false);

            var auth = await this.AuthenticateUserForSensor(sensor, false).ConfigureAwait(false);

            if (!auth)
            {
                response.AddError($"Sensor {message.SensorId} is not authorized for user {this.m_currentUserId}");
                return(this.Unauthorized(response));
            }

            var controlMessage = new Data.DTO.ControlMessage {
                Data              = message.Data,
                Destination       = ControlMessageType.Mqtt,
                PlatformTimestamp = DateTime.UtcNow,
                Timestamp         = DateTime.UtcNow,
                Secret            = sensor.Secret,
                SensorId          = id
            };

            var json = JsonConvert.SerializeObject(controlMessage);

            this.m_auth.SignControlMessage(controlMessage, json);

            await this.m_client.RouteAsync(ControlMessageProtobufConverter.Convert(controlMessage), CancellationToken.None)
            .ConfigureAwait(false);

            response.Data = new GatewayResponse {
                Message = "Control message received and queued.",
                Queued  = 1
            };

            return(this.Ok(response));
        }