Google IOT: определение того, что устройство снова подключено к сети после сбоя sendCommandtoDevice

#node.js #google-cloud-platform #iot

#node.js #google-облачная платформа #iot

Вопрос:

Следуя этому руководству, отправляйте команды на устройства.

 // const cloudRegion = 'us-central1';
// const deviceId = 'my-device';
// const commandMessage = 'message for device';
// const projectId = 'adjective-noun-123';
// const registryId = 'my-registry';
const iot = require('@google-cloud/iot');
const iotClient = new iot.v1.DeviceManagerClient({
  // optional auth parameters.
});

const formattedName = iotClient.devicePath(
  projectId,
  cloudRegion,
  registryId,
  deviceId
);
const binaryData = Buffer.from(commandMessage);
const request = {
  name: formattedName,
  binaryData: binaryData,
};

try {
  const responses = await iotClient.sendCommandToDevice(request);

  console.log('Sent command: ', responses[0]);
} catch (err) {
  console.error('Could not send command:', err);
}
  

У меня есть эта функция, запущенная в облачной функции Google (спасибо Firebase, я люблю тебя), отправляющая команду на устройства Google IoT, созданные Mongoose OS Google IoT Core framework.

Большую часть времени он работает так, как ожидалось. Теперь я пытаюсь улучшить систему, когда устройство не отвечает.

По многим причинам устройство может временно потерять подключение и, как следствие, потерять команду (см. Изображение ниже):

Скриншот журнала функций Google Cloud с ошибкой quot;Ошибка: 9 FAILED_PRECONDITIONquot; Устройство не подключеноquot;.

В этом случае устройство было недоступно на мгновение (например, плохой сигнал мобильного интернета или проблемы с интернет-маршрутом, в любом случае).

Могу ли я каким-то образом запустить функцию, когда устройство снова подключено и доступно?

Моя цель состоит в том, чтобы, если пользователь отправил команду на устройство, когда устройство не отвечает, я хотел бы автоматически отправить команду снова. Угадайте, что может произойти, если пользователю потребуется выключить двигатель, а устройство потеряет команду?

Но имейте в виду, что устройство не «отключено» от сервера Google IOT MQTT. Соединения все еще активны, и он запущен и работает, подключен через хороший сигнал Wi-Fi к оптоволоконному Интернету. Устройство не может понять, что на стороне сервера происходит что-то неправильное.

Я также «предполагаю», что устройству необходимо отправить запрос, прежде чем сервер поймет, что он не активен, на основе интервала поддержания активности MQTT, но я не знаю, как это проверить.

Ответ №1:

Если вам нужно, чтобы устройство всегда получало полезную нагрузку от ядра Интернета вещей, даже если оно было отправлено, когда устройство не подключено / не отвечает, вам следует использовать конфигурацию вместо команды.

Конфигурация сохраняется в ядре IoT, поэтому в конечном итоге она будет доставлена на устройство, даже если оно не отвечало на запросы.

Конфигурация всегда отправляется на устройство при повторном подключении к ядру Интернета вещей, поэтому вы будете уверены, что устройство получит ее, даже если она была отправлена, когда устройство было отключено.

Нет никакой разницы между конфигурацией и командами, касающимися содержимого.

Это правда, что вы можете отправить только 1 конфигурацию / устройство / секунду, но в большинстве случаев этого достаточно.

Комментарии:

1. Вы также можете полагаться на команды, за исключением случая, когда происходит сбой отправки из-за того, что устройство не подключено к сети, а затем в коде, который отправляет команды, переключите и отправьте конфигурацию и приостановите попытку, пока устройство не сообщит, что оно снова подключено и получило конфигурацию, затем возобновите использование команд. Это даст вам примерно один раз в секунду, если по какой-то причине этого недостаточно.

Ответ №2:

Для обнаружения и реагирования, когда устройство подключается к сети и отключается:

  1. Создайте приемник в облачном протоколировании
  2. Поместите этот запрос в новый приемник: resource.type="cloudiot_device" AND jsonPayload.eventType=("CONNECT" OR "DISCONNECT")
  3. Отправьте приемник в Pub / Sub
  4. Создайте облачную функцию
  5. Создайте Push-подписку из Pub / Sub для облачной функции

Затем вы можете обработать сообщение журнала в функции и действовать соответствующим образом:

  • «Дружественное» устройство ID находится в labels.device_id
  • В event type jsonPayload.eventType