Przez sieć możemy w prosty sposób sterować STM32F4Discovery. Dla przykładu program do zapalania i gaszenia diod LED znajdujących się na płytce przez stronę WWW.
Zaczynamy od konfiguracji interfejsu i podpięcia się do zdarzenia tak, aby odbierać żądania HTTP przychodzące na port 80.
Zaczynamy od konfiguracji interfejsu i podpięcia się do zdarzenia tak, aby odbierać żądania HTTP przychodzące na port 80.
Adapter.Start(new byte[] {0x5c, 0x86, 0x4a, 0x00, 0x00, 0xdd}, "stm32f4", SPI.SPI_module.SPI3, Stm32F4Discovery.FreePins.PD1, Stm32F4Discovery.FreePins.PA15); Adapter.ListenToPort(80); Adapter.OnHttpReceivedPacketEvent += OnHttpReceivedPacketEvent;
Dodatkowo zdefiniujemy pomocniczy słownik, aby łatwo wybierać odpowiednią diodę na podstawie koloru. Red, Blue, Orange i Green to stałe napisy, które pojawiać się będą w żądaniu. Na przykład wejście na stronę http://stm32f4/led.svc?Orange (tak, zamiast IP można podać nazwę z konfiguracji interfejsu) będzie powodowało zmianę stanu diody pomarańczowej.
_leds = new Hashtable { {Red, new OutputPort(Stm32F4Discovery.LedPins.Red, false)}, {Blue, new OutputPort(Stm32F4Discovery.LedPins.Blue, false)}, {Orange, new OutputPort(Stm32F4Discovery.LedPins.Orange, false)}, {Green, new OutputPort(Stm32F4Discovery.LedPins.Green, false)} };
Została jeszcze implementacja metody obsługującej zdarzenia OnHttpReceivedPacketEvent. Na początku wyciągamy ze ścieżki zawartość zapytania (po znaku ?) i plik. Na podstawie tych wartości decydujemy czy obsłużyć żądanie czy zwrócić HTTP 404 (linia 34) i którą diodę przełączyć (linia 16). W StringBuilderze produkujemy stronę (odpowiedź serwera), która składa się z 4 linków o odpowiednich adresach.
private static void OnHttpReceivedPacketEvent(HttpRequest request) { lock (SyncRoot) { int filePos = request.Path.LastIndexOf('/'); string file = filePos == -1 ? String.Empty : request.Path.Substring(filePos + 1); int queryPos = file.LastIndexOf('?'); string query = queryPos == -1 ? String.Empty : file.Substring(queryPos + 1); if (queryPos != -1) file = file.Substring(0, queryPos); if (file == "led.svc") { var led = _leds[query] as OutputPort; if (led != null) led.Write(!led.Read()); var sb = new StringBuilder("<html><head></head><body>"); foreach (string key in _leds.Keys) sb.Append("<a href=\"/led.svc?" + key + "\">" + key + "</a> "); sb.Append("</body></html>"); byte[] responseBuffer = Encoding.UTF8.GetBytes(sb.ToString()); using (var responseStream = new MemoryStream(responseBuffer)) { request.SendResponse(new HttpResponse(responseStream)); } return; } request.SendNotFound(); } }
Pełny kot: DemoEnc28J60mIP_WebSrv
Brak komentarzy:
Prześlij komentarz