Как использовать сканер Zebra SE4710 с устройством Atol Smart.Slim Plus?

Каким образом можно работать со сканером Zebra SE4710 (Atol Smart.Slim Plus) в проекте на MAUI (или Xamarin, или C#), используя EMDK и Broadcast? Я столкнулся со сложностями при работе со сканером. Мой текущий подход с использованием EMDK выдает ошибку 'stub' - NullReferenceException. Я также использовал Broadcast, но удалось получить только начало и конец сканирования, а не данные из сканирования. Я слышал о программе DataWedge, но нигде не могу найти ее. Изменено ли ее название? Если вы сталкивались с такими проблемами или имеете информацию по этому вопросу, пожалуйста, поделитесь. Я знаю, что схожий вопрос уже был задан на форуме, но я не понимаю, как адаптировать решение для Zebra из ответа, который был предложен для Honeywell. Возможно, есть способ получать данные с помощью Broadcast? Я заметил, что на устройстве есть утилита BarcodeUtility, что позволяет корректно считывать QR-коды при использовании кнопки сканирования. Может быть, можно извлекать данные из этого приложения (запуская оба приложения одновременно)? Спасибо.
  • 6 ноября 2023 г. 14:59
Ответы на вопрос 1
Для использования сканера Zebra SE4710 с устройством Atol Smart.Slim Plus в проекте на MAUI (или Xamarin, или C#), вам потребуется использовать Zebra EMDK (Enterprise Mobility Development Kit). 

Вот пример кода для работы со сканером:
```csharp
using Symbol.XamarinEMDK;
using Symbol.XamarinEMDK.Barcode;

private EMDKManager emdkManager;
private BarcodeManager barcodeManager;
private Scanner scanner;

public void InitializeScanner()
{
    emdkManager = EMDKManager.GetEMDKManager(Application.Context, this);

    if (emdkManager != null)
    {
        barcodeManager = (BarcodeManager)emdkManager.GetInstance(EMDKManager.FEATURE_TYPE.Barcode);

        scanner = barcodeManager.GetDevice(BarcodeManager.DeviceIdentifier.Default);
        if (scanner != null)
        {
            scanner.Data += Scanner_Data;
        }
    }
}

private void Scanner_Data(object sender, Scanner.DataEventArgs e)
{
    var barcodeData = e.P0?.GetScanDataCollection()?.GetScanData()?.FirstOrDefault();
    var scannedData = barcodeData?.Data;

    // Обработка полученных данных
}

public override void OnBackPressed()
{
    base.OnBackPressed();

    if (scanner != null)
    {
        scanner.Data -= Scanner_Data;
        scanner.Release();
    }

    if (emdkManager != null)
    {
        emdkManager.Release();
        emdkManager = null;
    }
}

public void OnOpenComplete()
{
    // Обработка успешного открытия сканера
}

public void OnClosed()
{
    // Обработка закрытия сканера
}

public void OnStatus(StatusData statusData)
{
    // Обработка обновлений статуса сканера
}

public void OnConnectionChange(ScannerInfo scannerInfo, BarcodeManager.ConnectionState connectionState)
{
    // Обработка изменений состояния подключения сканера
}
```
Вызовите метод `InitializeScanner` в методе `OnCreate` активности или фрагмента, где вы хотите использовать сканер.

Чтобы использовать Broadcast для получения данных сканирования, вы должны зарегистрировать BroadcastReceiver для следующего системного намерения:
```csharp
const string ACTION_DATAWEDGE = "com.symbol.datawedge.api.ACTION";

protected override void OnResume()
{
    base.OnResume();

    var filter = new IntentFilter(ACTION_DATAWEDGE);
    filter.AddCategory(Intent.CategoryDefault);
    RegisterReceiver(DataWedgeBroadcastReceiver, filter);
}

protected override void OnPause()
{
    UnregisterReceiver(DataWedgeBroadcastReceiver);
    base.OnPause();
}

private BroadcastReceiver DataWedgeBroadcastReceiver = new BroadcastReceiver()
{
    public override void OnReceive(Context context, Intent intent)
    {
        if (intent?.Action == ACTION_DATAWEDGE)
        {
            // Обработка данных сканирования, полученных через Broadcast
        }
    }
};
```
Также убедитесь, что в настройках устройства включена функция DataWedge и настроена на передачу данных через Broadcast.

Относительно использования BarcodeUtility, возможно, имеется возможность запускать его и получать данные из него, но для этого необходимо изучить документацию по его API и проверить, поддерживает ли он такую функциональность.
Похожие вопросы