public void CheckRegistriesLimit(string projectId, string regionId) { List <DeviceRegistry> listRegistries = (List <DeviceRegistry>)CloudIotMqttExample.GetRegistries(projectId, regionId); if (listRegistries != null && listRegistries.Count > 90) { //Clean 20 oldest registries with testing prefix in the project. Console.WriteLine("The maximum number of registries is about to exceed."); Console.WriteLine("Deleting the oldest 20 registries with IoT Test prefix"); var count = 20; var index = 0; while (count > 0) { if (listRegistries[index].Id.Contains("iot-test-")) { CloudIotSample.UnbindAllDevices(projectId, regionId, listRegistries[index].Id); CloudIotSample.ClearRegistry(projectId, regionId, listRegistries[index].Id); count--; } index++; } } }
// [END iot_detach_device] /// <summary> /// Listens for configuration and system error messages on the gateway and /// bound devices. /// </summary> // [START listen_for_config_messages] public static object ListenForConfigMessages(string projectId, string cloudRegion, string registryId, string deviceId, string gatewayId, int numMessages, string privateKeyFile, string algorithm, string caCerts, string mqttBridgeHostname, int mqttBridgePort, int jwtExpiresMinutes, int duration) { var clientId = $"projects/{projectId}/locations/{cloudRegion}/registries/{registryId}" + $"/devices/{gatewayId}"; var jwtIatTime = SystemClock.Instance.GetCurrentInstant(); // Create a duration Duration durationExp = Duration.FromMinutes(jwtExpiresMinutes); var jwtExpTime = SystemClock.Instance.GetCurrentInstant().Plus(durationExp); var pass = ""; if (algorithm == "RS256") { pass = CloudIotMqttExample.CreateJwtRsa(projectId, privateKeyFile); } else if (algorithm == "ES256") { Console.WriteLine("Currently, we do not support this algorithm."); return(0); } // Use gateway to connect server var mqttClient = GetClient( projectId, cloudRegion, registryId, gatewayId, caCerts, mqttBridgeHostname, mqttBridgePort); double initialConnectIntervalMillis = 0.5; double maxConnectIntervalMillis = 6; double maxConnectRetryTimeElapsedMillis = 900; double intervalMultiplier = 1.5; double retryIntervalMs = initialConnectIntervalMillis; double totalRetryTimeMs = 0; // Both connect and publish operations may fail. If they do, // allow retries but with an exponential backoff time period. while (!mqttClient.IsConnected && totalRetryTimeMs < maxConnectRetryTimeElapsedMillis) { try { // Connect to the Google MQTT bridge. mqttClient.Connect(clientId, "unused", pass); } catch (AggregateException aggExceps) { printExceptions(aggExceps); Console.WriteLine("Retrying in " + retryIntervalMs + " seconds."); System.Threading.Thread.Sleep((int)retryIntervalMs); totalRetryTimeMs += retryIntervalMs; retryIntervalMs *= intervalMultiplier; if (retryIntervalMs > maxConnectIntervalMillis) { retryIntervalMs = maxConnectIntervalMillis; } } } SetupMqttTopics(mqttClient, gatewayId); AttachDevice(mqttClient, deviceId, "{}"); // Wait for about a minute for config messages. Console.WriteLine("Listening..."); for (int i = 0; i < duration; ++i) { Console.Write("."); var secSinceIssue = SystemClock.Instance.GetCurrentInstant().Minus(jwtIatTime); if (secSinceIssue.TotalSeconds > (60 * jwtExpiresMinutes)) { Console.WriteLine("Refreshing token after {0}s", secSinceIssue); jwtIatTime = SystemClock.Instance.GetCurrentInstant(); // refresh token and reconnect. pass = CloudIotMqttExample.CreateJwtRsa(projectId, privateKeyFile); mqttClient = GetClient( projectId, cloudRegion, registryId, gatewayId, caCerts, mqttBridgeHostname, mqttBridgePort); } System.Threading.Thread.Sleep(1000); } DetachDevice(mqttClient, deviceId); // wait for the device get detached. System.Threading.Thread.Sleep(2000); mqttClient.Disconnect(); Console.WriteLine("Finished."); return(0); }
private void StartMqtt(string deviceId, string privateKeyPath) { CloudIotMqttExample.StartMqtt(_fixture.ProjectId, _fixture.RegionId, _fixture.RegistryId, deviceId, privateKeyPath, "RS256", _fixture.CertPath, 1, "events", "mqtt.googleapis.com", 443, 1, 20); }