Codes-barres: du terrain à l'IBM i grâce à NTi et .NET

Rémi Rouillot

jeudi 04 avril 2024

  • Tutoriels

Dans cet article, je vais vous présenter comment développer facilement et rapidement une application mobile Android mettant en œuvre une connexion à l'IBM i grâce à .NET et NTi. Cette appli permettra de scanner des codes à barres et de les insérer dans une table dans l'IBM i.

Image principale de l’article « Codes-barres: du terrain à l'IBM i grâce à NTi et .NET »

Introduction

Dans cet article, je vais vous présenter comment développer facilement et rapidement une application mobile Android mettant en œuvre une connexion à l'IBM i grâce à .NET et NTi. Cette appli permettra de scanner des codes à barres et de les insérer dans une table dans l'IBM i.

Etape 1/3: 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))

Nous disposons maintenant d'une table BARCODES dans la bibliothèque SAMPLE pour tout stocker.

Etape 2/3: Développer l'application mobile

Créons maintenant l'application mobile en utilisant un modèle de projet .NET MAUI.

Utilisation de l'appareil photo pour lire les codes-barres:

Pour exploiter l'appareil photo du smartphone, j'utilise une des bibliothèques disponibles pour lire des codes-barres, en l'occurence ZXing. Ce composant s'utilise très simplement, directement dans la vue:

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

On interceptera ensuite les données lues dans le code sous-jacent via la méthode BarcodesDetected (cf. la doc de ZXing).

Il ne faut pas oublier de préciser dans le manifeste de notre application que l'on souhaite accéder à l'appareil photo du téléphone. Sans quoi les autorisations nécessaires ne seraient pas accordées à l'utilisation.

Exploitation des données:

Nous disposons maintenant d'un scanner de codes-barres qui fonctionne. Il faut alors traiter les données en les insérant dans l'IBM i. Pour cela il suffit d'utiliser NTi et Dapper dans la méthode BarcodesDetected pour réaliser notre requête SQL d'insertion:

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();
}

Au passage on déclenche une vibration sur le smartphone pour confirmer la lecture à l'utilisateur.

Résumé du code:

Pour ceux qui souhaiteraient reproduire cet exemple, le code final pour la vue (MainPage.xaml) est:

<?xml version="1.0" encoding="utf-8" ?>
<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="Exemple d'application permettant de scanner des QR codes et des codes à barres, et d'envoyer les données dans l'IBM i avec NTi"
                Style="{StaticResource SubHeadline}"/>
            <zxing:CameraBarcodeReaderView
                x:Name="cameraBarcodeReaderView"
                BarcodesDetected="BarcodesDetected"/>
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

Et le code sous-jacent (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();
        }
    }
}

Il ne nous reste plus qu'à publier notre application et à la tester sur un smartphone.

Etape 3/3: Publication et test

Grâce à Visual Studio, on peut publier directement notre application sous forme d'archive APK installable sur n'importe quel appareil Android (smartphone, douchette d'entrepôt, tablette, etc...).

💡Remarque: Il faut pouvoir établir une connexion entre le smartphone et l'IBM i via un VPN par exemple. Sans cela il faudrait développer une politique de saisie hors-ligne puis de synchronisation une fois le lien retrouvé.

Aussi, NTi est totalement agnostique à la plateforme. Je peux donc l'utiliser en environnement Android/ARM sans problème et sans avoir à installer de pilote. Je pourrais faire de même pour iOS si j'avais choisi un iPhone pour ce scénario.

Ainsi, j'ai testé en installant l'appli sur mon téléphone:

article 7

L'appli fonctionne comme prévu et cherche à scanner des codes-barres. Je trouve un emballage de pommes avec un code EAN8 et le scanne:

article 7

J'ai senti la vibration de mon téléphone, et si je vais vérifier dans l'IBM i, je retrouve bien les données de l'EAN8 que je viens de scanner sur mon carton de pommes:

article 7

Conclusion

Au travers de cet article, j'ai présenté un exemple de cas d'utilisation où NTi devient le liant entre le terrain et l'IBM i via un smartphone. On peut très bien imaginer ce genre d'application sur une douchette dans un entrepôt, ou sur le smartphone d'un technicien de maintenance qui scanne des codes-barres pour remonter de l'information de traçabilité dans l'IBM i.

En fait, tous les dispositifs d'acquisition deviennent utilisables simplement avec l'IBM i: appareil photo, scanner laser, périphériques Bluetooth...

N'hésitez pas à nous contacter pour essayer NTi !

Rémi Rouillot

Retour