MQTT가 IoT에서 메시징 프로토콜로 주목을 받고 있다1. 이를 이용하여 Push 서비스를 C#, Rusth, Python 개발언어를 이용하여 간단하게 구현해 보았다. MQTT Broker는 Mosquitto를 사용하였고 간단한 인증을 위하여 username, password를 설정하였다.
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Client.Connecting;
namespace MqttTest
{
internal class Program
{
private static async Task Main()
{
await ClientTest();
}
private static async Task ClientTest()
{
var mqttClient = new MqttFactory().CreateMqttClient();
var options = new MqttClientOptionsBuilder().WithTcpServer("xxx.xxx.xxx.xxx", 1883).WithCredentials("username", "password").Build();
var message = new MqttApplicationMessageBuilder().WithTopic("U001/order").WithPayload("테스트 메시지입니다.").WithExactlyOnceQoS().Build();
var result = await mqttClient.ConnectAsync(options, CancellationToken.None);
if (result.ResultCode == MqttClientConnectResultCode.Success)
{
await mqttClient.PublishAsync(message);
}
}
}
}
C# .NET Framework에서 발생하는 시스템 이벤트와 별도로 사용자가 직접 이벤트를 정의하여 사용할 수 있다. 이벤트를 받을 때 파라미터로 데이터를 받으려면 EventArgs 클래스를 상속받아 여기에 항목을 추가하여 사용이 가능하다. WinForm이나 WPF에서 제공하는 이벤트와 별도로 개발자가 직접 이벤트 로직을 만들 수 있어야 한다. 전체 소스는 UserEventExam 에서 볼 수 있다.
using System;
namespace UserEventExam
{
public class UserEvents
{
public static event EventHandler<UserArgs> OnUserEvent;
public static void ProcessEvent(UserArgs args)
{
OnUserEvent?.Invoke(OnUserEvent.Target, args);
}
}
}
Thread를 다룰 때 Synchronization(동기화) 가 필요한 경우가 있다. 특히 ‘Critical section’의 이해는 중요한 데 여러 프로세스가 데이터를 공유할 때 각 프로세스에서 공유 데이터를 액세스하는 것을 제한해야 한다. 이번 예제는 C#언어에서 Thread Synchronization을 다루는 ‘Lock’, ‘Monitor’, ‘Manual Reset Event’, ‘Auto Reset Event’, ‘Mutex’, ‘Semaphore’에 관한 간단한 소스이다1.
using System;
using System.Threading;
namespace ConsoleExam
{
internal class Program
{
private static readonly object _locker = new object();
private static void Main()
{
for (var i = 0; i < 5; i++)
{
new Thread(DoWork).Start();
}
Console.ReadKey(true);
}
public static void DoWork()
{
lock (_locker)
{
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} starting...");
Thread.Sleep(1000);
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} completed...");
}
}
}
}