Введение
В этой статье мы рассмотрим, как использовать последовательный порт (Serial Port) в приложении .NET MAUI для Android. Мы будем работать с USB-устройствами, такими как Arduino, и отправлять данные через Serial Port.
Я использовал Arduino MEGA 2560, ESP32 и смартфон Google Pixel 7a для тестирования.
Мой проект доступен на GitHub: SerialPort-in-MAUI. Исходный код библиотеки для работы с USB: UsbSerialForAndroid.
Для работы с USB-устройствами в MAUI нет готовых библиотек в NuGet, поэтому мы будем использовать исходный код.
Добавление фильтра устройств
Скопируйте файл device_filter.xml из примера в папку Platforms/Android/Resources вашего проекта. Убедитесь, что Build Action установлено как AndroidResource.
Включение поддержки USB Host
Добавьте следующий атрибут в MainActivity.cs, чтобы включить поддержку USB Host:
[assembly: UsesFeature("android.hardware.usb.host")]
Добавление фильтра для обработки подключенных устройств
В MainActivity.cs добавьте IntentFilter, чтобы получать уведомления о подключении USB-устройств:
[IntentFilter(new[] { UsbManager.ActionUsbDeviceAttached })]
Привязка фильтра устройств
Добавьте MetaData, чтобы привязать device_filter.xml и обрабатывать только нужные устройства:
[MetaData(UsbManager.ActionUsbDeviceAttached, Resource = "@xml/device_filter")]
Интерфейс для работы с USB
Создайте глобальный интерфейс IUsbService для работы с USB-устройствами:
public interface IUsbService
{
Task<IEnumerable<string>> GetAvailablePortsAsync();
Task<bool> ConnectAsync(string portName);
Task SendMessageAsync(string message);
}
Реализация службы для Android
Создайте класс UsbServiceAndroid в папке Android, который реализует IUsbService.
С помощью DependencyService можно будет обращаться к платформозависимому коду для работы с USB.
Код прошивки Arduino
Приведенный ниже код позволяет управлять светодиодом через Serial Port. Если отправить 1 — светодиод включится, если 0 — выключится.
const int ledPin = LED_BUILTIN;
char commandValue;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
commandValue = Serial.read();
if (commandValue == '1') {
Serial.println("1");
digitalWrite(ledPin, HIGH);
}
else if (commandValue == '0') {
Serial.println("2");
digitalWrite(ledPin, LOW);
}
}
delay(10);
}
Возможные примеры использования Serial Port
Работа с последовательным портом может пригодиться в различных сценариях:
- Получение данных с датчиков – например, сбор информации о температуре, влажности, давлении и передача этих данных в мобильное приложение.
- Автоматизация умного дома – управление умными устройствами через USB или Bluetooth.
Пример работы с LED-лентой
На видео показан пример управления LED-лентой через Serial Port. С помощью мобильного приложения, написанного на .NET MAUI, можно включать и выключать ленту, а также изменять её цвет.