Exemplo n.º 1
0
        /// <summary>
        /// Registers ourselves with IoTHub so we can send messages to it
        /// </summary>
        private void SelfRegisterWithIoTHub(string ownerConnectionString)
        {
            string[] parsedConnectionString = IoTHubRegistration.ParseConnectionString(ownerConnectionString, false);
            string   deviceConnectionString = string.Empty;

            if ((parsedConnectionString != null) && (parsedConnectionString.Length == 3))
            {
                string IoTHubName  = parsedConnectionString[0];
                string name        = parsedConnectionString[1];
                string accessToken = parsedConnectionString[2];

                using (HttpClient httpClient = new HttpClient())
                {
                    httpClient.BaseAddress = new UriBuilder {
                        Scheme = "https", Host = IoTHubName
                    }.Uri;

                    string sharedAccessSignature = IoTHubRegistration.GenerateSharedAccessToken(name, Convert.FromBase64String(accessToken), IoTHubName, 60000);
                    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("SharedAccessSignature", sharedAccessSignature);
                    deviceConnectionString = IoTHubRegistration.CreateDeviceInIoTHubDeviceRegistry(httpClient, m_configuration.ApplicationName.Replace(" ", "")).Result;

                    // prepend the rest of the connection string
                    deviceConnectionString = "HostName=" + IoTHubName + ";DeviceId=" + m_configuration.ApplicationName.Replace(" ", "") + ";SharedAccessKey=" + deviceConnectionString;
                    SecureIoTHubToken.Write(m_configuration.ApplicationName, deviceConnectionString);
                }
            }
            else
            {
                Trace("Opc.Ua.Publisher.Module: Could not parse IoT Hub owner connection string: " + ownerConnectionString);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Try to configure our Publisher settings
        /// </summary>
        public static async Task TryConfigurePublisherAsync()
        {
            // read connection string from secure store and configure publisher, if possible
            if ((m_configuration != null) && (!string.IsNullOrEmpty(m_configuration.ApplicationName)))
            {
                Trace("Opc.Ua.Publisher.Module: Attemping to read connection string from secure store with certificate name: " + m_configuration.ApplicationName);
                string connectionString = SecureIoTHubToken.Read(m_configuration.ApplicationName);
                if (!string.IsNullOrEmpty(connectionString))
                {
                    Trace("Opc.Ua.Publisher.Module: Attemping to configure publisher with connection string: " + connectionString);
                    string[] parsedConnectionString = IoTHubRegistration.ParseConnectionString(connectionString, true);
                    if ((parsedConnectionString != null) && (parsedConnectionString.Length == 3))
                    {
                        // note: IoTHub name can't be changed during runtime in the GW IoTHub module
                        string _IoTHubName = parsedConnectionString[0];
                        m_deviceName = parsedConnectionString[1];
                        m_accessKey  = parsedConnectionString[2];

                        Trace("Opc.Ua.Publisher.Module: Publisher configured for device: " + m_deviceName);

                        // try to connect to IoT Hub
                        using (HttpClient httpClient = new HttpClient())
                        {
                            httpClient.BaseAddress = new UriBuilder {
                                Scheme = "https", Host = _IoTHubName
                            }.Uri;

                            string sharedAccessToken = IoTHubRegistration.GenerateSharedAccessToken(string.Empty, Convert.FromBase64String(m_accessKey), _IoTHubName, 60000);
                            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("SharedAccessSignature", sharedAccessToken);

                            // send an empty d2c message
                            HttpRequestMessage  request  = new HttpRequestMessage(HttpMethod.Post, "/devices/" + m_deviceName + "/messages/events" + IoTHubRegistration._IoTHubAPIVersion);
                            HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);

                            if (response.StatusCode != HttpStatusCode.NoContent)
                            {
                                throw new Exception("Opc.Ua.Publisher.Module: Could not connect to IoT Hub. Response: " + response.ToString());
                            }
                        }
                    }
                    else
                    {
                        throw new Exception("Opc.Ua.Publisher.Module: Publisher configuration failed!");
                    }
                }
                else
                {
                    Trace("Opc.Ua.Publisher.Module: Connection string not found in secure store.");
                }
            }
        }