Códigos de barras Android: del terreno al IBM i con NTi y .NET

En este artículo, voy a mostrarle cómo desarrollar rápida y fácilmente una aplicación móvil Android que se conecta al IBM i utilizando .NET y NTi. Esta aplicación escaneará códigos de barras y los insertará en una tabla en el IBM i.

Imagen ilustrativa del artículo

En este artículo, voy a mostrarle cómo desarrollar rápida y fácilmente una aplicación móvil Android que se conecta al IBM i utilizando .NET y NTi. Esta aplicación escaneará códigos de barras y los insertará en una tabla en el IBM i.

Paso 1: Créer la table dans l'IBM i

On va tout d'abord créer une table pour stocker les codes-barres qui seront scannés. Je souhaite stocker les données scannées, la date du scan et le type de code-barres scanné. Le SQL de création de table est le suivant:

CREATE TABLE SAMPLE.BARCODES (SCANDATE TIMESTAMP, SCANTYPE VARCHAR(256), SCANVALUE VARCHAR(1024))

Ahora tenemos una tabla BARCODES en la librería SAMPLE para almacenar todo.

Paso 2: Desarrollar la aplicación móvil

Ahora vamos a crear la aplicación móvil utilizando una plantilla de proyecto .NET MAUI.

Usar la cámara para leer códigos de barras:

Para utilizar la cámara del smartphone, estoy utilizando una de las librerías disponibles para la lectura de códigos de barras, en este caso ZXing. Este componente es muy sencillo de utilizar, directamente en la vista:

<zxing:CameraBarcodeReaderView
    x:Name="cameraBarcodeReaderView"
    BarcodesDetected="BarcodesDetected"/>

A continuación, interceptamos los datos leídos desde el código subyacente utilizando el método BarcodesDetected (ver el doc de ZXing).

No olvides especificar en el manifiesto de la aplicación que quieres acceder a la cámara del teléfono. De lo contrario, no se concederán las autorizaciones necesarias.

Tratamiento de datos:

Ya tenemos un escáner de código de barras que funciona. Ahora necesitamos procesar los datos insertándolos en el IBM i. Para ello, sólo tenemos que utilizar NTi y Dapper en el método BarcodesDetected para realizar nuestra petición de inserción SQL:

protected void BarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
    Vibration.Default.Vibrate();
    NTiConnection conn = new(_connectionString);
    conn.Open();
    foreach (var barcode in e.Results)
    {
        conn.Execute(
            "INSERT INTO SAMPLE.BARCODES (SCANDATE, SCANTYPE, SCANVALUE) VALUES (@TIME, @TYPE, @VALUE)",
            new
            {
                Time = DateTime.Now,
                Type = barcode.Format.ToString(),
                Value = barcode.Value
            }
        );
    }
    conn.Close();
}

Se activa una vibración en el smartphone para confirmar la lectura al usuario.

Resumen del código:

Para quien quiera reproducir este ejemplo, el código final de la vista (MainPage.xaml) es:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls"
             x:Class="BarcodeAppXaml.MainPage">
    <ScrollView>
        <VerticalStackLayout
            Padding="30,0"
            Spacing="25">
            <Image
                Source="nti.png"
                HeightRequest="185"
                Aspect="AspectFit"/>
            <Label
                Text="NTi - Scan"
                Style="{StaticResource Headline}" />
            <Label
                Text="Ejemplo de aplicación para escanear códigos QR y códigos de barras, y enviar los datos al IBM i con NTi"
                Style="{StaticResource SubHeadline}"/>
            <zxing:CameraBarcodeReaderView
                x:Name="cameraBarcodeReaderView"
                BarcodesDetected="BarcodesDetected"/>
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

Y el código subyacente (MainPage.xaml.cs):

using ZXing.Net.Maui;
using Aumerial.Data.Nti;
using Dapper;

namespace BarcodeAppXaml
{
    public partial class MainPage : ContentPage
    {
        private static string _connectionString = "...";
        public MainPage()
        {
            InitializeComponent();
            cameraBarcodeReaderView.Options = new BarcodeReaderOptions
            {
                Formats = BarcodeFormats.All,
                AutoRotate = true,
                Multiple = true
            };
        }

        protected void BarcodesDetected(object sender, BarcodeDetectionEventArgs e)
        {
            Vibration.Default.Vibrate();
            NTiConnection conn = new(_connectionString);
            conn.Open();
            foreach (var barcode in e.Results)
            {
                conn.Execute(
                    "INSERT INTO SAMPLE.BARCODES (SCANDATE, SCANTYPE, SCANVALUE) VALUES (@TIME, @TYPE, @VALUE)",
                    new
                    {
                        Time = DateTime.Now,
                        Type = barcode.Format.ToString(),
                        Value = barcode.Value
                    }
                );
            }
            conn.Close();
        }
    }
}

Ahora sólo nos queda publicar nuestra aplicación y probarla en un smartphone.

Paso 3: Publicación y pruebas

Gracias a Visual Studio, podemos publicar nuestra aplicación directamente en forma de archivo APK que se puede instalar en cualquier dispositivo Android (smartphone, dispositivo de mano de almacén, tableta, etc.).

💡Nota: Es necesario poder establecer una conexión entre el smartphone y el IBM i a través de una VPN, por ejemplo. Sin esto, sería necesario desarrollar una política de entrada offline y luego de sincronización una vez encontrado el enlace.

NTi también es totalmente agnóstico en cuanto a plataformas. Por tanto, puedo utilizarlo en un entorno Android/ARM sin ningún problema y sin tener que instalar un controlador. Podría hacer lo mismo para iOS si hubiera elegido un iPhone para este escenario.

Así que hice la prueba instalando la aplicación en mi teléfono:

Prueba de escaneo en la aplicación móvil NTi Scan

La aplicación funciona como se espera e intenta escanear códigos de barras. Encuentro un paquete de manzanas con un código EAN8 y lo escaneo:

La aplicación móvil NTi Scan funciona y busca códigos de barras

He sentido vibrar mi teléfono y, al ir a comprobarlo en el IBM i, encuentro los datos EAN8 que acabo de escanear en mi caja de manzanas:

Datos recuperados en IBM i mediante escaneo de código de barras

Conclusión

En este artículo, he presentado un ejemplo de un caso de uso en el que NTi se convierte en el enlace entre el campo y el IBM i a través de un smartphone. Es fácil imaginar este tipo de aplicación en una ducha de mano en un almacén, o en el smartphone de un técnico de mantenimiento escaneando códigos de barras para enviar información de trazabilidad al IBM i.

**De hecho, todos los dispositivos de adquisición pueden utilizarse con el IBM i: cámaras, escáneres láser, periféricos Bluetooth, etc.

¡No dude en contactarnos para probar NTi!

Rémi Rouillot