惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
云风的 BLOG
云风的 BLOG
美团技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
雷峰网
雷峰网
P
Proofpoint News Feed
IT之家
IT之家
人人都是产品经理
人人都是产品经理
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
T
The Blog of Author Tim Ferriss
月光博客
月光博客
V
Visual Studio Blog
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
Project Zero
Project Zero
U
Unit 42
T
Tor Project blog
Scott Helme
Scott Helme
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
I
InfoQ
Cloudbric
Cloudbric
P
Proofpoint News Feed
The Cloudflare Blog
H
Heimdal Security Blog
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
Attack and Defense Labs
Attack and Defense Labs
有赞技术团队
有赞技术团队
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
博客园 - 【当耐特】
Security Latest
Security Latest
The Register - Security
The Register - Security
F
Fortinet All Blogs
I
Intezer
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
NISL@THU
NISL@THU
T
Tenable Blog

博客园 - ruinet

WCF通用服务请求类 使用MVP模式实现B/S和C/S平台的功能通用 WCF中使用扩展行为来验证连接的用户 Microsoft.Practices.Unity依赖注入使用实例 简洁的Asp.net菜单控件 使用HTML,CSS快速导出数据到Excel 软件技术网站精选 CakePHP架构入门 升级Sql Server 2000到Sql Server 2005中要注意的问题 asp.net web开发综合技能 编写第一个Silverlight程序 Saas学习 在Windows Mobile上控制输入法 - ruinet - 博客园 在Windows Mobile创建桌面快捷方式 在仿真设备中使用主机网络 CSS,JavaSript,Html实用小代码 重启PocketPC移动设备 使用Ajax控件引发性能问题 智能移动项目打包发布经验交流
Windows Mobile无线打印的实现
ruinet · 2009-10-18 · via 博客园 - ruinet

2009-10-18 01:34  ruinet  阅读(4060)  评论()    收藏  举报

       本文介绍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.判断没有打印成功的数据,并在网络恢复是能自动打印。