纯屌丝版无线扫描枪的实现

最近中邮小包全折,貌似要死掉一大批小物流公司,因为我们都在持“货”观望。

物流涨价,最直接影响的就是我们这些做小单的,MB幸苦钱全充当运费了!我们不涨价是等死,涨价也是等死!

 

等死归等死,货还是要发的,订单还是要处理的,一大堆货堆在家里,输单号输到手软,想买个扫描枪,但是想想可能这种情况不会持续太长时间,买了等于浪费。

 

怎么办呢?首先想到是我那个半拉子ios 扫描程序,如果写下去还要花相当长的时间去继续学习ios,可能等我学好了,我自己也不知道在哪里了。

我搜了搜手机扫描枪的应用,有个叫虫虫扫描枪的,貌似还不错,但是没有地方下载电脑端!白搭。还有另外一个,电脑端是用.NET 2.0 开发的,需要 .NET 2.0的运行库!200多M,还下不来!(老是跳到.NET 3.5),牙的还死嗑 .NET 2.0。

自己写一个吧?ios没学好,android 不会,那只能试试 HTML5 了。以前看过 AppCan 的介绍,就用它写手机端,电脑端用C#做。

手机端主要就是 uexSocketMgr uexScanner 两个对象,没有技术含量,照着示例写就是了。本来想做成多个标签的,一个标签用来设置 socket ,一个标签用来扫描,但是两个标签就是两个网页,A页面的javascript 对象在B页面是不能直接访问的,而且这种应用,一切换标签,另外一个标签就释放了(关闭了)。

AppCan 的模拟器其实是一个Chrome 浏览器,F12可以直接打开调试工具。用这个调试工具看了一下,内容页是通过 iframe 显示的,有 iframe 就可以用 parent ,但是 parent 是哪个页面呢?是一个你不可以访问编辑的页面!

Parent 用不了,那只能在一个页面里又设置Socket 又扫描了。

放上代码供有需要的屌丝参考:

  1 <!DOCTYPE html>

  2 

  3 <html class="um landscape min-width-240px min-width-320px min-width-480px min-width-768px min-width-1024px">

  4 

  5 <head>

  6 

  7 <title></title>

  8 

  9 <meta charset="utf-8">

 10 

 11 <meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">

 12 

 13     <link rel="stylesheet" href="css/ui-input.css">

 14 

 15 <link rel="stylesheet" href="css/ui-res.css">

 16 

 17 <link rel="stylesheet" href="css/ui-btn.css">

 18 

 19 <link rel="stylesheet" href="css/ui-base.css">

 20 

 21 <link rel="stylesheet" href="css/ui-box.css">

 22 

 23 <link rel="stylesheet" href="css/ui-color.css">

 24 

 25 <script src="js/zy_control.js"></script>

 26 

 27 <script src="js/zy_click.js"></script>

 28 

 29 </head>

 30 

 31 <body class="um-vp c-m15" ontouchstart>

 32 

 33     <div class="ub ub-ver">

 34 

 35       

 36 

 37        <button onclick="uexScanner.open()" ontouchstart="zy_touch('btn-act')" style="width:10em;height:10em;">扫描</button>

 38 

 39       

 40 

 41        <!--文本开始-->

 42 

 43        <div class="c-org1 uba uc-a b-gra us-i uinput uinn4">   

 44 

 45         <input placeholder="hello"  type="text" class="uc-a" id="result1">  

 46 

 47        </div> 

 48 

 49        <!--文本结束-->

 50 

 51  

 52 

 53     </div>

 54 

 55 </body>

 56 

 57 <script>

 58 

 59 zy_init();

 60 

 61  

 62 

 63 var createTcpClient = function(ip, port){

 64 

 65     uexSocketMgr.closeSocket("1");

 66 

 67     uexSocketMgr.createTCPSocket("1");

 68 

 69     uexSocketMgr.cbConnected = function(opId,dataType,data){

 70 

 71        uexScanner.cbOpen = ScannerForSendSuccessCallBack;

 72 

 73        uexSocketMgr.sendData("1","here");

 74 

 75     }

 76 

 77     uexSocketMgr.setInetAddressAndPort("1",ip , port);

 78 

 79 }

 80 

 81  

 82 

 83 var sendData = function(msg){

 84 

 85     uexSocketMgr.sendData("1", msg);

 86 

 87 }

 88 

 89    

 90 

 91 var ScannerFailedCallBack = function(opCode, dataType, data){

 92 

 93     alert("data:"+data+"opCode:"+opCode+"dataType:"+dataType);

 94 

 95 }

 96 

 97  

 98 

 99  

