目前的扫描仪都还不够智能,没有提供扫描仪和手机之间的直接通信。所以我们可以通过PC作为桥接,使用Dynamic .NET TWAIN在PC上搭建一个扫描服务,实现手机对扫描仪的远程控制。这个简单的sample只需要在手机上点击扫描按钮,就可以触发扫描仪工作,获取图像。

参考:Wireless TWAIN Document Scanning on Android

PC上的TWAIN扫描

下载Dynamic .NET TWAIN SDK

下载JSON.NET

运行Visual Studio,创建一个Windows Forms工程:

添加引用:DynamicDotNetTWAIN和Newtonsoft.Json

初始化TWAIN组件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private  void  initTWAINComponent()
         {
             dynamicDotNetTwain =  new  Dynamsoft.DotNet.TWAIN.DynamicDotNetTwain();
             dynamicDotNetTwain.IfShowUI =  false ;
             dynamicDotNetTwain.IfThrowException =  true ;
             dynamicDotNetTwain.MaxImagesInBuffer = 1;
             dynamicDotNetTwain.IfAppendImage =  false ;
             dynamicDotNetTwain.IfDisableSourceAfterAcquire =  true ;
  
             int  iNum;
             dynamicDotNetTwain.OpenSourceManager();
             for  (iNum = 0; iNum < dynamicDotNetTwain.SourceCount; iNum++)
             {
                 comboBox1.Items.Add(dynamicDotNetTwain.SourceNameItems(Convert.ToInt16(iNum)));
             }
             if  (iNum > 0)
                 comboBox1.SelectedIndex = 0;
  
             dynamicDotNetTwain.OnPostAllTransfers += dynamicDotNetTwain_OnPostAllTransfers;
         }

使用TCPListener创建Socket服务:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading.Tasks;
  
using  System.IO;
using  System.Net;
using  System.Net.Sockets;
  
using  Newtonsoft.Json;
using  Newtonsoft.Json.Linq;
  
namespace  WirelessTWAIN
{
     class  ServerManager
     {
  
         TcpListener server =  null ;
         NetworkStream stream =  null ;
         WirelessTWAIN twain =  null ;
         Byte[] imageData;
  
         public  ServerManager(WirelessTWAIN twain)
         {
             this .twain = twain;
         }
  
         public  void  run()
         {
             try
             {
                 // Set the TcpListener on port 13000.
                 Int32 port = 2015;
                 IPAddress localAddr = IPAddress.Parse( "192.168.8.84" );  // server IP
  
                 // TcpListener server = new TcpListener(port);
                 server =  new  TcpListener(localAddr, port);
  
                 // Start listening for client requests.
                 server.Start();
  
                 // Buffer for reading data
                 Byte[] bytes =  new  Byte[256];
                 String data =  null ;
  
                 // Enter the listening loop.
                 while  ( true )
                 {
                     Console.Write( "Waiting for a connection... " );
  
                     // Perform a blocking call to accept requests.
                     // You could also user server.AcceptSocket() here.
                     TcpClient client = server.AcceptTcpClient();
                     Console.WriteLine( "Connected!" );
                     data =  null ;
  
                     // Get a stream object for reading and writing
                     stream = client.GetStream();
  
                     int  i;
  
                     // Loop to receive all the data sent by the client.
                     while  ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                     {
                         // Translate data bytes to a ASCII string.
                         data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                         Console.WriteLine( "Received: {0}" , data);
  
                         JObject jobj = JObject.Parse(data);
                         JToken token = jobj.GetValue( "type" );
                         if  (token !=  null )
                         {
                             string  result = token.ToString();
                             Console.WriteLine( "Received: {0}" , result);
  
                             if  (result.Equals( "data" ))
                             {
                                 stream.Write(imageData, 0, imageData.Length);
                                 stream.Flush();
                                 imageData =  null ;
                             }
                             else  if  (result.Equals( "info" ))
                             {
                                 twain.scanImage();
                             }
                         }
                     }
  
                     stream =  null ;
                     // Shutdown and end connection
                     Console.WriteLine( "close connection" );
                     client.Close();
                 }
             }
             catch  (SocketException e)
             {
                 Console.WriteLine( "SocketException: {0}" , e);
             }
             finally
             {
                 // Stop listening for new clients.
                 server.Stop();
             }
  
         }
  
         public  void  prepareData(Byte[] data)
         {
             this .imageData = data;
         }
  
