This is a “note to self” post about deploying a .NET Core Worker Service to a Raspberry PI 4B 8G running Raspberry PI OS (Bullseye). After reading many posts, then a lot of trial and error this approach appeared to work reliably for my system configuration.(Though YMMV with other distros etc.)
The first step was to create a new Worker Service project in Visual Studio 2019
I intentionally did not update the Microsoft.Extensions.Hosting and Microsoft.Extensions.Hosting.Systemd (for UseSystemd) NuGet packages for my initial development.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace devMobile.IoT.MachineLearning.AzureIoTSmartEdgeCameraService
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSystemd()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}
program.cs
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace devMobile.IoT.MachineLearning.AzureIoTSmartEdgeCameraService
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
}
Worker.cs
The first step was to create a new directory (AzureIoTSmartEdgeCameraService) on the device. In Visual Studio 2019 I “published” my application and copied the contents of the “publish” folder to the Raspberry PI with Winscp. (This intermediary folder was to avoid issues with the permissions of the /usr/sbin/ & etc/systemd/system folders)
Install service
Test in application directory
/home/pi/.dotnet/dotnet AzureIoTSmartEdgeCameraService.dll
Make service directory
sudo mkdir /usr/sbin/AzureIoTSmartEdgeCameraService
Copy files to service directory
sudo cp *.* /usr/sbin/AzureIoTSmartEdgeCameraService
Copy .service file to systemd folderclear
sudo cp AzureIoTSmartEdgeCameraService.service /etc/systemd/system/AzureIoTSmartEdgeCameraService.service
Force reload of systemd configuration
sudo systemctl daemon-reload
Start the Azure IoT SmartEdge Camera service
sudo systemctl start AzureIoTSmartEdgeCameraService
Uninstall service
sudo systemctl stop AzureIoTSmartEdgeCameraService
sudo rm /etc/systemd/system/AzureIoTSmartEdgeCameraService.service
sudo systemctl daemon-reload
sudo rm /usr/sbin/AzureIoTSmartEdgeCameraService/*.*
sudo rmdir /usr/sbin/AzureIoTSmartEdgeCameraService
See what is happening
journalctl -xe
It took a lot of attempts to get a clean install then uninstall for the screen captures.