Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применяется к:
1.4
Это важно
Поддерживаются выпуски IoT Edge 1.5 LTS и IoT Edge 1.4. Если вы находитесь в более ранней версии, см. статью Update IoT Edge.
Разверните модуль SQL Server для хранения данных на устройстве под управлением Azure IoT Edge с контейнерами Linux.
Используйте Azure IoT Edge и SQL Server для хранения и запроса данных на границе. Azure IoT Edge имеет базовые возможности хранилища для кэширования сообщений, если устройство переходит в автономный режим, а затем перенаправляйте их при повторном подключении. Однако может потребоваться более расширенные возможности хранилища, например возможность локального запроса данных. Устройства IoT Edge могут использовать локальные базы данных для выполнения более сложных вычислений без необходимости поддерживать подключение к Центру Интернета вещей.
В этой статье приведены инструкции по развертыванию базы данных SQL Server на устройстве IoT Edge. Функции Azure, работающие на устройстве IoT Edge, структурирует входящие данные, а затем отправляет их в базу данных. Действия, описанные в этой статье, также можно применить к другим базам данных, работающим в контейнерах, таких как MySQL или PostgreSQL.
В этом руководстве вы узнаете, как:
- Создание функции Azure с помощью Visual Studio Code
- Развертывание базы данных SQL на устройстве IoT Edge
- Использование Visual Studio Code для создания модулей и их развертывания на устройстве IoT Edge
- Просмотр созданных данных
Если у вас нет аккаунта Azure, создайте бесплатную учетную запись перед началом.
Предпосылки
Прежде чем приступить к работе с этим руководством, необходимо выполнить инструкции по настройке среды разработки для контейнеров Linux: разработка модулей Azure IoT Edge с помощью Visual Studio Code. Выполнив это руководство, необходимо иметь следующие предварительные требования:
- Бесплатный или стандартный Центр Интернета вещей в Azure.
- Устройство AMD64 под управлением Azure IoT Edge с контейнерами Linux. С помощью кратких руководств можно настроить устройство Linux или устройство Windows.
- Устройства ARM, такие как Raspberry Pis, не могут запускать SQL Server. Если вы хотите использовать SQL на устройстве ARM, вы можете использовать Azure SQL Edge.
- Реестр контейнеров, например Реестр контейнеров Azure.
- Visual Studio Code , настроенный с помощью расширений Azure IoT Edge и Центра Интернета вещей Azure . Средства Azure IoT Edge для расширения Visual Studio Code в режиме обслуживания.
- Скачайте и установите совместимую систему управления контейнерами Docker на компьютере разработки. Настройте его для запуска контейнеров Linux.
В этом руководстве используется модуль Функций Azure для отправки данных в SQL Server. Чтобы разработать модуль IoT Edge с помощью Функций Azure, установите следующие дополнительные предварительные требования на компьютере разработки:
- Расширение C# для Visual Studio Code (на платформе OmniSharp) для Visual Studio Code.
- Пакет SDK для .NET Core.
Создание проекта функции
Для отправки данных в базу данных требуется модуль, который может правильно структурировать данные, а затем хранить их в таблице.
Создание проекта
Ниже показано, как создать функцию IoT Edge с помощью Visual Studio Code и расширения Azure IoT Edge.
Откройте Visual Studio Code.
Откройте палитру команд Visual Studio Code, выбравпалитру командView>.
В палитре команд введите и запустите команду Azure IoT Edge: новое решение IoT Edge. В палитре команд укажите следующие сведения для создания решения:
Поле Ценность Выбор папки Выберите расположение на компьютере разработки для Visual Studio Code, чтобы создать файлы решения. Укажите имя решения Введите описательное имя решения, например SqlSolution, или примите значение по умолчанию. Выбор шаблона модуля Выберите Функции Azure — C#. Укажите имя модуля Присвойте модулю имя sqlFunction. Предоставление репозитория образов Docker для модуля Репозиторий образов содержит имя реестра контейнеров и имя образа контейнера. Образ контейнера предварительно заполнен на последнем шаге. Замените localhost:5000 значением сервера входа из реестра контейнеров Azure. Сервер входа можно получить на странице обзора реестра контейнеров на портале Azure.
Последняя строка выглядит как <имя> реестра.azurecr.io/sqlfunction.Окно Visual Studio Code загружает рабочую область решения IoT Edge.
Добавление учетных данных реестра
Файл среды хранит учетные данные для реестра контейнеров и предоставляет им общий доступ к среде выполнения IoT Edge. Среда выполнения должна получить эти учетные данные для извлечения частных образов на устройство IoT Edge.
Расширение IoT Edge пытается извлечь учетные данные реестра контейнеров из Azure и заполняет их в файле среды. Проверьте, включены ли учетные данные. Если нет, добавьте их сейчас:
- В обозревателе Visual Studio Code откройте env-файл.
- Обновите поля с значениями имени пользователя и пароля , скопированными из реестра контейнеров Azure.
- Сохраните этот файл.
Замечание
В этом руководстве используются учетные данные для входа администратора для реестра контейнеров Azure, которые удобны для сценариев разработки и тестирования. Когда вы будете готовы к рабочим сценариям, рекомендуется использовать вариант проверки подлинности с минимальными привилегиями, например субъекты-службы. Дополнительные сведения см. в разделе "Управление доступом к реестру контейнеров".
Выбор целевой архитектуры
Необходимо выбрать архитектуру, предназначенную для каждого решения, так как контейнер создается и выполняется по-разному для каждого типа архитектуры. По умолчанию используется Linux AMD64.
Откройте палитру команд и найдите Azure IoT Edge: задайте целевую платформу по умолчанию для решения Edge или щелкните значок ярлыка в боковой строке в нижней части окна.
В палитре команд выберите целевую архитектуру из списка параметров. В этом руководстве мы используем виртуальную машину Ubuntu в качестве устройства IoT Edge, поэтому будет хранить amd64 по умолчанию.
Обновление модуля с помощью пользовательского кода
В обозревателе Visual Studio Code откройте модули>sqlFunction>sqlFunction.csproj.
Найдите группу ссылок на пакеты и добавьте новую, чтобы включить SqlClient.
<PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>Сохраните файл sqlFunction.csproj .
Откройте файл sqlFunction.cs .
Замените все содержимое файла следующим кодом:
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.Azure.Devices.Client; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.EdgeHub; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Sql = System.Data.SqlClient; namespace Functions.Samples { public static class sqlFunction { [FunctionName("sqlFunction")] public static async Task FilterMessageAndSendMessage( [EdgeHubTrigger("input1")] Message messageReceived, [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output, ILogger logger) { const int temperatureThreshold = 20; byte[] messageBytes = messageReceived.GetBytes(); var messageString = System.Text.Encoding.UTF8.GetString(messageBytes); if (!string.IsNullOrEmpty(messageString)) { logger.LogInformation("Info: Received one non-empty message"); // Get the body of the message and deserialize it. var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString); //Store the data in SQL db const string str = "<sql connection string>"; using (Sql.SqlConnection conn = new Sql.SqlConnection(str)) { conn.Open(); var insertMachineTemperature = "INSERT INTO MeasurementsDB.dbo.TemperatureMeasurements VALUES (CONVERT(DATETIME2,'" + messageBody.timeCreated + "', 127), 'machine', " + messageBody.machine.temperature + ");"; var insertAmbientTemperature = "INSERT INTO MeasurementsDB.dbo.TemperatureMeasurements VALUES (CONVERT(DATETIME2,'" + messageBody.timeCreated + "', 127), 'ambient', " + messageBody.ambient.temperature + ");"; using (Sql.SqlCommand cmd = new Sql.SqlCommand(insertMachineTemperature + "\n" + insertAmbientTemperature, conn)) { //Execute the command and log the # rows affected. var rows = await cmd.ExecuteNonQueryAsync(); logger.LogInformation($"{rows} rows were updated"); } } if (messageBody != null && messageBody.machine.temperature > temperatureThreshold) { // Send the message to the output as the temperature value is greater than the threshold. using (var filteredMessage = new Message(messageBytes)) { // Copy the properties of the original message into the new Message object. foreach (KeyValuePair<string, string> prop in messageReceived.Properties) {filteredMessage.Properties.Add(prop.Key, prop.Value);} // Add a new property to the message to indicate it is an alert. filteredMessage.Properties.Add("MessageType", "Alert"); // Send the message. await output.AddAsync(filteredMessage); logger.LogInformation("Info: Received and transferred a message with temperature above the threshold"); } } } } } //Define the expected schema for the body of incoming messages. class MessageBody { public Machine machine {get; set;} public Ambient ambient {get; set;} public string timeCreated {get; set;} } class Machine { public double temperature {get; set;} public double pressure {get; set;} } class Ambient { public double temperature {get; set;} public int humidity {get; set;} } }В строке 35 замените строку подключения sql строкой<> на следующую строку. Свойство Источника данных ссылается на контейнер SQL Server, который еще не существует. Вы создадите его с именем SQL в следующем разделе. Выберите надежный пароль для ключевого слова password .
Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=<YOUR-STRONG-PASSWORD>;TrustServerCertificate=False;Connection Timeout=30;Сохраните файл sqlFunction.cs .
Добавление контейнера SQL Server
Манифест развертывания объявляет, какие модули среды выполнения IoT Edge будут устанавливаться на устройстве IoT Edge. Вы предоставили код для создания настраиваемого модуля функции в предыдущем разделе, но модуль SQL Server уже создан и доступен в реестре артефактов Майкрософт. Вам просто нужно сообщить среде выполнения IoT Edge включить его, а затем настроить его на устройстве.
В Visual Studio Code откройте палитру команд, выбравпалитру командview>.
В палитре команд введите и запустите команду Azure IoT Edge: добавьте модуль IoT Edge. В палитре команд укажите следующие сведения, чтобы добавить новый модуль:
Поле Ценность Выбор файла шаблона развертывания Палитра команд выделяет файлdeployment.template.json в текущей папке решения. Выберите этот файл. Выбор шаблона модуля Выберите существующий модуль (введите URL-адрес полного образа). Укажите имя модуля Введите sql. Это имя соответствует имени контейнера, объявленному в строке подключения в файле sqlFunction.cs. Предоставление образа Docker для модуля Введите следующий URI, чтобы извлечь образ контейнера SQL Server из реестра артефактов Майкрософт. Для образов на основе Ubuntu используйте mcr.microsoft.com/mssql/server:latest. Для образов на основе Red Hat Enterprise Linux (RHEL) используйтеmcr.microsoft.com/mssql/rhel/server:latest.Образ контейнера SQL Azure SQL Edge — это упрощенная контейнерная версия SQL Server, которая может работать на устройствах IoT Edge. Он оптимизирован для пограничных сценариев и может работать на устройствах ARM и AMD64.
В папке решения откройте файл deployment.template.json .
Найдите раздел модулей . Вы увидите три модуля. Модуль SimulatedTemperatureSensor включен по умолчанию в новые решения и предоставляет тестовые данные для использования с другими модулями. Модуль sqlFunction — это модуль, который вы изначально создали и обновили с помощью нового кода. Наконец, модуль sql был импортирован из реестра артефактов Майкрософт.
Подсказка
Модуль SQL Server поставляется с набором паролей по умолчанию в переменных среды манифеста развертывания. При создании контейнера SQL Server в рабочей среде необходимо изменить пароль системного администратора по умолчанию.
Закройте файл deployment.template.json .
Создание решения IoT Edge
В предыдущих разделах вы создали решение с одним модулем, а затем добавили другой в шаблон манифеста развертывания. Модуль SQL Server размещается в общедоступной среде Майкрософт, но необходимо контейнеризировать код в модуле "Функции". В этом разделе описано, как создать решение, создать образы контейнеров для модуля sqlFunction и отправить образ в реестр контейнеров.
В Visual Studio Code откройте интегрированный терминал, выбрав "Просмотреть>терминал".
Войдите в реестр контейнеров в Visual Studio Code, чтобы отправить образы в реестр. Используйте те же учетные данные реестра контейнеров Azure (ACR), которые вы добавили в env-файл. Введите следующую команду в интегрированном терминале:
docker login -u <ACR username> -p <ACR password> <ACR login server>Может появиться предупреждение системы безопасности, рекомендуемое использовать параметр --password-stdin. Хотя его использование выходит за рамки этой статьи, рекомендуется следовать этой рекомендации. Дополнительные сведения см. в справочнике по команде входа Docker .
В обозревателе Visual Studio Code щелкните правой кнопкой мыши файл deployment.template.json и выберите команду "Сборка и отправка решения IoT Edge".
Команда сборки и отправки запускает три операции. Во-первых, он создает новую папку в решении с именем config , которая содержит полный манифест развертывания, который создается из сведений в шаблоне развертывания и других файлах решения. Во-вторых, он выполняется
docker buildдля создания образа контейнера на основе соответствующего файла dockerfile для целевой архитектуры. Затем он запускаетсяdocker pushдля отправки репозитория образов в реестр контейнеров.Этот процесс может занять несколько минут в первый раз, но быстрее при следующем выполнении команд.
Вы можете убедиться, что модуль sqlFunction успешно отправлен в реестр контейнеров. На портале Azure перейдите в реестр контейнеров. Выберите репозитории и найдите sqlFunction. Другие два модуля , SimulatedTemperatureSensor и sql, не будут отправлены в реестр контейнеров, так как их репозитории уже находятся в реестрах Майкрософт.
Развертывание решения на устройстве
Модули можно задать на устройстве через Центр Интернета вещей, но вы также можете получить доступ к Центру Интернета вещей и устройствам с помощью Visual Studio Code. В этом разделе описано, как настроить доступ к Центру Интернета вещей, а затем использовать Visual Studio Code для развертывания решения на устройстве IoT Edge.
В обозревателе Visual Studio Code в разделе " Центр Интернета вещей Azure " разверните узел "Устройства ", чтобы просмотреть список устройств Интернета вещей.
Щелкните правой кнопкой мыши устройство, которое вы хотите нацелить на развертывание, и выберите "Создать развертывание для одного устройства".
Выберите файлdeployment.amd64.json в папке конфигурации и выберите манифест развертывания Edge. Не используйте файл deployment.template.json.
На устройстве разверните модули , чтобы просмотреть список развернутых и запущенных модулей. Нажмите кнопку обновления. Вы должны увидеть новые модули SQL и sqlFunction , работающие вместе с модулем SimulatedTemperatureSensor , $edgeAgent и $edgeHub.
Вы также можете проверить, что все модули запущены и запущены на устройстве. На устройстве IoT Edge выполните следующую команду, чтобы просмотреть состояние модулей.
iotedge listДля запуска модулей может потребоваться несколько минут. Среда выполнения IoT Edge должна получить новый манифест развертывания, извлечь образы модулей из среды выполнения контейнера, а затем запустить каждый новый модуль.
Создание базы данных SQL
При применении манифеста развертывания к устройству вы получите три модуля. Модуль SimulatedTemperatureSensor создает имитированные данные среды. Модуль sqlFunction принимает данные и форматирует его для базы данных. В этом разделе описано, как настроить базу данных SQL для хранения данных температуры.
Выполните следующие команды на устройстве IoT Edge. Эти команды подключаются к модулю SQL , работающему на устройстве, и создают базу данных и таблицу для хранения данных температуры, отправляемых в него. Замените <YOUR-STRONG-PASSWORD> надежным паролем, выбранным в строке подключения.
В средстве командной строки на устройстве IoT Edge подключитесь к базе данных.
sudo docker exec -it sql bashОткройте средство команды SQL.
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YOUR-STRONG-PASSWORD>'Создайте базу данных:
CREATE DATABASE MeasurementsDB ON (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf') GOОпределите таблицу.
CREATE TABLE MeasurementsDB.dbo.TemperatureMeasurements (measurementTime DATETIME2, location NVARCHAR(50), temperature FLOAT) GO
Вы можете настроить файл docker SQL Server для автоматической настройки SQL Server для развертывания на нескольких устройствах IoT Edge. Дополнительные сведения см. в демонстрационном проекте контейнера Microsoft SQL Server.
Просмотр локальных данных
После создания таблицы модуль sqlFunction начинает хранить данные в локальной базе данных SQL Server 2017 на устройстве IoT Edge.
В средстве команд SQL выполните следующую команду, чтобы просмотреть отформатированные данные таблицы:
SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO
Очистите ресурсы
Если вы планируете продолжить работу со следующей рекомендуемой статьей, вы можете сохранить созданные ресурсы и конфигурации и повторно использовать их. Вы также можете использовать то же устройство IoT Edge, что и тестовое устройство.
В противном случае можно удалить локальные конфигурации и ресурсы Azure, созданные в этой статье, чтобы избежать расходов.
Удаление ресурсов Azure
Удаление ресурсов и групп ресурсов Azure необратимо. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если вы создали Центр Интернета вещей в существующей группе ресурсов, имеющей ресурсы, которые требуется сохранить, удалите только сам ресурс Центра Интернета вещей, а не группу ресурсов.
Чтобы удалить ресурсы, выполните следующие действия.
Войдите на портал Azure и выберите группы ресурсов.
Выберите имя группы ресурсов, содержащей тестовые ресурсы IoT Edge.
Просмотрите список ресурсов, содержащихся в группе ресурсов. Если вы хотите удалить все из них, можно выбрать команду "Удалить группу ресурсов". Если вы хотите удалить только некоторые из них, можно щелкнуть каждый ресурс, чтобы удалить их по отдельности.
В этом руководстве вы создали модуль Функций Azure, содержащий код для фильтрации необработанных данных, созданных устройством IoT Edge. Когда вы будете готовы к созданию собственных модулей, вы можете узнать больше о том, как разрабатывать модули Azure IoT Edge с помощью Visual Studio Code.
Дальнейшие шаги
Если вы хотите попробовать другой метод хранения на границе, ознакомьтесь с тем, как использовать хранилище BLOB-объектов Azure в IoT Edge.