         public  void  sendData()
         {
             if  (stream !=  null  && imageData !=  null )
             {
                 JObject jobj =  new  JObject();
                 jobj.Add( "length" , imageData.Length);
                 string  msg = jobj.ToString();
                 byte [] msgBytes = System.Text.Encoding.ASCII.GetBytes(msg);
                 stream.Write(msgBytes, 0, msgBytes.Length);
                 stream.Flush();
             }
         }
     }
}

Android手机客户端接收显示图像

新建Android工程,添加一个Button和ImageView。

申明权限:

?
1
< uses-permission  android:name = "android.permission.INTERNET"/>

创建socket链接:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package  com.dynamsoft.io;
  
import  java.io.BufferedInputStream;
import  java.io.BufferedOutputStream;
import  java.io.ByteArrayOutputStream;
import  java.io.IOException;
import  java.net.Socket;
import  java.net.UnknownHostException;
  
import  com.dynamsoft.ui.UIListener;
import  com.google.gson.JsonElement;
import  com.google.gson.JsonObject;
import  com.google.gson.JsonParseException;
import  com.google.gson.JsonParser;
  
public  class  SocketClient  extends  Thread {
     private  Socket mSocket;
     private  UIListener mUIListener;
  
     public  SocketClient(UIListener client) {
         mUIListener = client;
     }
  
