Programowe pobieranie właściwości skanera

0

Chcę pobrać programowo właściwości skanera z urządzenia wielofunkcyjnego. Mam drukarkę Canon MG5150,która ma funkcję skanowania. Dokładnie chodzi o pobranie informacji o dostępnych w skanerze rozdzielczościach. W systemie Windows 10 jest aplikacja "Skanowanie" , w której po podłączeniu drukarki można przejrzeć dostępne rozdzielczości skanera drukarki i ustawić jedną z nich jako domyślną do skanowania.
Ale ja chcę pobrać te rozdzielczości kodem VB.NET (może być C# to sobie przekonwertuję). Jednak na stronach Microsoftu nie mogę tego znaleźć.
Ta informacja o rozdzielczości DPI skanera jest mi potrzebna do przeliczania rozmiarów zeskanowanego pliku w pikselach na ich rozmiary rzeczywistej fizycznej kartki w skanerze w milimetrach. Taką funkcję już zrobiłem, ale muszę teraz "ręcznie sprawdzać" domyślne ustawienie DPI skanera, aby odpowiednią rozdzielczość ustawić w mojej funkcji dla prawidłowego. liczenia. Wiadomo, że im większe DPI skanowania, tym większe rozmiary w pikselach ma plik skanu.
Liczę na podpowiedź z waszej strony.

0

Poczytaj o snmpv1, 2,3. Za pomocą identyfikatorów można pobrać każde udostępnione przez producenta informacje.

0

Poczytałem o tym protokole SNMP w Internecie. To dotyczy urządzeń w sieci. Moja drukarka musiałaby taki protokół obsługiwać, to znaczy "przygotowywać dane o różnych swoich ustawieniach i właściwościach w formacie zgodnym z typ protokołem. Ale czy ona taki protokół obsługuje? Nie mam pojęcia. To jest zwykła domowa drukarka połączona w komputerem przewodowo. Wiadomo, że jako sprzęt, robi skany. Wiadomo też, że Windows 10 obsługuje jej funkcję skanowania. W panelu sterowania znalazłem w informacjach o niej "kategorię" "Skaner". Ale nie ma tam informacji o sterowniku skanera. Mój VB.NET w wersji 2010, jak sądzę, poza obsługą samej drukarki, nie ma zaimplementowanej obsługi skanera. Ale powinna być (gdzieś w Internecie dostępna, płatna lub darmowa ) jakaś dostępna biblioteka DLL, która to obsługuje. Tylko jak to znaleźć? U Microsoftu na ich stronach (https://learn.microsoft.com/pl-pl/dotnet/visual-basic/ ) wpisanie hasła "SNMP" daje tylko jeden wynik: Azure Monitor czyli sprawa związana z siecią. Połączenie mojej drukarki z komputerem mam ustanowione jako przewodowe. I tą drogą komputer ja rozpoznaje.
Wiec nadal liczę na jakieś namiary możliwość pobrania lub kupienia takiej biblioteki DLL.

1

Od razu Tobie powiem, że nie musi być żadna taka biblioteka dostępna. Jak rozkodowywałem wszystkie możliwe rodzaje drukarek, skanerów, urządzeń wielofunkcyjnych i faksów firmy Ricoh to musiałem strzelać losowymi drzewkami uidów i patrzeć co mi zwracają. Oczywiście każdy model miał własne upodobania. Grzebanina w ch... Ale faktycznie, w takim razie snmp Tobie nie pomoże (nie sprecyzowałeś czy sieciowo czy przez USB).
Pogrzebię w wolnej chwili, ale jedyne co Tobie pozostaje to komunikacja po porcie COM. W moich domniemaniach aplikacja producenta wysyła do drukarki jakiś ciąg bitów, który rozpoznany przez urządzenie zwraca odpowiednie informacje. Tak na szybko znalazłem, ale nie analizowałem:
https://stackoverflow.com/questions/6911258/sending-data-to-usb-printer-in-c

Jutro może coś mi się uda wygrzebać ciekawszego

Gdybyś jednak miał urządzenie sieciowe to tutaj wycinek mojego starego kodu, który działa dość sprawnie: (Wykorzystuje SnmpSharpNet)

public static class OIDImporter
    {
        public static class Ricoh
        {
            public static string Import(IPAddress RemoteAddress, string OID)
            {
                OctetString community = new OctetString("public");
                AgentParameters param = new AgentParameters(community);
                UdpTarget target = new UdpTarget(RemoteAddress, 161, 2000, 1);
                Pdu pdu = new Pdu(PduType.Get);
                pdu.VbList.Add(OID);
                SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu, param);
                if (result != null)
                {
                    if (result.Pdu.ErrorStatus != 0)
                    {
                        throw new SnmpErrorStatusException("Pobieranie danych poprzez protokół snmp zwróciło błąd Pdu.ErrorStatus=" + result.Pdu.ErrorStatus.ToString(), result.Pdu.ErrorStatus, 0);
                    }
                    else
                    {
                        string Output = result.Pdu.VbList[0].Value.ToString();
                        target.Close();
                        return Output;
                    }
                }
                else
                {
                    throw new Exception("SnmpV1Packet po wykonaniu żądania jest równy null. Nie udało się pobrać danych.");
                }
            }
            public static string[] Import(IPAddress RemoteAddress, string[] OIDs)
            {
                OctetString community = new OctetString("public");
                AgentParameters param = new AgentParameters(community);
                UdpTarget target = new UdpTarget(RemoteAddress, 161, 2000, 1);
                Pdu pdu = new Pdu(PduType.Get);
                foreach (string OID in OIDs)
                    pdu.VbList.Add(OID);
                SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu, param);
                if (result != null)
                {
                    if (result.Pdu.ErrorStatus != 0)
                    {
                        throw new SnmpErrorStatusException("Pobieranie danych poprzez protokół snmp zwróciło błąd Pdu.ErrorStatus=" + result.Pdu.ErrorStatus.ToString(), result.Pdu.ErrorStatus, 0);
                    }
                    else
                    {
                        List<string> Outputs = new List<string>();
                        foreach (Vb v in result.Pdu.VbList)
                        {
                            Outputs.Add(v.Value.ToString());
                        }
                        target.Close();
                        return Outputs.ToArray();
                    }
                }
                else
                {
                    throw new Exception("SnmpV1Packet po wykonaniu żądania jest równy null. Nie udało się pobrać danych.");
                }
            }
            public static string[] importRicohCounters(IPAddress RemoteAddress, string Model, string CopierBlack, string CopierColour, string PrintBlack, string PrintColour, string FaxBlack, string FaxColour, string Black, string Colour)
            {
                if (CopierBlack != null && CopierBlack.Count() < 5)
                    CopierBlack = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + CopierBlack;
                if (CopierColour != null && CopierColour.Count() < 5)
                    CopierColour = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + CopierColour;
                if (PrintBlack != null && PrintBlack.Count() < 5)
                    PrintBlack = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + PrintBlack;
                if (PrintColour != null && PrintColour.Count() < 5)
                    PrintColour = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + PrintColour;
                if (FaxBlack != null && FaxBlack.Count() < 5)
                    FaxBlack = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + FaxBlack;
                if (FaxColour != null && FaxColour.Count() < 5)
                    FaxColour = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + FaxColour;
                if (Black != null && Black.Count() < 5)
                    Black = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + Black;
                if (Colour != null && Colour.Count() < 5)
                    Colour = "1.3.6.1.4.1.367.3.2.1.2.19.5.1.9." + Colour;

                // 10 - Model

                // 0 - CopierBlack
                // 1 - CopierColour
                // 2 - PrintBlack
                // 3 - PrintColour
                // 4 - FaxBlack
                // 5 - FaxColour
                // 6 - TotalBlack
                // 7 - Colour

                Dictionary<int, string> oids = new Dictionary<int, string>();
                if (Model != null)
                    oids.Add(10, Model);
                if (CopierBlack != null)
                    oids.Add(0, CopierBlack);
                if (CopierColour != null)
                    oids.Add(1, CopierColour);
                if (PrintBlack != null)
                    oids.Add(2, PrintBlack);
                if (PrintColour != null)
                    oids.Add(3, PrintColour);
                if (FaxBlack != null)
                    oids.Add(4, FaxBlack);
                if (FaxColour != null)
                    oids.Add(5, FaxColour);
                if (Black != null)
                    oids.Add(6, Black);
                if (Colour != null)
                    oids.Add(7, Colour);

                string[] Imports = Import(RemoteAddress, oids.Select(x => x.Value).ToArray());
                if (Imports == null)
                    return null;

                List<string> output = new List<string>();
                int n = 0;
                foreach (KeyValuePair<int, string> oid in oids)
                {
                    output.Add(CombineResult(oid.Key, Imports[n]));
                    ++n;
                }

                return output.ToArray();
            }
            private static string CombineResult(int ID, string Value)
            {
                string Output = string.Empty;
                switch (ID)
                {
                    case 10:
                        return "Model: " + Value;
                    case 0:
                        return "Kopiarka (Czarno-biały): " + Value;
                    case 1:
                        return "Kopiarka (Kolorowy): " + Value;
                    case 2:
                        return "Drukarka (Czarno-biały): " + Value;
                    case 3:
                        return "Drukarka (Kolorowy): " + Value;
                    case 4:
                        return "Fax (Czarno-biały): " + Value;
                    case 5:
                        return "Fax (Kolorowy): " + Value;
                    case 6:
                        return "Wszystkie (Czarno-biały): " + Value;
                    case 7:
                        return "Wszystkie (Kolorowy): " + Value;
                    default:
                        return string.Empty;
                }
            }
        }

    }

