Есть ли способ узнать, ушел ли в сон сканер Bluetooth SPP?

Мне нужно поймать штрих-код со сканера bluetooth SPP. Я могу открыть com-порт и поймать все сканы, однако через 2 минуты сканер уходит в сон. Когда сканер просыпается, он больше не подключен, но COM-порт все еще открыт. Мне нужен способ узнать, подключен ли еще сканер или перешел в спящий режим, и закрыть/повторно открыть com-порт, когда сканер снова проснется.

Я соединяю сканер с компьютером в win10, который создает входной com-порт (com4). Я могу открыть этот порт и слушать сообщения. Проблема в том, что сканер использует только одностороннюю связь и, кажется, не отправляет ничего, чтобы сказать «я отключаюсь сейчас», он просто уходит в сон и отключается. Есть ли способ увидеть, что сканер все еще подключен или ушел в спящий режим, или к чему можно подключиться? Сканер WASP WWS550i.

        _serialPort = New SerialPort(PortName, BaudRate, Parity.None, 8, StopBits.One)
        _serialPort.PortName = PortName
        _serialPort.Parity = Parity.None
        _serialPort.DataBits = 8
        _serialPort.BaudRate = BaudRate
        _serialPort.StopBits = StopBits.One

        AddHandler _serialPort.DataReceived, AddressOf sp_DataReceived

        _serialPort.Open()

Private Sub sp_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
    _LastDataReceived = _serialPort.ReadLine()
End Sub

person fra    schedule 12.09.2019    source источник
comment
Для приложений UWP можно использовать DeviceWatcher. Перечислить устройства Если это настольное приложение , попробуйте обработать сообщение WM_DEVICECHANGE в Нативное окно. Обнаружение отключения последовательного порта Bluetooth SPP ( С# 4.5 Win 8.1)   -  person kunif    schedule 12.09.2019
comment
Я попробовал WM_DEVICECHANGE, но он не отправляет никаких сообщений о порте. Я думаю, потому что это виртуальный порт, и сканер ничего не отправляет, чтобы сказать, что он отключен.   -  person fra    schedule 12.09.2019
comment
Возможно, тот же человек задавал вопрос на StackOverflow. Обнаружение отключения последовательного порта Bluetooth SPP (C# 4.5, Windows 8.1) Кажется, что bluetooth не генерирует сообщение. К сожалению, это кажется трудным для обнаружения.   -  person kunif    schedule 12.09.2019
comment
WM_DEVICECHANGE и найдите GUID_BLUETOOTH_HCI_EVENT или GUID_BLUETOOTH_RADIO_OUT_OF_RANGE: docs.microsoft.com/en-us/windows/win32/bluetooth/   -  person Mike Petrichenko    schedule 12.09.2019
comment
Другой вопрос был не от меня. Однако кажется, что нет никакого способа определить статус такого соединения, особенно потому, что это не двусторонняя связь. Кроме того, я должен иметь возможность подключать любые считыватели штрих-кодов в любое время, поэтому я думаю, что это не сработает. Сейчас я ищу разные сканеры штрих-кода и делаю это через BLE. В любом случае спасибо   -  person fra    schedule 13.09.2019


Ответы (1)


У меня была точно такая же проблема со сканером планшета Pos. РАБОЧАЯ СЛУЖБА ASP.CORE 3

Я решил эту проблему, повторно открыв последовательный порт после пробуждения. Кроме того, если я попытался снова открыть порт, порт говорит Порт недоступен, потому что порт не был должным образом закрыт (утилизация).


Мое решение

Я написал 1-секундную программу проверки, которая проверяет, открыт ли порт. Если это не так, вызовите close() на предыдущем экземпляре последовательного порта, после чего снова откройте порт.

Теперь я могу сканировать после пробуждения.

public class Worker : BackgroundService
    {
        private static SerialPort SERIAL_PORT;

        // constructor DI

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {

        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            // create serial port connection
            _logger.LogInformation($"-- open serial port {PORT_NAME}");

            SERIAL_PORT = SerialPortFactory.Create(PORT_NAME);
            SERIAL_PORT.Open();

            _logger.LogInformation($"-- serial port {PORT_NAME} opened");

            Task.Run(() => Checker(_logger)); // run port checker on another thread

            return base.StartAsync(cancellationToken);
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            SERIAL_PORT.Close();
            return base.StopAsync(cancellationToken);
        }

        public static void Checker(ILogger<Worker> _logger)
        {
            for (;;)
            {
                _logger.LogInformation("Sleep for 1 second!");
                Thread.Sleep(1000);
                try
                {
                    _logger.LogInformation(SERIAL_PORT.IsOpen.ToString());
                    if(!SERIAL_PORT.IsOpen)
                    {
                        SERIAL_PORT.Close();
                        Thread.Sleep(100); // is not necessary but ...

                        SERIAL_PORT = SerialPortFactory.Create(PORT_NAME);
                        SERIAL_PORT.Open();

                        _logger.LogInformation($"-- serial port {PORT_NAME} opened");
                    }
                } catch(Exception e)
                {
                    _logger.LogError(e.Message);
                }
            }
        }
    }

SerialPortFactory — это всего лишь мой простой класс-оболочка для нового SerialPort из документа MS

person daremachine    schedule 30.04.2020