Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

[Android] Capture de caractères par appareil bluetooth


Sujet :

Composants FMX Delphi

  1. #1
    Membre extrêmement actif
    [Android] Capture de caractères par appareil bluetooth
    Hello!

    Je suis confronté à un problème qui est peut-être plus un problème Android que "Delphien".


    Mon objectif:
    Capturer le code barre lu par une douchette bluetooth dans une app Android développée en Delphi FMX (Delphi Rio 10.3.3).


    Principe de fonctionnement:

    • La douchette transmet le code barre lu comme une suite de caractères saisies au clavier.
    • La douchette compatible Windows/Android est configurée pour fournir le code sous la forme: 1 caractère pour indiquer le début du code barre ("!"), un caractère pour indiquer le type de code barre ("c" pour indiquer qu'il s'agit d'un code barre EAN8), les caractères codés dans le code barre (8 caractères pour un EAN8) et les caractères CR LF pour indiquer la fin du code barre.
    • L'app récupère chaque caractère reçu sur un event OnKeyDown et forme le code barre en récoltant les caractère un à un (d'où un caractère qui indique le début du code barre et un caractère de fin du code barre).


    Problème rencontré

    Sous Windows et sous Android, on n'obtient pas le même résultat.

    Si on lit un code barre de type EAN8 (=8 chiffres):

    Sous Windows, on obtient: !C20010003 CR LF (cela correspond à la configuration de la douchette)

    Sous Android, rien ne va plus:

    1. CR et LF ne sont pas détectés (je crois me souvenir que Unix ne traite pas les CR et autre LF)

    2. Si on visualise les caractères saisis dans un Tmemo en affichant la valeur du string qui a capturé un à un les caractères reçus, on a !C20010003 (sans CR et LF)

    3. Je contrôle le nombre de caractères reçus en contrôlant length(string)=21 (21 et pas 10 qui serait la longueur d'un string "!C20010003"!!!)

    4. Je vérifie donc le code ASCII des caractères reçus au niveau de l'event onKeyDown:

    33 99 0 50 0 48 0 48 0 49 0 48 0 48 0 48 0 51 0 0 0

    Ce qui correspond à:
    ! C 2 0 0 1 0 0 0 3


    On a le bon code ASCII suivi d'un 0 après chaque caractère et un 0 final en lieu et place de CR LF.


    Conclusion

    Sous Android, l'event reçoit 21 caractères, la string montre 10 caractères mais indique une longueur de 21 caractères et ajoute à la fin un "0" qui correspond à "je ne sais pas quoi".

    Sous windows, l'event reçoit 12 caractères (les 10 caractères visibles + CR + LF), la longueur du string=12 et le string montre les 10 caractères visibles.


    Est-ce que quelqu'un a une expérience dans le traitement des string au niveau de Android, une explication sur le fonctionnement obtenu sous Android et une solution pour détecter les CR et LF envoyés sous Android?

    Merci d'avance à tous ceux qui pourront m'éclairer...

  2. #2
    Expert éminent sénior
    Cela aurait été 33 0 99 0 50 0 ... cela aurait fait penser à l'unicode avec un 0 0 terminal

    length(string) et string.length donne la même chose ?

    Key, KeyChar et Shift dans OnKeyDown donne-t-il des informations complémentaires
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre extrêmement actif
    Citation Envoyé par ShaiLeTroll Voir le message
    Cela aurait été 33 0 99 0 50 0 ... cela aurait fait penser à l'unicode avec un 0 0 terminal

    length(string) et string.length donne la même chose ?

    Key, KeyChar et Shift dans OnKeyDown donne-t-il des informations complémentaires
    J'ai pensé à l'unicode mais je confirme que j'ai un "33 99 0" et pas un "33 0 99 0"...

    Length(string) et string.length donnent le même résultat (21 dans l'exemple) pour la simple et bonne raison qu'il y a effectivement 21 caractères: des caractères affichables (les "c", "0", "1", etc-.) et des caractères non affichables (des NUL codé en ASCII par la valeur 0 qui suit l'envoi d'un caractère visible, exception faite du premier caractère "!").

    Explication possible: les derniers caractères reçus pourraient correspondre au code ASCII=0 suivi d'un zéro. ASCII=0 correspond à NUL. Le string envoyé par la douchette avec un CR LF pourrait être traité comme une chaîne de caractère à zéro terminal, non?

  4. #4
    Membre expérimenté
    le onkeydown est-il sur un TEdit avec focus ou sur un autre élément de l'interface

    si c'est sur un TEdit, comment as-tu configuré les propriétés KillFocusByReturn et ReturnKeyType ?

    peux-tu vérifier si tu as ces caractères dans le onkeyup ?

  5. #5
    Membre extrêmement actif
    Citation Envoyé par pprem Voir le message
    le onkeydown est-il sur un TEdit avec focus ou sur un autre élément de l'interface

    si c'est sur un TEdit, comment as-tu configuré les propriétés KillFocusByReturn et ReturnKeyType ?

    peux-tu vérifier si tu as ces caractères dans le onkeyup ?
    Le onkeydown est sur la TForm principale de l'app parce que les code barres servent non seulement à lire des codes barres d'identification mais également d'outil de navigation de l'app (un code barre X et l'app déclenche la fonction Y).

    Par contre dans le code du onkeydown, je fais un setfocus sur un TEdit caché pas visible par l’utilisateur pour s'assurer qu'à aucun moment un composant de l'app puisse capturer les info provenant de la douchette. Les données de la douchette sont donc "collectées" par le TEdit caché et utilisés "réellement" par le code du onkeydown.

    Pour le TEdit caché, le KillFocusByReturn=false et le ReturnKeyType=default. Si je ne m'abuse ces paramètres interviennent au niveau de la gestion du clavier virtuel. Dans mon cas, le TEdit n'est pas utilisable par l'utilisateur et ne permet pas d'activer le clavier virtuel.

    Les caractères sont récupérés directement au niveau du onkeydown de la TForm, le TEdit n'intervient donc pas dans cette saisie.

    ***
    Je peux tout de même récupérer le code barre reçu en filtrant les codes ASCII=0 (équivalent à NUL), mais la question qui subsiste est de savoir si ces ajouts de NUL se limitent à certains modèles d'appareils Android, à certaines version de Android ou encore à certains modèles de douchettes

  6. #6
    Rédacteur/Modérateur

    J'ai lu quelque chose pour un sujet similaire, mais il y a un bail, impossible de remettre la main dessus
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Membre expérimenté
    Citation Envoyé par Anselme45 Voir le message

    Pour le TEdit caché, le KillFocusByReturn=false et le ReturnKeyType=default. Si je ne m'abuse ces paramètres interviennent au niveau de la gestion du clavier virtuel. Dans mon cas, le TEdit n'est pas utilisable par l'utilisateur et ne permet pas d'activer le clavier virtuel.

    Les caractères sont récupérés directement au niveau du onkeydown de la TForm, le TEdit n'intervient donc pas dans cette saisie.
    Un focus sur un champ caché, je n'aurais pas tenté, mais c'est bien si ça passe.

    En effet le ReturnKeyType concerne l'affichage du clavier virtuel et le comportement de sa touche RETURN donc ne devrait pas entrer en jeu.
    En revanche le KillFocusByReturn est géré par FMX qui déclenche l'affichage et le masquage du clavier selon les touches saisies, du coup il intercepte le RETURN.

    Citation Envoyé par Anselme45 Voir le message
    Je peux tout de même récupérer le code barre reçu en filtrant les codes ASCII=0 (équivalent à NUL), mais la question qui subsiste est de savoir si ces ajouts de NUL se limitent à certains modèles d'appareils Android, à certaines version de Android ou encore à certains modèles de douchettes
    Pour les zéros envoyés, ça doit venir de la couchette, il n'y a pas de raison que Delphi génère une touche 0/0 s'il n'y en a pas eu sans correspondance.

    Juste par curiosité tu devrais voir ce qu'il se passe avec un KillFocusByReturn à true sur le onchange du TEDit et vérifier si par hasard tu ne reçois pas le CRLF dans le onkeydown de ce composant plutôt qu'au niveau de la fiche.

    Après, si c'est une touchette Bluetooth, tu peux aussi la configurer de sorte qu'elle envoie ses données lues sur un service BT et le consulter depuis Delphi.

  8. #8
    Membre extrêmement actif
    Citation Envoyé par pprem Voir le message
    Après, si c'est une touchette Bluetooth, tu peux aussi la configurer de sorte qu'elle envoie ses données lues sur un service BT et le consulter depuis Delphi.
    Excuses moi de mon ignorance... Qu'est-ce qu'un "service BT"?

  9. #9
    Expert éminent sénior
    BT BlueTooth
    Au lieu d'être en mode clavier, tu es en mode données avec un TBlueTooth
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre extrêmement actif
    Citation Envoyé par ShaiLeTroll Voir le message
    BT BlueTooth
    Au lieu d'être en mode clavier, tu es en mode données avec un TBlueTooth
    Merci pour l'info... Mais en l'occurrence ce n'est pas le "BT" que je ne connais pas mais le "service BT"

    J'ai déjà utilisé plusieurs lecteurs de code barres (avec fil ou bluetooth) mais aucun d'eux me laissait le choix de configurer le mode d'échange de données. Tous, sans exception, te disent les données sont transmises via le keyboard et le seul paramètre que tu peux configurer au niveau du lecteur de code barres est le type de clavier (américain, français, etc.) parce que évidemment en fonction du clavier choisi, tu ne reçoit pas la donnée attendue.

    Est-ce que quelqu'un a déjà eu affaire avec un lecteur code barre qui permet un échange avec le PC via un mode "données"? Si oui, peut-il nous indiquer le modèle?

  11. #11
    Membre expérimenté
    Tu peux voir la rediffusion de la session de Fernando Rizzato sur les lecteurs qu'il utilise et comment il s'en sert. C'était disponible sur https://www.embarcaderoacademy.com/c...ctures/8441956 (accès gratuit mais faut s'inscrire) et peut-être sur YouTube en cherchant bien.

    Pour les histoires de services, en fait en BlueTooth les appareils sont censés proposer une API avec des points d'entrée, elle est généralement accessible sous forme de services / caractéristiques.

    Certains sont normalisés sous le nom de GATT, d'autres sont parfois documentés par les fabricants d'appareils.

    Pour les douchettes, je suppose qu'il y a un standard ou ils ont un driver qui les référence comme claviers externes.

    Tu peux tenter le composant TBluetooth et faire une recherche de service avec les options de scan et les événements. Avec un peu de chances ça te donnera des trucs à chercher en ligne.

    Ou tu peux aussi nous dire quels modèles tu utilises, peut-être qu'en fouinant sur certains forums on aura des réponses.

  12. #12
    Rédacteur/Modérateur

    Patrick, je savais bien que j'avais déjà vu quelque chose à ce sujet, ton exhumation "archéologique " était une partie dont je me souvenais sans pouvoir remettre le doigt dessus.
    Le ++ c'est que je cherchais depuis peu un exemple de ce genre, objectif : faire d'un mobile un scanner vers une application Windows (envoi de la valeur scannée via Bluetooh ou réseau)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  13. #13
    Membre expérimenté
    Citation Envoyé par SergioMaster Voir le message
    Patrick, je savais bien que j'avais déjà vu quelque chose à ce sujet, ton exhumation "archéologique " était une partie dont je me souvenais sans pouvoir remettre le doigt dessus.
    Le ++ c'est que je cherchais depuis peu un exemple de ce genre, objectif : faire d'un mobile un scanner vers une application Windows (envoi de la valeur scannée via Bluetooh ou réseau)
    un peu d'App Tethering fait l'affaire sur ce genre de choses, me souviens d'un article de blog avec le code correspondant

  14. #14
    Rédacteur/Modérateur

    Citation Envoyé par pprem Voir le message
    un peu d'App Tethering fait l'affaire sur ce genre de choses, me souviens d'un article de blog avec le code correspondant
    Oui, justement, celui là je le cherche aussi comme tu semble être en pleines recherches archéologiques si tu fais la trouvaille, je prend
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  15. #15
    Membre extrêmement actif
    Citation Envoyé par SergioMaster Voir le message
    Patrick, je savais bien que j'avais déjà vu quelque chose à ce sujet, ton exhumation "archéologique " était une partie dont je me souvenais sans pouvoir remettre le doigt dessus.
    Le ++ c'est que je cherchais depuis peu un exemple de ce genre, objectif : faire d'un mobile un scanner vers une application Windows (envoi de la valeur scannée via Bluetooh ou réseau)

    Aïe! SergioMaster!

    Vouloir "faire d'un mobile un scanner"??? Très, très mauvaise idée!!!

    J'ai fait l'exercice et c'est justement pour cela que j'adapte actuellement un scanner de code-barres externe bluetooth pour qu'il fonctionne avec un téléphone mobile!


    Oui, on peut utiliser la caméra d'un mobile comme scanner, mais dans le monde réel, c'est tout simplement inutilisable!

    1. Cela dépend du modèle de mobile (qualité de la caméra, qualité du driver, fonction auto-focus intégrée ou non, etc.)

    2. Cela dépend de l'environnement externe: La surface à scanner brille un peu? Le local est un peu sombre? Et tu ne scannes rien!

    3. Cela dépend de l'état externe du mobile: Tu as touché la surface de l'objectif photo à l'arrière du mobile avec ton doigt un peu gras? Et tu scannes rien!


    Et quand tous les critères sont au verts, tu te retrouves encore avec un image qui passe du clair au flou avec le mobile qui en mode auto-focus n'arrive pas à se décider.

    Au final, tu veux scanner avec ton mobile un simple code-barres? Cela va du scan immédiat au scan après 10, 20 30 secondes d'auto-focus ou par un mobile qui n'arrive jamais à le faire...

  16. #16
    Rédacteur/Modérateur

    Je te rassure c'est juste un exercice de style pour à la fois tester la lecture de code-barres/QRCode et le BT entre un mobile et une application. Absolument pas pour une application dans le monde "hostile" de l'industrie
    Toutefois, j'ai quand même vu dans mes recherches ce genre d'application de lectures de codes
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  17. #17
    Expert éminent sénior
    Les applications dédiées de lecture de QRCode (et de code-barre en général) sont bien plus performantes que les systèmes intégrées utilisant typiquement le QRCode contenant une URL
    Des QRCode de 18 caractères de 6mm de coté lisibles avec un mobile avec une appli standard mais c'est assez lent par rapport à une douchette DataLogic par exemple qui supportait même la taille de 4,5mm (5,5 pour les applis dédiés au mieux)

    Je ne travaille plus dans ce domaine, j'ignore ce que tout ce projet est devenu, c'est surement tout resté en Code128A / 128C et aussi EAN8

    C'est tout à fait exploitable en magasin pour l'assistance commercial, le vendeur scanne le produit (avec son mobile sans devoir aller à un POS) et peut conseiller le client.
    En entrepôt, volume trop important, mais c'est le WiFi qui a été choisi et non BT pour les douchettes mobiles
    les autres en bon vieux USB
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  18. #18
    Membre expérimenté
    Citation Envoyé par Anselme45 Voir le message

    Vouloir "faire d'un mobile un scanner"??? Très, très mauvaise idée!!!
    fait pour une application de billetterie d'événements spéciaux et de parcs d'attraction, ça passait plutôt bien mais faut le bon éclairage et bien entendu que les QR soient correctement imprimés (ou avec le bon contraste sur les téléphones des visiteurs venus valider leurs tickets)

  19. #19
    Membre expérimenté
    Citation Envoyé par SergioMaster Voir le message
    Oui, justement, celui là je le cherche aussi comme tu semble être en pleines recherches archéologiques si tu fais la trouvaille, je prend
    "barcode delphi tethering" donne https://fixedbycode.blogspot.com/201...ering-and.html

    bon dimanche

  20. #20
    Rédacteur/Modérateur

    je n'étais jamais "tombé" sur ce blog, merci.
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

###raw>template_hook.ano_emploi###