Skip to main content

创建一个基于Linux的产线设备应用

分类:  Azure物联网 标签:  #Azure #IoT Hub # #入门 #指南 发布于: 2023-06-13 22:37:47

我们前面创建了一个基于Windows Service的设备应用,这个应用的架构是可以直接用在产线上的结构,我们本节还是使用同样的程序结构。我们借助LinuxSystemd来管理设备应用。

我们还是先创建我们的基本应用:

dotnet new worker -o IoTDeviceOnLinuxService
cd  IoTDeviceOnLinuxService
dotnet add package Microsoft.Azure.Devices.Client
code .

我们最后一步是使用VS Code打开项目目录,打开该目录之后,创建如下几个文件:

  • ExceptionHelper.cs
  • CustomRetryPolicy.cs
  • DeviceService.cs

关于这三个文件的内容,和之前基本一样, 详细的代码介绍,就不用展开了,大家可以自行参考我们的代码。

注意
本节的实例代码,您可以参考:https://github.com/hylinux/azure-iot-hub-examples/tree/main/IoTDeviceOnLinuxService

需要注意的是,我们的Programcs内容:

using IoTDeviceOnLinuxService;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;


IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<DeviceService>();
    })
    .Build();

await host.RunAsync();

如果是在windows上开发,建议大家使用Security Manager来管理机密信息:

dotnet user-secrets init
dotnet user-secrets set "Device:ConnectionString:Primary" "主要连接字符串"
dotnet user-secrets set "Device:ConnectionString:Secondary" "次要连接字符串"
dotnet user-secrets set "Device:Connection:TransportType" "mqtt/amqp/etc"
$env:DOTNET_ENVIRONMENT = "Development"

上述也表面我们需要为应用定义如下几个环境变量:

  • Device__ConnectionString__Primary
  • Device__ConnectionString__Secondary
  • Device__Connection__TransportType

为了在Linux上创建一个通过systemd管理的服务,我们创建一个新的service文件:iotapp.service,内容如下:

[Unit]
Description=IoT App Service On Linux

[Service]
WorkingDirectory=/home/iot/iotapp
ExecStart=/usr/bin/dotnet /home/iot/iotapp/IoTDeviceOnLinuxService.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=iotapp
User=iot
Environment=DOTNET_ENVIRONMENT=Production
Environment=Device__ConnectionString__Primary=HostName=<Primary Connection String>
Environment=Device__ConnectionString__Secondary=<Secondy connection string>
Environment=Device__Connection__TransportType=mqtt

[Install]
WantedBy=multi-user.target

需要注意上述文件中:

  • 应用的放置位置:/home/iot/iotapp
  • 应用执行的实际用户:iot, 这里尤其需要注意的是,如果您的设备应用app有需要访问其他的资源,例如设备文件,那么这个用户需要拥有一定的权限,这个可以根据用户的环境进行调整。
  • 几个环境变量的定义,以及机密信息的放置。

根据您的配置更改完成这个service文件之后,将该文件拷贝到目录:/etc/systemd/system/, 然后运行如下的命令:

sudo systemctl enable iotapp.service

然后就可以启动该服务了:

sudo systemctl start iotapp.service
sudo systemctl status iotapp.service

使用systemctl status查看应用的状态,如果要查询该服务的日志,可以使用如下的命令:

sudo journalctl -fu iotapp.service

支持我们完成了基于Linux的应用。