NET 6 WebAPI - SerialPort i nasłuchiwanie zmian z wagi

0

Witam.
Od razu zaznaczam, że jeszcze niczego nie pisałem, aby mieć jakieś zdanie. Chciałbym najpierw się zorientować w temacie czy to w ogóle jest możliwe. Zbliża się kolejny drobny projekt. Potrzebuje pobrać wartość z wagi po porcie COM.

W konsolowej apce mam tak:

serialPort = new SerialPort(conf.portName, conf.baundRate, conf.parity, conf.dataBits, conf.stopBits);
serialPort.DataReceived += Serial_DataReceived;
serialPort.Open();
serialPort.DiscardOutBuffer();

private static void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Console.WriteLine(serialPort.ReadLine());
}

Czy ja jestem w stanie "na żywo" w ten sam sposób uzyskać wynik z WebAPI? Mogę użyć jakiegoś timera, który będzie co sekundę odpytywał API o wynik ale ten event DataReceived jakoś mi nie pasuje do sposobu działania kontrolera w WebAPI.

2

SignalR

0

Nie jestem pewien, czy ta waga sama będzie gadać. Musisz protokół sprawdzić. Część urządzeń RS232 zazwyczaj odpowiada na jakieś komendy np. "podaj wagę". Jeśli tak jest to faktycznie w serwisie po wywołaniu metody WebAPI pytasz wagę i zwracasz tylko pamiętaj o kontroli błędów bo to nie TCP! Z drugiej strony spotkałem rzeczy jak liczniki wejść, które same nadawały i nawet nie załączały sum CRC więc nie było wiadomo czy nie kłamią... natomiast wtedy tworzyło się serwis, który działa w tle(https://docs.microsoft.com/pl-pl/dotnet/api/microsoft.extensions.hosting.backgroundservice?view=dotnet-plat-ext-6.0) i w jakimś buforze zapisywało zliczenia. Potem w WebAPI pytasz ten serwis o dotychczasowe wyniki, a serwis zwraca i czyści bufor. Pamiętaj, że część urządzeń ma też reżim czasowy, po którym Cię oleje lub wpadnie w stan limbo.

0

Jak się tylko połączy po odpowiednim COMie to odpowiada w ciągu, nawet jeśli wartości są zerowe (nic nie stoi na wadze). Sprawdzone to mam na aplikacji konsolowej (kod wyżej). Chciałbym teraz ten kod z konsoli przełożyć na API, ale wartości, które lecą w ciągu, zwracane są dopiero w evencie DataReceived. Nie bardzo wiem jak takie dane "live" z eventu przekazać do frontu. Jak na razie to muszę poczytać o SignalR, którego zaproponował @Pixello

0

To zależy co chcesz osiągnąć. Można :

1 Przez SIgnalR na live pokazywać każdą zmianę
2 Tak samo ale ręcznie przez WebSockets
3 Pullingiem przez HTTP GET z serwisem buforującym jak opisałem.

Bo zależy, czy chcesz położyć coś na wadze i zobaczyć na froncie ile to wazy np. cukierki i dosypywać po troszku np. do 20dag, czy wjechać ciągnikiem z burakami na wagę, po czym kliknąć przycisk, żeby pobrać wagę do wpisania na PZ.

0

Może być tak, że użytkownik coś dołoży do skrzynki, która aktualnie stoi na wadzę, więc zczytywanie "live" dobrze żeby było. Oczywiście naciśnięcie guzika zatwierdza odczyt i zapisuje na formatce.

1

No to zostaje 1 lub 2 przy czym bufor i tak będzie musiał być. Chodzi o to, że urządzenia RS232 mogą podłączać sie tylko w relacji ekskluzywnej. Nie podłączysz 2 klientów do wagi. Zatem musisz mieć BackgroundService, który odczytuje wskazania wagi i wali do bufora, oraz drugi worker, który bierze ten bufor i rozgłasza po wszystkich zarejestrowanych sesjach SignalR czy WebSocket. Chodzi o to, żeby backend utrzymywał komunikacje z wagą. Pamiętaj też, że port potrafi sie zepsuć i jak waga zacznie walić głupoty warto odnowić połączenie.

0

Dzięki za info. Będę miał wszystko na uwadze ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1