public Websocket()
        {
            Credentials = FetchCredentials();

            string requestUrl = Sigv4util.getSignedurl(Credentials);

            var factory = new MqttFactory();

            mqttClient = factory.CreateMqttClient();

            mqttClientOptions = new MqttClientOptionsBuilder().
                                WithWebSocketServer(requestUrl).
                                WithKeepAlivePeriod(TimeSpan.FromMinutes(10)).Build();
        }
        public static string getSignedurl(WebsocketCredentials credentials)
        {
            string requestUrl;

            try
            {
                var    requestDateTime = DateTime.UtcNow;
                string datetime        = requestDateTime.ToString(ISO8601BasicFormat, CultureInfo.InvariantCulture);
                var    date            = requestDateTime.ToString(DateStringFormat, CultureInfo.InvariantCulture);

                string method    = "GET";
                string protocol  = "wss";
                string uri       = "/mqtt";
                string service   = "iotdevicegateway";
                string algorithm = "AWS4-HMAC-SHA256";

                string credentialScope      = date + "/" + credentials.region + "/" + service + "/" + "aws4_request";
                string canonicalQuerystring = "X-Amz-Algorithm=" + algorithm;
                canonicalQuerystring += "&X-Amz-Credential=" + HttpHelper.UrlEncode(credentials.accessKey + '/' + credentialScope);

                canonicalQuerystring += "&X-Amz-Date=" + datetime;
                canonicalQuerystring += "&X-Amz-Expires=86400";
                canonicalQuerystring += "&X-Amz-SignedHeaders=host";

                string canonicalHeaders = "host:" + credentials.iotEndpoint + "\n";

                var canonicalRequest = method + "\n" + uri + "\n" + canonicalQuerystring + "\n" + canonicalHeaders + "\n" + "host" + "\n" + EmptyBodySha256;

                byte[] hashValueCanonicalRequest = CanonicalRequestHashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(canonicalRequest));

                var builder = new StringBuilder();

                for (int i = 0; i < hashValueCanonicalRequest.Length; i++)
                {
                    builder.Append(hashValueCanonicalRequest[i].ToString("x2"));
                }

                string byteString = builder.ToString();

                var stringToSign = algorithm + "\n" + datetime + "\n" + credentialScope + "\n" + byteString;

                // compute the signing key
                var keyedHashAlgorithm = KeyedHashAlgorithm.Create(HmacSha256);

                keyedHashAlgorithm.Key = getSignatureKey(credentials.secretKey, date, credentials.region, service);

                var signingKey = keyedHashAlgorithm.Key;

                var signature       = ComputeKeyedHash(HmacSha256, signingKey, Encoding.UTF8.GetBytes(stringToSign));
                var signatureString = ToHexString(signature, true);

                canonicalQuerystring += "&X-Amz-Signature=" + signatureString;
                canonicalQuerystring += "&X-Amz-Security-Token=" + HttpHelper.UrlEncode(credentials.sessionToken);

                requestUrl = protocol + "://" + credentials.iotEndpoint + uri + "?" + canonicalQuerystring;
            }

            catch (Exception e)
            {
                throw new Sigv4UtilException("Unable to get signed url", e);
            }


            return(requestUrl);
        }