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

推荐订阅源

F
Full Disclosure
WordPress大学
WordPress大学
小众软件
小众软件
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
腾讯CDC
量子位
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
Scott Helme
Scott Helme
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
Jina AI
Jina AI
Attack and Defense Labs
Attack and Defense Labs
S
SegmentFault 最新的问题
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
Google Online Security Blog
Google Online Security Blog
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
罗磊的独立博客
L
LINUX DO - 最新话题
博客园 - Franky
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
The Last Watchdog
The Last Watchdog
J
Java Code Geeks
AI
AI
C
Cisco Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
Help Net Security
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
I
Intezer
S
Securelist

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