IDataEngine:

public interface IDataEngine
    {
        string Name { get; }
        string[] ImportData(string IP);
        bool Compare(IDataEngine Engine);
    }

I oidy, które były mi potrzebne dla danych silników (jeden silniczek moze obejmować kilka modeli):
https://pastebin.com/XCpuRtXv
A tutaj lista przypisująca silniki do modeli urządzeń. łatwa w użyciu aby wyciągnąć konkretne informacje.
https://pastebin.com/19Mqk5ua

0

Hej

Generalnie pisałem cos podobnego ale do samego pobierania streamu ze skanera używałem biblioteki https://saraff2.rssing.com/chan-63110928/all_p4.html
Biblioteka działa pod vb.net oraz C#
Same skanery polecam zainstalować na komputerach kompatybilnie z Twain v1

0

Dzięki, panowie, za zainteresowanie.
Zaraz zapoznam się z waszymi propozycjami i linkami.

0

gswidwa1:
Pierwszy podany link prowadzi do strony o drukowaniu a nie skanowaniu, a pochodzi sprzed 11 lat, więc dalej tam nie szukałem
Ale ten kod w C# zobaczę, czy da się użyć do mojej drukarki, bo ona też obsługuje połączenie bezprzewodowe.

sight:
Wszedłem na tę stronę:
https://saraff2.rssing.com/chan-63110928/all_p4.html
ale tam linki nie działają. Wyskakuje błąd "Host error", albo "strona nie znaleziona"