     @Override
     public  void  run() {
         // TODO Auto-generated method stub
         super .run();
  
         try  {
             mSocket =  new  Socket( "192.168.8.84" 2015 );
             BufferedOutputStream outputStream =  new  BufferedOutputStream(mSocket.getOutputStream());
             BufferedInputStream inputStream =  new  BufferedInputStream(mSocket.getInputStream());
             ByteArrayOutputStream out =  new  ByteArrayOutputStream();
  
             JsonObject jsonObj =  new  JsonObject();
             jsonObj.addProperty( "type" "info" );
  
             byte [] buff =  new  byte [ 256 ];
             int  len =  0 ;
             String msg =  null ;
             outputStream.write(jsonObj.toString().getBytes());
             outputStream.flush();
             int  sum =  0 ;
             int  total =  0 ;    
             boolean  isDataReady =  false ;
  
             while  ((len = inputStream.read(buff)) != - 1 ) {
                 if  (!isDataReady) {
                     msg =  new  String(buff,  0 , len);
  
                     // JSON analysis
                     JsonParser parser =  new  JsonParser();
                     boolean  isJSON =  false ;
                     JsonElement element =  null ;
                     try  {
                         element =  parser.parse(msg);
  
                         if  (element !=  null ) {
                             isJSON =  true ;
                         }
                     }
                     catch  (JsonParseException e) {
                         System.out.println( "exception: "  + e);
                     }
  
                     if  (isJSON) {
                         System.out.println(element.toString());
                         JsonObject obj = element.getAsJsonObject();
                         element = obj.get( "length" );
                         if  (element !=  null ) {
                             total = element.getAsInt();
                             jsonObj =  new  JsonObject();
                             jsonObj.addProperty( "type" "data" );
                             outputStream.write(jsonObj.toString().getBytes());
                             outputStream.flush();
                             isDataReady =  true ;
                         }
                     }
                 }
                 else  {
                     out.write(buff,  0 , len);  
                     sum += len;
                     if  (sum == total) {
                         break ;
                     }
                 }
             }
  
             mUIListener.updateImage(out);
             System.out.println( "close" );
             outputStream.close();
             inputStream.close();
         catch  (UnknownHostException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         finally  {
             try  {
                 mSocket.close();
                 mSocket =  null ;
             catch  (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
  
         System.out.println( "data sent" );
     }
  
     public  void  close() {
         if  (mSocket !=  null ) {
             try  {
                 mSocket.close();
             catch  (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
     }
}

源码

https://github.com/DynamsoftRD/Wireless-TWAIN-Scan-on-Android

?
1
git clone https://github.com/DynamsoftRD/Wireless-TWAIN-Scan-on-Android.git

用手机远程控制扫描仪相关推荐

  1. 计算机手机远程控制,手机怎么远程控制电脑?手机远程控制电脑步骤详解

    随着互联网技术的发达,手机和电脑一样成为人们生活中很重要的东西,也许是关乎人们的工作也许是生活中的事情,其实都很重要.但是电脑的体积还是比较大的,相对于手机来说,携带总是不方便的,就连 笔记本电脑 也 ...

  2. 有了手机远程控制手机的软件,在家突然收到工作任务也不怕

    现在越来越多的企业开始为员工配备的专用工作手机,考量因素有很多:要对工作沟通文字.通话记录实施监控:要保护客户资料安全,担心员工带走客户资源:要统计员工的工作量-- 原本有一台私人手机,现在再来一两台 ...

  3. 手机远程管理服务器文件,手机远程控制服务器文件

    手机远程控制服务器文件 内容精选 换一换 为安全起见,弹性云服务器登录时建议使用密钥方式进行身份验证.因此,您需要使用已有密钥对或新建一个密钥对,用于远程登录身份验证.新建密钥对如果没有可用的密钥对, ...

  4. android3.0快捷键,向日葵新出版本安卓3.0手机远程控制手机详细教程

    向日葵新出版本的安卓3.0手机远程控制手机正式发布,先看看视频演示: 下面介绍详细教程: 物料准备: 1.智能手机两部(其中一部必须是安卓手机,以苹果手机和小米手机为例) 2.向日葵远程控制软件 具体 ...

  5. 手机虚拟服务器app,手机远程控制服务器的app

    手机远程控制服务器的app 内容精选 换一换 域名生成算法(Domain Generation Algorithm,DGA)是一种利用随机字符生成命令与控制(Command and Control,C ...

  6. 安卓手机远程控制app

    用一台安卓手机完全控制另外一台安卓手机,想一想是不是很酷炫,那么今天他来了 安卓手机远程控制app下载地址58588.goho.co

  7. 安卓手机变成横屏_学会用手机远程控制电脑,出门在外,随时随地也能轻松办公!...

    日常工作生活中,有时我们外出,有些情况有些事情需要使用个人电脑或者公司电脑,这时候我们就可以通过手机远程控制电脑来解决问题.今天我们就给大家分享一下手机如何远程控制电脑? 1.首先,我们需要在手机端和 ...

  8. 使用手机远程控制电脑

    使用手机远程控制电脑 使用TeamViewer 首先下载TeamViewer,下载地址: http://www.xp510.com/xiazai/Networking/Assistant/12130. ...

  9. 用手机远程控制电脑的软件 ---TeamViewer远程控制

    透过TeamViewer免费版即可在旅途中远端控制电脑! 无论您身在何处,皆可为亲朋好友轻松解决电脑问题.您也可以于旅途中轻松存取.编辑家用电脑文件. 功能: 1.可支援亲朋好友并存取无人看管的电脑( ...

最新文章

  1. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库
  2. [Python]架设python虚拟环境以及部署PythonWeb服务
  3. linux怎样自制库_苹果开源Swift System,增加Linux支持
  4. [转载]Qt之获取本机网络信息_vortex_新浪博客
  5. 数据库安全性概念与自主安全性机制
  6. 偷懒才能编程序——计算机达人成长之路(18)
  7. 路径太深 无法删除文件夹 之解决办法
  8. IEEE 类各种模板下载--以IEEE Access为例
  9. ResNet网络结构解析--Pytorch
  10. FME突然无法连接FMS服务器
  11. 记忆GRE词汇三大原则
  12. DNS中A记录和CNAME的区别 什么是CNAME
  13. Sqli-Labs Less1-16关详细讲解
  14. Matlab如何提取fig文件中的数据
  15. OTA频发的“大数据杀熟”,想要治你不容易?
  16. gif图片裁切、压缩导出无水印图片(保姆级教程,亲测可用)
  17. RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublas‘
  18. 华为分布式文件存储服务器配置,分布式存储服务器
  19. 稳压、调压、监控、DC/DC电路大全
  20. Lifekeeper 安装的问题

热门文章

  1. linux系统FW升降级步骤,使用fwupd为Ubuntu 18.04系统更新固件的方法
  2. android 生成aar文件,Android 中.aar文件生成方法与用法
  3. 人人开源 / renren-security/小记(二)
  4. c实现 图像dither算法_Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结...
  5. android仿酷狗界面,Android仿酷狗动感歌词(支持翻译和音译歌词)显示效果
  6. 一般硬盘读取速度和写入速度是多少
  7. 下载到烦人的流氓软件了,电脑卡,弹窗多的看不到鼠标怎么办
  8. Linux操作系统概述
  9. python经典教程_零基础 Python爬虫经典实战教程
  10. 什么是软件 驱动软件 什么是程序