Android Usb Host Mode / POS Printer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Android Usb Host Mode / POS Printer


    Guten Tag,
    ich habe mich nun auch in die Welt der Androidentwicklung verirrt und hätte da gerne ein zwei Fragen an euch, da ich trotz einer Nacht voller Versuche und Recherche einfach nicht weiter komme. Und zwar entwickle ich eine App, bei welcher das Device als USB-Host dient und über USB-OTG Anschluss von einem Messgerät über USBtoSerial Daten geliefert bekommt und ein Ergebnis dann über einen Thermal Printer ausgibt.
    Mein Testgerät war in diesem Fall folgendes: tomtop.com/p-os2301eu-bl-1.htm…utm_campaign=TT_USC_DE_CD

    Klang im ersten Moment alles ganz einfach, jedoch gibt es da ein Problem beim USB. Laut "Hersteller" verfügt das Gerät über USB-OTG Support, welches für mich bedeutete, dass ich mit anderen USB Geräten kommunizieren kann. Dies hat sich jedoch nach meinem jetzigen Wissensstand als Lüge herausgestellt, da in den permissions der Host Mode nicht aktiviert ist. Meine bis dahin entwickelte App hat somit einfach keine USB Geräte erkannt. Nun habe ich aus der Ecke mein altes gerootetes S4 Active ausgepackt und den Host Mode aktiviert und es erkennt schon mal USB Geräte. Der nächste Schritt wird jetzt das Testen des Messgerätes sowie der USBtoSerial Schnittstelle. Wann dann allerdings fehlt ist ein Printer, welcher wieder extern dazu geschalten werden müsste.


    Nun meine Frage:
    Gibt es Android POS Printer mit werksmäßig aktiviertem USB Host Mode?
    Da das Rooten meines S4 schon etwas länger her ist, wollte ich heute zunächst das oben beschriebene Gerät rooten. Wenn ich das jedoch richtig sehe benötigt man fürs rooten eine gerätespezifische Custom-ROM? Oder liege ich da falsch?

    Schonmal Vielen Dank für jeden Tipp!

    LG ZiPP
  • hallo
    Habe mir gerade mal dein Testgerät abgesehen. Dies ist ja eigentlich ein Android Gerät mit android 6 API 23 .
    Eigentlich sollte otg haben wird es sicherlich auch.

    Der otg Support ist eigentlich im Kernel verangert.

    Was willst du eigentlich machen?
    Zum Thema permission . Hast du die denn auch zur Laufzeit vom User angeforderter. Ab API 23 reicht es nicht mehr die permissoin im Manifest zu setzen.

    Welche Android Version hat denn dein altes s4 ich denke unter Android 6 wahrscheinlich 5 oder 4.4
    Bei diesen Android Versionen brauchst du die User permissoin Freigabe nicht.

    Ich denke hier ist der Fehler. Ich will nicht glauben das der Hersteller falsche Angaben macht. Hast du mal eine fertige app mit otg Support getestet. Die auch für Android größer 6 geeignet ist.

    zb ein USB Stick und einen Datei Explorer.

    developer.android.com/training/permissions/requesting
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Schon mal vielen Dank für deine Antwort. Hatte sämtliche Apps getestet. Ein USB Stick wurde auch erkannt und ich konnte auf die dateien drauf zugreifen mit der App "USB Host Controller". Deswegen hatte ich auch gefühlt einen halben Tag rumgemacht um das zum laufen zu kriegen, jedoch ohne Erfolg.

    Dann hatte ich weitere Apps geholt und dort wurde mir von allen gesagt, das nichts erkannt wird. Liegt das auch, da diese die User permission Freigabe nicht eingeholt haben?

    USB Host Test:
    Could not detect any usb devices. Possible reasons include ... no USB Host Capability on this device
    USB Host Check:
    (X) android.hardware.usb.host.xml - Not found.
    (X) handheld_core_hardware.xml - USB Host not enabled.
    (X) tablet_core_hardware.xml - Not found
    USB OTG Checker:
    Android nicht Kompatibel (noch)
    USB OTG
    Checkliste
    (X) USB Manager
    ( ) USB HOST
    (X) USB Device List
  • Ein USB Stick wurde auch erkannt und ich konnte auf die dateien drauf zugreifen
    Das sagt ja schon mal das du doch einen OTG Support hast.


    Liegt das auch, da diese die User permission Freigabe nicht eingeholt haben?
    Kann sein bei mir am Handy zeigen die TestApps auch unterschiedliche Sachen an. Ich denke das da auch sehr alte und schlechte Apps dabei sind.


    Wenn bz ein USB-Stick erkannt wird und du zugreifen konnte muss es eigentlich gehen.
    In deiner App wirst du nicht die richtigen Permission haben und vielleicht auch nicht richtig auf den stick zugegriffen haben. Denn auch ab API 23 ist es nicht mehr so einfach möglich mit den normalen Java Datei Methoden auf den Externen Speicher zuzugreifen.



    Was für einen Anschluss hat den dein serielles Gerät. Rs232 oder USB .
    Wenn USB dann kommt es darauf an welcher Uart –USB Chip in dem Gerät benutz wird.
    Denn android brauchst dafür auch so etwas wie einen Treiber. Lib
    Welche Chipsätze da von Android unterstützt werden muss ich auch erst schauen.


    Die FTDI Chips werden eigentlich gut unterschützt und es gibt auch viel Libs im netz sogar direkt auf der Hersteller Seite von FTDI.



    ftdichip.com/Android.htm
    developer.android.com/guide/topics/connectivity/usb/host
    Ein Feedback auf Tipps ist auch schön. :P
  • Das serielle Geräte ist ein DIMF Compact (bopp-reuther.de/produkte/dicht…konzentrationsmessgeraet/) und besitzt einen FTDI Chip. Es hat einen RS232 Anschluss welcher über einen Adapter bei mir im (momentan) S4 per Micro USB angeschlossen ist.

    USB Connection läuft mittlerweile.

    Momentan arbeite ich mit folgender lib ( github.com/felHR85/UsbSerial ) da ich keine Doku bei ftdichip.com gefunden hatte für Android. Aber während ich das hier geschrieben habe, hatte ich die Seite nochmal durchforstet und bin fündig geworden *facepalm*. Werde dann jetzt lieber die lib von ftdichip nehmen und hoffen, dass ich da weiter komme als bisher :)

    EDIT: Die Doku die ich gefunden habe ist leider nicht für Java sondern für C.. Heißt wohl doch Beispielprojekte suchen und durchforsten
    EDIT2: Bin wieder bei der ersten library und kriege mittlerweile auch Daten rein... nur etwas unstrukturiert, aber das wird noch :)

    Das Problem mit dem Gerät werde ich dann erst weiter angehen, sobald der erste Prototyp steht. Aber wenn du meinst, dass da was möglich sein sollte, bin ich schonmal guter Dinge.

    Vielen Dank, bist mir eine große Hilfe! :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von ZiPPSolutions ()

  • Achso sorry :|


    Ist 5.1.1 API 22, jedoch ging es auch erst nachdem ich den Usb Host mode enabled habe mittels der APP "USB Host Check" (War einfacher als es manuell zu machen)
    CyanogenMod 12.1

    In der library die ich aktuell benutze wird auf dieser Seite (github.com/felHR85/UsbSerial/wiki/4.-Asynchronous-api) ganz unten erzählt, dass man eine ProtocollBuffer Klasse verwenden kann. Ist vermutlich wieder eine extra library?

    Bisher nur das (github.com/protocolbuffers/protobuf/releases/tag/v3.9.1) gefunden, scheint aber nicht das gleiche zu sein wie das vorher erwähnte... Ich glaube ich sollte mal langsam n Päuschen machen...
  • Also ich glaube du solltest wirklich Pause machen ^^

    Dein erster link ProtocollBuffer ist eine klasse aus der Lib die du benutzten willst. In den darauf folgender Code. Wird auch genau eine variable von diesr Klasse erstellt. Das ist keine support Lib.
    Wenn du dir den Quellcode deine Lib anschaust wirst du diese klasse auch finden unter util.

    Dein zweiter link Schwachsinn ist zwar der gleiche nahme arber Python was soll das.
    Ein Feedback auf Tipps ist auch schön. :P
  • Jep. Wtf...

    Normalerweise sagt schlägt das IDE ja direkt vor die Klasse zu importieren, wenn sie in irgendeiner vorhandenen library enthalten ist. War allerdings nicht der Fall.

    Mein Fail war allerdings, das ich WIE AUCH IMMER eine komplett veraltete Version von der Library mit eingebunden hatte in der es den ProtcollBuffer anscheinend noch nicht gab.


    Naja, genug für heute!

    Vielen vielen Dank fir jogimuc!
  • Hey Jogimuc,
    ich hoffe du liest das noch :)

    Also soweit läuft momentan alles, jedoch habe ich noch immer Probleme das ganze auf dem oben genannten Gerät zum laufen zu kriegen. Ich habe auch schon ein anderes Kabel ausprobiert, jedoch wird mir in aller "checker"-Apps gesagt, dass OTG ggf nicht vollständig läuft.

    Lediglich bei einer App (USB Host Controller) werden mir USB-Geräte angezeigt, wenn diese angeschlossen sind. Bei einem USB-Stick kann ich sogar mit dem hauseigenen Datenmanager auf den USB Stick zugreifen. Jedoch finde ich keine Beispiele dafür wie ich das ein einer eigenen App verklichen kann.

    Habe ein Codebeispiel gefunden um nach den Permissions zu fragen, und die kriege ich auch, jedoch erkennt er in den Apps einfach keine USB geräte. Für die USB Connection teste ich aktuell mit folgendem Code:


    Java-Quellcode

    1. package com.example.myapplication;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import androidx.core.app.ActivityCompat;
    4. import androidx.core.content.ContextCompat;
    5. import android.Manifest;
    6. import android.app.Activity;
    7. import android.content.Context;
    8. import android.content.pm.PackageManager;
    9. import android.hardware.usb.UsbDevice;
    10. import android.hardware.usb.UsbManager;
    11. import android.os.Bundle;
    12. import android.util.Log;
    13. import android.view.View;
    14. import android.widget.Button;
    15. import android.widget.TextView;
    16. import java.util.HashMap;
    17. public class MainActivity extends AppCompatActivity {
    18. private static final int REQUEST_RUNTIME_PERMISSION = 123;
    19. TextView text;
    20. HashMap<String, UsbDevice> map;
    21. @Override
    22. protected void onCreate(Bundle savedInstanceState) {
    23. super.onCreate(savedInstanceState);
    24. setContentView(R.layout.activity_main);
    25. if (CheckPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    26. // you have permission go ahead
    27. //createApplicationFolder();
    28. Log.d("taggy", "IT WORKS");
    29. } else {
    30. // you do not have permission go request runtime permissions
    31. RequestPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION);
    32. Log.d("taggy", "DOESNT WORK :(");
    33. }
    34. final UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    35. map = usbManager.getDeviceList();
    36. text = findViewById(R.id.text);
    37. Button button = findViewById(R.id.button);
    38. button.setOnClickListener(new View.OnClickListener() {
    39. @Override
    40. public void onClick(View view) {
    41. if(map == null){
    42. text.setText("0");
    43. } else {
    44. text.setText(map.toString());
    45. for (UsbDevice e : map.values()){
    46. text.append(e.toString());
    47. }
    48. }
    49. //text.setText(map.size());
    50. }
    51. });
    52. }
    53. @Override
    54. public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {
    55. switch (permsRequestCode) {
    56. case REQUEST_RUNTIME_PERMISSION: {
    57. if (grantResults.length > 0
    58. && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    59. // you have permission go ahead
    60. //createApplicationFolder();
    61. Log.d("taggy", "IT WORKS");
    62. } else {
    63. // you do not have permission show toast.
    64. }
    65. return;
    66. }
    67. }
    68. }
    69. public void RequestPermission(Activity thisActivity, String Permission, int Code) {
    70. if (ContextCompat.checkSelfPermission(thisActivity,
    71. Permission)
    72. != PackageManager.PERMISSION_GRANTED) {
    73. if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
    74. Permission)) {
    75. } else {
    76. ActivityCompat.requestPermissions(thisActivity,
    77. new String[]{Permission},
    78. Code);
    79. }
    80. }
    81. }
    82. public boolean CheckPermission(Context context, String Permission) {
    83. if (ContextCompat.checkSelfPermission(context,
    84. Permission) == PackageManager.PERMISSION_GRANTED) {
    85. return true;
    86. } else {
    87. return false;
    88. }
    89. }
    90. }
    Alles anzeigen
    In der App "USB Host Controller" werden mir wie gesagt die Geräte angezeigt... in diesem Testprogramm, ist die deviceliste jedoch leer...

    Gibt es irgendwo ein Beispiel mit funktionierendem Code diese USB connection? Ich finde leider NICHTS dazu. :/
  • Gelesen habe ich.

    In Android 6 ist es leider nicht mehr mit den üblichen File Methoden auf den echten externen Speicher zuzugreifen USB Stick , SD Karte.
    Das machst du mit Storage Access Framework.
    Du hast ja auch nur die WRITE_EXTERNAL_STORAGE permission.
    Für den otg hast du keine permissoin it du die brauchst weiss ich nicht.
    Datei Zugriffe gehen nur noch über SAF.

    Das ist ein Content Provider von Android mit den du auch an die dafür notwendigen schreibende kommst. Der zugriff erfolgt dann über eine uri die vom Provider und somit ach vom User bestätigt bekommst.

    Physikalischen externen Speicher USB Stick sd Karte kannst du nicht mehr anders ansprechen.
    Den USB Manager brauchst du nicht dazu hilft dir meiner Meinung auch nicht weiter um auf den Stick zu zugreifen.

    Und wenn es mit einer anderen und den System Explorer geht hast du auch Otg. Das ligt daran wie du auf den Speicher zugreifen willst.
    Dateien vom Internen in den Externen Speicher kopieren




    Aber ich frage mich wieso willst du darauf zugreifen. Du willst doch nur die Daten von deinem Sensor über serial USB bekommen.
    Dafür hast du eigentlich keine permission. Und auch keinen Code.

    Um zu testen ob das überhaupt geht wurde ich mal ein eine app installieren die das serielle Interface kann. Also eine Serial Terminal.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Bin ein ziemlicher Anfänger, sorry :<

    Der Code den ich eingebunden hatte, war nur um zu Testen, ob ich das Gerät überhaupt erkennen kann, was leider nicht der Fall ist. Den Code hatte ich irgendwo anders her. Mein eigentlicher Code beinhaltet die Library, welche ich oben mal verlinkt hatte. Und diese funktioniert ja auch über den USB Manager. Wenn ich dich richtig verstanden habe, bringt mir das ja aber nichts, da seit API 23 die Zugriffe nur noch über das SAF erfolgen.

    Wie du empfohlen hast, habe ich mal verschiedene Serial Terminal Apps ausprobiert und keine davon "erkennt" das Gerät bzw kann dazu eine Verbindung aufbauen. Für mich heißt das jetzt so viel wie: Mit diesem Gerät wird das NIE funktionieren. Über das SAF werde ich wohl auch keine Daten bekommen, da ich ja nicht wirklich einen Storage habe..?

    Übrigens, bei dem genannten Tablet(Decooler Handheld-PDA) sagt jede OTG Checker App, das das Gerät nicht OTG kompatibel ist. Ggf doch eine Lüge vom Hersteller?(Ist ja nur so ein 90€ "China" Ding...)

    Daraus schließen sich mir folgende Frage: Liegt es jetzt tatsächlich an API 23 ? Eigentlich doch eher weil die Host API nicht enabled ist oder? (Hab leider aktuell keinen Adapter um das Gerät an meinem S8 zu testen, da sagt mir die OTG Checker App, das OTG enabled ist)
  • Hallo das es absolut nicht gehen soll kann ich nicht glauben. Denn mit einigen apps kannst du ja auf den USB-Stick zugreifen. Also muss und wird es auch mit einer eigenen app gehen.
    Das trifft übernatürlich nur zu wenn ich dich richtig verstanden habe das es mit dem Gerät und irgend einer app ging auf USB Stick zu zugreifen.

    SAF geht mit Sicherheit und damit kannst du auch auf den internen Speicher zuzugreifen.

    Wieso willst und musst du in deiner App auf den USB Stick zugreifen?
    Das ding hat doch auch internen Speicher zum speichern der Daten vom seriellen Gerät.

    Kann dir im Moment keinen Code geben bin im Urlaub und nur Handy.
    Vielleicht in 2 Wochen
    Ein Feedback auf Tipps ist auch schön. :P
  • Erkläre mal etwas genauer was dein Sensor liefert.
    Hast du denn mal versucht den Sensor an den pc zu hängen aber nur mit einem serial USB Adapter und nur mit einem Terminal Programm. Ob du da deine Verbindung bekommst.
    Natürlich bitratte.... Richtig einstellen.
    Natürlich musst du auch die richtigen Befehle an den Sensor schicken. Hast du so e sinnvolle doku zu Sensor.
    Ein Feedback auf Tipps ist auch schön. :P
  • Das mit dem USB Stick habe ich vielleicht unnötig mit reingebracht. das war Anfangs nur zum testen ob ich über USB überhaupt Geräte erkennen kann. Mein problem war, dass mir von einem Kollegen zunächst ein paar komische Kabel gegeben wurde und bei diesen nur das otg y kabel mit normalem usb anschluss funktioniert hatte. Die anderen habe ich erst später selber bestellt um dann zu testen.

    Mittlerweile kriege ich in den anderen Apps eben auch das serielle Gerät angezeigt, allerdings weiß ich nicht wie diese Apps das machen. Habe keine Ahnung von SAF, sollte mich da vielleicht reinlesen... Kann man mit SAF nur auf Storages zugreifen oder kriege ich damit auch streamdaten rein ?
    Aber kann es sein, dass diese Apps mit dem SAF zwar den Sensor erkennen, aber nix damit anfangen können? Jegliche Serial Terminal Apps erkennen auch kein Gerät am Tablet.


    Das wäre der Sensor (DIMF Compact): bopp-reuther.de/produkte/dicht…konzentrationsmessgeraet/

    Mit meinem S4 funktionieren die Testprogramme der Library (github.com/felHR85/UsbSerial) und ich kriege Daten rein. Mit meiner App auch. An meinem Laptop kriege ich mit den d2xx Treiber und HTerm(serial tool) auch Daten rein. Lediglich mit dem Testgerät funktioniert nichts. Hier sagt mir die USB OTG Checker App jedoch auch, dass OTG nicht enabled sei.

    Ich kriege morgen Nachmittag Besuch von einem Kollegen mit dem Honor 10, welches glücklicherweise Micro USB hat und OTG laut App enabled ist.
    Mein S8 hat leider USB-C und dafür hab ich kein passendes rs232 Kabel.