C# 热敏打印机 Socket 网络链接 打印 图片 (一)

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace POSPrinter
{
    ///   <summary> 
    ///   POSPrinter的摘要说明。
    ///   此类处理网络打印,使用了IP端口.
    ///   </summary> 
    public class NetPOSPrinter 
    {
        string ipPort = "127.0.0.1";

        public NetPOSPrinter()
        {
        }

        public NetPOSPrinter(string IpPort)
        {
            this.ipPort = IpPort;//打印机端口 
        }

        ///   <summary> 
        ///   输出文字到打印机 
        ///   </summary> 
        ///   <param   name= "str "> 要打印的内容 </param> 
        public void PrintLine(string str)
        {
            //建立连接
            IPAddress ipa = IPAddress.Parse(ipPort);
            IPEndPoint ipe = new IPEndPoint(ipa, 9100);//9100为小票打印机指定端口
            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            soc.Connect(ipe);

            //string str= "hello,123456789,大家好! ";

            byte[] b = System.Text.Encoding.GetEncoding("GB2312").GetBytes(str);
            soc.Send(b);
            soc.Close();
        }


        public void PrintPic(Bitmap bmp)
        {
            //把ip和端口转化为IPEndPoint实例
            IPEndPoint ip_endpoint = new IPEndPoint(IPAddress.Parse(ipPort), 9100);

            //创建一个Socket
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


            //连接到服务器
            socket.Connect(ip_endpoint);
            //应对同步Connect超时过长的办法,猜测应该是先用异步方式建立以个连接然后,
            //确认连接是否可用,然后报错或者关闭后,重新建立一个同步连接                    

            //socket.SendTimeout = 1000;

            //初始化打印机,并打印

            Byte[] byte_send = Encoding.GetEncoding("gb18030").GetBytes("\x1b\x40");

            //发送测试信息
            socket.Send(byte_send, byte_send.Length, 0);


            byte[] data = new byte[] { 0x1B, 0x33, 0x00 };
            socket.Send(data, data.Length, 0);
            data[0] = (byte)'\x00';
            data[1] = (byte)'\x00';
            data[2] = (byte)'\x00';    // Clear to Zero.

            Color pixelColor;

            // ESC * m nL nH 点阵图
            byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };

            escBmp[2] = (byte)'\x21';

            //nL, nH
            escBmp[3] = (byte)(bmp.Width % 256);
            escBmp[4] = (byte)(bmp.Width / 256);

            // data
            for (int i = 0; i < (bmp.Height / 24) + 1; i++)
            {
                socket.Send(escBmp, escBmp.Length, 0);

                for (int j = 0; j < bmp.Width; j++)
                {
                    for (int k = 0; k < 24; k++)
                    {
                        if (((i * 24) + k) < bmp.Height)   // if within the BMP size
                        {
                            pixelColor = bmp.GetPixel(j, (i * 24) + k);
                            if (pixelColor.R == 0)
                            {
                                data[k / 8] += (byte)(128 >> (k % 8));
                            }
                        }
                    }

                    socket.Send(data, 3, 0);
                    data[0] = (byte)'\x00';
                    data[1] = (byte)'\x00';
                    data[2] = (byte)'\x00';    // Clear to Zero.
                }
                
                byte_send = Encoding.GetEncoding("gb18030").GetBytes("\n");

                //发送测试信息
                socket.Send(byte_send, byte_send.Length, 0);
            } // data

            byte_send = Encoding.GetEncoding("gb18030").GetBytes("\n");

            //发送测试信息
            socket.Send(byte_send, byte_send.Length, 0);
            socket.Close();
        }


        ///   <summary> 
        ///   打开钱箱 
        ///   </summary> 
        public void OpenCashBox()
        {
            IPAddress ipa = IPAddress.Parse(ipPort);
            IPEndPoint ipe = new IPEndPoint(ipa, 9100);//9100为小票打印机指定端口
            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            soc.Connect(ipe);
            char[] c = { Convert.ToChar(27), 'p', Convert.ToChar(0), Convert.ToChar(60), Convert.ToChar(255) };
            byte[] b = System.Text.Encoding.GetEncoding("GB2312").GetBytes(c);
            soc.Send(b);
            soc.Close();
        }


    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏飞扬的花生

将Json数据保存在静态脚本文件中读取

      一些常用的数据例如一些网站的区域信息被改变的可能性不大,一般不通过请求获取,于是我们选择存在静态文件中,例如以下Demo: 1.动态加载Json数据...

30260
来自专栏跟着阿笨一起玩NET

ASP.NET MVC中使用FluentValidation验证实体

本文转载:http://www.cnblogs.com/libingql/p/3801704.html

8510
来自专栏游戏杂谈

Unity项目中文字的统一管理

一款游戏在研发初期就需要考虑多语言的问题,否则后期在进行多国语言版本时就面临着巨大的成本。鉴于之前页游的经验,其它同事设计出读取Excel的方式来管理所有的文字...

14210
来自专栏hbbliyong

C# ini文件读写类

VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面是一个C# ini文件读写类, 从网上收集的,很全,就是没有对...

34460
来自专栏hbbliyong

WCF 获取客户端IP

public class Service2 : IService2 { public User DoWork() ...

35740
来自专栏跟着阿笨一起玩NET

DataTable中DefaultValue的使用

本文转载:http://blog.sina.com.cn/s/blog_65b145b401019ld1.html

13610
来自专栏ASP.NET MVC5 后台权限管理系统

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③

上一节我们讲了如何捕获异常和记录日志,这一节我们讲,没有捕获的或者忘记捕获的异常包括404错误等,我们统一处理这个异常。 这一讲是利用 Application_...

30580
来自专栏跟着阿笨一起玩NET

关于asp.net与winform导出excel的代码

一、asp.net中导出Execl的方法: 在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在...

12010
来自专栏.NET开发那点事

使用签名来保证ASP.NET MVC OR WEBAPI的接口安全

当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数据。如果我们没有完善的安全机制则很容易被别用心的人伪造请求而篡改数据。 所以我们需要使用...

15420
来自专栏码农分享

2.HtmlAgilityPack 爬取优酷电影名进阶(所有分类+多线程)

上一章节中我们实现了对优酷单页面的爬取,简单进行回顾一下,使用HtmlAgilityPack库,对爬虫的爬取一共分为三步

14220

扫码关注云+社区

领取腾讯云代金券