Я соединяю основной пункт Sale (НА МЕСТЕ ПРОДАЖИ) система в C#, который должен распечатать к принтеру получения и открыть наличную секцию. Я должен использовать Microsoft Point of Service SDK?
Я играл вокруг с печатью к своему принтеру Samsung с помощью драйвера Windows, который шел с ним, и это, кажется, работает отлично. Я принимаю, хотя это, другие принтеры не могут идти с драйверами Windows и затем я застрял бы? Или я смог бы просто использовать Универсальный Драйвер / текстовый Драйвер для печати к какому-либо принтеру, который поддерживает его?
Для наличной секции я должен был бы отправить коды непосредственно в COM-порт, который меня устраивает, если это сохраняет меня стычка помощи клиентам установить драйверы OPOS в там системах.
Я спускаюсь по неправильному пути здесь?
Если просто просмотреть, система точек продаж MS основана на Window Embedded, на самом деле это просто способ получить более низкую стоимость за единицу и меньшую лицензию на ОС Windows. Кажется, есть некоторые API-интерфейсы, специфичные для POS, но вы, похоже, хотите использовать свой собственный, вы все равно, вероятно, захотите каким-то образом использовать Windows Embedded. Скорее всего, безопасность будет заданием 1.
Чтобы напрямую управлять принтером чеков, прочтите команды ESC / POS . Эти команды позволят вам открывать кассовый ящик и печатать штрих-коды и изображения на квитанциях.
Однако, поскольку вы используете C #, возможно, будет проще использовать библиотеку классов Microsoft Point of Service .
Я никогда не занимался программным обеспечением того, о чем вы спрашиваете, но у меня есть некоторый опыт работы с POS-системами, который может вам помочь.
То, что вы делаете для печати и кассового ящика, сильно зависит от оборудования, с которым вы работаете. И существует широкий набор оборудования.
В каждой POS-системе, которую я видел, есть множество драйверов для каждого мыслимого принтера чеков и денежного ящика, поэтому, если вы не разрабатываете полноценную систему, просто сконцентрируйтесь на конкретном оборудовании, которым вы собираетесь пользоваться. работаю с. Даже в этом случае постарайтесь хорошо разложить свой код, чтобы получить максимальную пользу от шаблона стратегии. Если вы работаете с более чем одним типом устройств, позже вы будете благодарить себя за то, что реализовали его таким образом.
Для печати существует 3 основных типа принтеров, с которыми вы можете столкнуться:
Я считаю, что большинство, если не все, современные принтеры чеков попадают в категорию № 2, но вы можете столкнуться с устаревшей системой, использующей принтер из категории №1.
Для категории № 2 вы должны иметь возможность использовать стандартный интерфейс печати .NET. Единственная проблема может заключаться в отправке управляющего кода для активации режущего механизма (если он есть) в соответствующее время (а); или драйвер принтера может сделать это автоматически в зависимости от длины бумаги, указанной в алгоритме печати. Опять же, я никогда не пробовал этого, но если у вас есть доступ к принтеру чеков, вы сможете быстро разобраться с этим.
Если вы имеете дело с одним клиентом, у которого есть принтер в категории №1, вы можете привести веский аргумент, что купить новый принтер в категории №2 будет дешевле, чем платить вам. разработать тупиковый драйвер для печати на имеющемся оборудовании.
Я менее знаком с денежными ящиками, чем с принтерами, но знаю два варианта в отношении связи и организации оборудования:
Первый тип работает, посылая управляющие коды в порт принтера (который принтер, надеюсь, проигнорирует и не выплюнет весь рулон чековой бумаги), в то время как для второго вам нужно будет выполнить связь через COM-порт. В любом случае управляющие коды зависят от оборудования. В большинстве случаев их можно найти в руководстве пользователя, но иногда технический писатель чувствовал себя особенно плохо в тот день, и вам придется копаться в Интернете.
Это, вероятно, немного другой ответ на то, что вы искали (!) ...
При работе с «внешними интерфейсами» (например, с принтерами, кассовыми аппаратами и т. Д.) Всегда абстрактные вещи. Вы, вероятно, захотите реализовать стратегии - Паттерн-стратегия .
Вы создаете интерфейс для розыгрыша денег:
public interface ICashDrawer
{
void Open();
}
Реализации обеспечения:
Debug.WriteLine
, поэтому вам не нужно подключать деньги к компьютеру во время разработки , например
public class ComPortCashDrawer : ICashDrawer
{
public void Open()
{
// open via COM port etc
}
}
public class DebugWriterCashDrawer : ICashDrawer
{
public void Open()
{
Debug.WriteLine("DebugWriterCashDrawer.Open() @ " + DateTime.Now);
}
}
Опять же, для печати у вас есть интерфейс печати, который принимает данные:
public interface IRecieptPrinter
{
bool Print(object someData);
}
затем вы выполняете одну или несколько реализаций.
например.
public class BasicRecieptPrinter : IRecieptPrinter
{
public bool Print(object someData)
{
// format for a basic A4 print
return true; // e.g. success etc
}
}
public class SpecificXyzRecieptPrinter : IRecieptPrinter
{
public bool Print(object someData)
{
// format for a specific printer
return true; // e.g. success etc
}
}
public class PlainTextFileRecieptPrinter : IRecieptPrinter
{
public bool Print(object someData)
{
// Render the data as plain old text or something and save
// to a file for development or testing.
return true; // e.g. success etc
}
}
Что касается SDK, если в дальнейшем вы обнаружите, что он вам нужен по какой-то причине, вы пишете реализации с использованием SDK. Со временем у вас может появиться несколько способов взаимодействия с различными внешними устройствами. В один прекрасный день клиент может получить новый денежный розыгрыш и т.д. и т.п.
Ясно, я могу конкретизировать, что я имею в виду, если вы хотите, но вы, вероятно, уловили мою точку зрения.
Ваше приложение настраивается с соответствующими реализациями при запуске, вы можете также взглянуть на Внедрение зависимостей , и вам будет проще, если вы воспользуетесь контейнером для разрешения типов.
var printer = container.Resolve<IRecieptPrinter>();
PK: -)