#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 IOT MQTT. Соединения все еще активны, и он запущен и работает, подключен через хороший сигнал Wi-Fi к оптоволоконному Интернету. Устройство не может понять, что на стороне сервера происходит что-то неправильное.
Я также «предполагаю», что устройству необходимо отправить запрос, прежде чем сервер поймет, что он не активен, на основе интервала поддержания активности MQTT, но я не знаю, как это проверить.
Ответ №1:
Если вам нужно, чтобы устройство всегда получало полезную нагрузку от ядра Интернета вещей, даже если оно было отправлено, когда устройство не подключено / не отвечает, вам следует использовать конфигурацию вместо команды.
Конфигурация сохраняется в ядре IoT, поэтому в конечном итоге она будет доставлена на устройство, даже если оно не отвечало на запросы.
Конфигурация всегда отправляется на устройство при повторном подключении к ядру Интернета вещей, поэтому вы будете уверены, что устройство получит ее, даже если она была отправлена, когда устройство было отключено.
Нет никакой разницы между конфигурацией и командами, касающимися содержимого.
Это правда, что вы можете отправить только 1 конфигурацию / устройство / секунду, но в большинстве случаев этого достаточно.
Комментарии:
1. Вы также можете полагаться на команды, за исключением случая, когда происходит сбой отправки из-за того, что устройство не подключено к сети, а затем в коде, который отправляет команды, переключите и отправьте конфигурацию и приостановите попытку, пока устройство не сообщит, что оно снова подключено и получило конфигурацию, затем возобновите использование команд. Это даст вам примерно один раз в секунду, если по какой-то причине этого недостаточно.
Ответ №2:
Для обнаружения и реагирования, когда устройство подключается к сети и отключается:
- Создайте приемник в облачном протоколировании
- Поместите этот запрос в новый приемник:
resource.type="cloudiot_device" AND jsonPayload.eventType=("CONNECT" OR "DISCONNECT")
- Отправьте приемник в Pub / Sub
- Создайте облачную функцию
- Создайте Push-подписку из Pub / Sub для облачной функции
Затем вы можете обработать сообщение журнала в функции и действовать соответствующим образом:
- «Дружественное» устройство
ID
находится вlabels.device_id
- В
event type
jsonPayload.eventType