100 

101 window.uexOnload = function(type){

102 

103     if(!type){

104 

105        uexWindow.setBounce("1");

106 

107        uexWindow.showBounceView("0","#FFF","0");

108 

109        uexWindow.showBounceView("1","#FFF","0");    

110 

111       

112 

113        uexWindow.setReportKey('0', '1');

114 

115        uexWindow.onKeyPressed = function(keyCode){

116 

117            uexWidget.finishWidget('');

118 

119        }

120 

121        connect();

122 

123     }

124 

125 }

126 

127  

128 

129 var ScannerForConnectSuccessCallBack = function(opCode, dataType, data){

130 

131     var obj = eval('('+data+')');

132 

133     code = obj.code.split(',');

134 

135     if (code.length == 2) {

136 

137        createTcpClient(code[0], code[1]);

138 

139     }else{

140 

141        alert("不能识别");

142 

143        connect();

144 

145     }

146 

147 }

148 

149  

150 

151 var connect = function(){  

152 

153     alert("请连接电脑端,按如下步骤操作:1,开启电脑端监控软件。2,开始监控。3,扫描电脑端显示的二维码");

154 

155     uexScanner.cbOpen = ScannerForConnectSuccessCallBack;

156 

157     uexScanner.open();

158 

159 }

160 

161  

162 

163 var ScannerForSendSuccessCallBack = function(opCode, dataType, data){

164 

165     var obj = eval('('+data+')');

166 

167     $$("result1").value = obj.code; ;

168 

169     sendData(obj.code);

170 

171 }

172 

173  

174 

175 </script>

176 

177 </html>

电脑端的工作就是创建一个 SocktListener 监听客户端传来的消息,代码简单。

用过扫描枪的都知道,扫描的结果可以直接输出到当前活动窗体的当前光标位置。要实现这个功能我第一直觉是模拟键盘按键。但是如果传来的是汉字呢?如果开启了五笔、拼音输入法呢?显然这条路行不通。

 

还好,WinForm 提供了一个很简单的方法SendKeys.SendWait:

向活动应用程序发送给定的键,然后等待消息被处理

 

非常简单,有了这个方法,就不用四处找WIN32 API 了。但是这个方法的参数会将“某些”连在一起的字符串进行转意。不管了,反正我的目的就是扫描条形码,出现转意字符的机率基本为0.

 

条形的编码格式还有些讲究,不同的编码格式要求不同的长度和字符串格式。我这里要生成的是订单号码,15位,选择CODE 128是最合适的,另外生成条形码我用的是 zxing.net。

 

另外一点就是将条形码插入到excel 里,生成excel 我用的是NOPI。NOPI的HSSFClientAnchor 类的构造函数所需要的参数真是让人有去死的感觉:

new HSSFClientAnchor(250, 0, 500, 100, 1, row + 3, 1, row + 5);

第一个参数是指要插入图片左上角在单元格内的位置x(什么单位?我也不知道,记得在哪里看过,但是忘了)

第二个参数是左上角在单元格的位置y

第三个参数是第一个参数加上要显示的图片的宽度的结果。

第四个参数是第二个参数加上要显示的图片的高度的结果。

上面那句的代码的意思是:

在某单元格的(250,0)处插入图片,图片显示为250 x 100 的大小。

其余参数不解释,我也解释不清楚。

 

看累了吧,我也很累,昨天通宵搞的,连手机端带电脑端,电脑端还好说,那个 AppCan 调试起来又是另一番想死的感觉。

最后附上程序,供各位纯屌们体验一下:

http://files.cnblogs.com/xling/TNS.7z

程序有些小BUG,请见谅。

你可能感兴趣的:(实现)