0

Ok. ten link działa. Pobrałem stamtąd paczkę Saraff.Twain.VbSamples.zip. Po rozpakowaniu są dwa przykładowe projekty. Ale każdy z nich wywala takie błędy.:

Error	6	Type 'Saraff.Twain.Twain32' is not defined.	D:\Projekty VB2010\Grafika - skaner\Saraff.Twain.VbSamples\sources\Saraff.Twain.Vb.Sample2\Form1.Designer.vb	208	35	Saraff.Twain.Vb.Sample2

Widać, że w obu uruchamianych projektach brakuje elementu Saraff.Twain. a ponieważ w rozpakowanych plikach znalazłem bibliotekę Saraff.Twain.dll. to w ustawieniach projektu dodałem referencje do tej biblioteki. Chciałem sprawdzić czy nad kodem formy mogę teraz dodać instrukcję Imports Saraff.Twain ale kompilator, wyświetlający tę wstępną listę błędów, na to nie pozwalał. Musiałem kliknąć. "Ignoruj błąd", by pozwolił pokazać kod formy. No i udało się najpierw z menu projektu dodać referencję do dllki będącej w katalogu projektu, a potem dało się wpisać nad kodem formy Imports a po kropce podpowiedział resztę czyli Saraff.Twain. Znaczy, że ten zabieg z dodaniem referencji się powiódł. Ale w kodzie formy z kilkunastu podkreślonych słów typu ...as Saraff.Twain zniknęły tylko podkreślenia słowa Saraff,a reszta nadaj jest nierozpoznawalna. Na przykład w Form1.Designer.vb w takim wierszu:

Me._twain32 = New Saraff.Twain.Twain32(Me.components)

nadal podkreśla fragment Saraff.Twain.Twain32. Tyle na razie mi się udało. Dalej liczę na waszą pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1