代码改变世界

Windows Mobile无线打印的实现

2009-10-18 01:34  ruinet  阅读(4034)  评论(12编辑  收藏  举报
       本文介绍Windows Mobile或CE平台下的企业应用中的打印的实现方法和部分打印机指令参考。
 实现主要方法是采用Wifi方式直接向打印机发送打印指令。
       在普通PC上打印是通过安装打印驱动来实现打印,而一般的打印机都没有驱动可以安装在Windows mobile 或其它嵌入式操作系统上。
所以在PDA上要实现打印就只能发送打印指令给打印机了,或通过将数据发送给电脑让电脑来打印。
       在PDA上可以采用WIFi和蓝牙来发送打印指令。可能支持Wifi的打印机相当多些,而且大多打印机都有串口或并口,
因此可以通过TCP转串口或并口使打印机可支持wifi,而且Wifi的移动性更好,蓝牙只适合短距离内的打印。
采用电脑做为服务器端来中转。这样在普通电脑上就通过安装打印机驱动通过串口或并口或网络来打印,
同时也有另一个好处就是可以同时和多个PDA客户端建立打印连接。
如果通过PDA直接向打印机发送打印指令,一般的打印机只能和一个PDA建立连接。
(一)确定打印机的IP和端口
   网络打印的端口一般都是9100,如果不确定,可以在PC上安装下的驱动,看下默认的端口同时测试下打印机是否可打印。
    9100端口的介绍可看下面的链接
   http://blog.csdn.net/gracexu/archive/2007/11/23/1899751.aspx
 (二)通过Socket与打印机建立Tcp连接,并发生打印机指令。
     需建立tcp连接,不能使用udp直接发送打印命令。
     同时在PDA设备上最好采用异步socket,因为无线环境不稳定,同时PDA的性能不如普通电脑,如果通过同步Socket很容易导致UI进程死掉。
     基本步骤:
Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress 
= IPAddress.Parse(“192.168.1.4”);
IPEndPoint ipEndPoint 
= new IPEndPoint(ipAddress, 9100);
//异步连接
mySocket.BeginConnect(ipEndPoint, new AsyncCallback(OnConnect), null);
//异步发送打印数据及指令
mySocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend), null);

为了更好的通用性最好封装一个异步Socket类,这样不仅可以用在发送打印指令下,发送其他数据给主机也可以使用:

下面是我封装的一个异步socket类:

异步Socket类

在UI中调用DeviceSoket

DeviceSocket=socket = new DeviceSocket();
socket.Notify 
+= new NotifyEventHandler(socket_Notify);

//socket异步通知
void socket_Notify(NotifyEvents nEvent, string message, object data)
{
      
//返回给UI进程
  this.Invoke(new NotifyEventHandler(OnSocketNofity), 
              
new object[] { nEvent, message, data});
}

//在UI进程中显示Socket通知
 private void OnSocketNofity(NotifyEvents eventType, string message, object data)
 {
      
switch (eventType)
      {
        
case NotifyEvents.DataReceived:
          
// 接收到数据:data
           break;
        
case NotifyEvents.Connected:
            
//连接成功
          break;
        
case NotifyEvents.ConnectError:
            
//连接错误
          break;
        
case NotifyEvents.Disconnected:
           
//断开连接
          break;
        
case NotifyEvents.SendError:
          
//发送数据错误
          break;
        
case NotifyEvents.OtherError:
           
//其他错误
          break;
      }

    } 

连接成功后可以根据PDA扫描的数据动态生成打印的直接通过socket 发送给打印机就可以了。
类似:
  byte[] buffer = commandBuilder.GetPrintCommands(barcode);
  socket.Send(buffer);

(三)斑马和Intermec打印机指令参考
仅供参考具体参考相关打印机指令手册 
Zebra打印指令

Intermes打印指令

(四)实际应用还需考虑的问题  

1.判断是否打印成功   
 要看打印机是否支持,就是在打印成功后会有相应的指令发出,通过接收打印机的指令,就可以判断是否成功。  

2.判断没有打印成功的数据,并在网络恢复是能自动打印。 


free web counter