public static async Task <HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
        {
            dynamic data = await req.Content.ReadAsAsync <object>(); // Get request body

            TtnEntity ttn = JsonConvert.DeserializeObject <TtnEntity>(data.ToString(), new JsonSerializerSettings()
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            });

            if (!ValidTtnApplicationId(ttn.app_id))
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest));
            }

            var result = DecodeRawData(ttn.payload_raw);

            string key = await GetDeviceKeyFromRegistry(ttn.hardware_serial); // get device key from IoT Hub Registry

            if (key == null)
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest));
            }

            await PostDataToIoTHub(host, key, result, ttn);

            log.Info($"device '{ttn.hardware_serial}', payload '{result}', port: {ttn.port}");

            return(req.CreateResponse(HttpStatusCode.OK));
        }
        public static async Task <bool> PostDataToIoTHub(string host, string key, string payload, TtnEntity ttn)
        {
            string restUri  = $"https://{host}/devices/{ttn.hardware_serial}/messages/events?api-version={iotHubApiVersion}";
            var    sasToken = GetDeviceSaSToken(host, ttn.hardware_serial, key);

            HttpClient client = new HttpClient();

            client.DefaultRequestHeaders.Add("Authorization", sasToken);
            client.DefaultRequestHeaders.Add("iothub-app-route-id", "ttn-" + ttn.app_id);

            var content  = new StringContent(telemetry.ToJson(payload, ttn.port));
            var response = await client.PostAsync(restUri, content);

            return(true);
        }