Skip to content

Commit 3b25580

Browse files
author
Rafał Maciąg
committed
desc
1 parent f609559 commit 3b25580

File tree

5 files changed

+155
-0
lines changed

5 files changed

+155
-0
lines changed

Diff for: cake.ps1

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
New-Cake -Name "event-pi" -Root "./"
2+
3+
Add-CakeStep -Name "Build All" -Action { Build-Dotnet -All }
4+
Add-CakeStep -Name "Publish to nuget.org" -Action { Publish-Nuget -SourceUrl "https://nuget.org" }

Diff for: src/All.sln

+17
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,24 @@ Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio Version 17
44
VisualStudioVersion = 17.10.34607.79
55
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventPi.Advertiser", "EventPi.Advertiser\EventPi.Advertiser.csproj", "{10B9D4CC-44C6-43EE-AF73-DA9D7F6847E3}"
7+
EndProject
8+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3748D905-FFA5-4AD8-9BC5-A00AE48355D6}"
9+
ProjectSection(SolutionItems) = preProject
10+
..\cake.ps1 = ..\cake.ps1
11+
EndProjectSection
12+
EndProject
613
Global
14+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
15+
Debug|Any CPU = Debug|Any CPU
16+
Release|Any CPU = Release|Any CPU
17+
EndGlobalSection
18+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
19+
{10B9D4CC-44C6-43EE-AF73-DA9D7F6847E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
20+
{10B9D4CC-44C6-43EE-AF73-DA9D7F6847E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
21+
{10B9D4CC-44C6-43EE-AF73-DA9D7F6847E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
22+
{10B9D4CC-44C6-43EE-AF73-DA9D7F6847E3}.Release|Any CPU.Build.0 = Release|Any CPU
23+
EndGlobalSection
724
GlobalSection(SolutionProperties) = preSolution
825
HideSolutionNode = FALSE
926
EndGlobalSection

Diff for: src/EventPi.Advertiser/ContainerExtensions.cs

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using EventPi.Advertiser;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.Extensions.Logging;
4+
5+
// ReSharper disable once CheckNamespace
6+
namespace EventPi;
7+
8+
public static class ContainerExtensions
9+
{
10+
public static IServiceCollection AddAdvertiser(this IServiceCollection services, string serviceName, int port)
11+
{
12+
services.AddHostedService<RpiAdvertiseService>(sp =>
13+
new RpiAdvertiseService(sp.GetRequiredService<ILogger<RpiAdvertiseService>>(), serviceName, port));
14+
return services;
15+
16+
}
17+
}

Diff for: src/EventPi.Advertiser/EventPi.Advertiser.csproj

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
8+
<Title>EventPi.Advertiser</Title>
9+
<AssemblyVersion>0.0.0.1</AssemblyVersion>
10+
<FileVersion>0.0.0.1</FileVersion>
11+
<PackageTags>Rpi;EventStore;CQRS;EventSourcing</PackageTags>
12+
<PackageDescription>EventPi advertising service for rpi local communication.</PackageDescription>
13+
<PackageReadmeFile>README.md</PackageReadmeFile>
14+
<RepositoryUrl>https://github.com/modelingevolution/eventpi</RepositoryUrl>
15+
<GenerateDocumentationFile>True</GenerateDocumentationFile>
16+
<Copyright>ModelingEvolution</Copyright>
17+
</PropertyGroup>
18+
19+
20+
<ItemGroup>
21+
<None Include="..\..\README.md">
22+
<Pack>True</Pack>
23+
<PackagePath>\</PackagePath>
24+
</None>
25+
</ItemGroup>
26+
<ItemGroup>
27+
<PackageReference Include="Makaretu.Dns" Version="2.0.1" />
28+
<PackageReference Include="Makaretu.Dns.Multicast" Version="0.27.0" />
29+
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
30+
</ItemGroup>
31+
</Project>

Diff for: src/EventPi.Advertiser/RpiAdvertiseService.cs

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System.Net.NetworkInformation;
2+
using System.Net;
3+
using Makaretu.Dns;
4+
using Microsoft.Extensions.Hosting;
5+
using Microsoft.Extensions.Logging;
6+
7+
8+
namespace EventPi.Advertiser
9+
{
10+
public class RpiAdvertiseService : IHostedService
11+
{
12+
private CancellationTokenSource _cancellationTokenSource;
13+
private readonly ILogger<RpiAdvertiseService> _logger;
14+
private readonly ServiceProfile _serviceProfile;
15+
private readonly ServiceDiscovery _serviceDiscovery;
16+
private string _interfaceWifi;
17+
private readonly string _interfaceEthernet;
18+
19+
public RpiAdvertiseService(ILogger<RpiAdvertiseService> logger, string serviceName, int port)
20+
{
21+
_logger = logger;
22+
23+
_serviceProfile = new ServiceProfile(Dns.GetHostName(), "video.tcp", 9001);
24+
_serviceDiscovery = new ServiceDiscovery();
25+
_interfaceWifi = string.Empty;
26+
_interfaceEthernet = string.Empty;
27+
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
28+
{
29+
switch (ni.Description)
30+
{
31+
case "wlan0":
32+
_interfaceWifi = GetInterfaceAddress(ni);
33+
break;
34+
case "eth0":
35+
_interfaceEthernet = GetInterfaceAddress(ni);
36+
break;
37+
}
38+
}
39+
40+
_logger.LogInformation($"Interfaces: Wifi:{_interfaceWifi};Ethernet:{_interfaceEthernet}");
41+
_serviceProfile.AddProperty("Wifi", $"{_interfaceWifi}");
42+
_serviceProfile.AddProperty("Ethernet", $"{_interfaceEthernet}");
43+
}
44+
45+
private static string GetInterfaceAddress(NetworkInterface ni)
46+
{
47+
Console.WriteLine(ni.GetPhysicalAddress());
48+
foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses)
49+
{
50+
if (ip.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork) continue;
51+
if (ip.Address.ToString() != string.Empty) return ip.Address.ToString();
52+
}
53+
54+
return string.Empty;
55+
}
56+
57+
private async Task AdvertiseThisRpi(CancellationToken cancellationToken)
58+
{
59+
_logger.LogInformation($"Starting advertising {Dns.GetHostName()} in local network!");
60+
61+
62+
while (!cancellationToken.IsCancellationRequested)
63+
{
64+
_serviceDiscovery.Advertise(_serviceProfile);
65+
_logger.LogInformation($"Advertised! Wifi:{_interfaceWifi} Ethernet:{_interfaceEthernet}");
66+
await Task.Delay(20000);
67+
}
68+
69+
70+
}
71+
public Task StartAsync(CancellationToken cancellationToken)
72+
{
73+
if (_cancellationTokenSource != null)
74+
throw new InvalidOperationException("You cannot invoke start when already running (RpiAdvertiseService).");
75+
_cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
76+
Task.Factory.StartNew(async () => await AdvertiseThisRpi(_cancellationTokenSource.Token), TaskCreationOptions.LongRunning);
77+
return Task.CompletedTask;
78+
}
79+
80+
public async Task StopAsync(CancellationToken cancellationToken)
81+
{
82+
await _cancellationTokenSource.CancelAsync();
83+
_cancellationTokenSource = null;
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)