用手机远程控制扫描仪
目前的扫描仪都还不够智能,没有提供扫描仪和手机之间的直接通信。所以我们可以通过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
|
用手机远程控制扫描仪相关推荐
- 计算机手机远程控制,手机怎么远程控制电脑?手机远程控制电脑步骤详解
随着互联网技术的发达,手机和电脑一样成为人们生活中很重要的东西,也许是关乎人们的工作也许是生活中的事情,其实都很重要.但是电脑的体积还是比较大的,相对于手机来说,携带总是不方便的,就连 笔记本电脑 也 ...
- 有了手机远程控制手机的软件,在家突然收到工作任务也不怕
现在越来越多的企业开始为员工配备的专用工作手机,考量因素有很多:要对工作沟通文字.通话记录实施监控:要保护客户资料安全,担心员工带走客户资源:要统计员工的工作量-- 原本有一台私人手机,现在再来一两台 ...
- 手机远程管理服务器文件,手机远程控制服务器文件
手机远程控制服务器文件 内容精选 换一换 为安全起见,弹性云服务器登录时建议使用密钥方式进行身份验证.因此,您需要使用已有密钥对或新建一个密钥对,用于远程登录身份验证.新建密钥对如果没有可用的密钥对, ...
- android3.0快捷键,向日葵新出版本安卓3.0手机远程控制手机详细教程
向日葵新出版本的安卓3.0手机远程控制手机正式发布,先看看视频演示: 下面介绍详细教程: 物料准备: 1.智能手机两部(其中一部必须是安卓手机,以苹果手机和小米手机为例) 2.向日葵远程控制软件 具体 ...
- 手机虚拟服务器app,手机远程控制服务器的app
手机远程控制服务器的app 内容精选 换一换 域名生成算法(Domain Generation Algorithm,DGA)是一种利用随机字符生成命令与控制(Command and Control,C ...
- 安卓手机远程控制app
用一台安卓手机完全控制另外一台安卓手机,想一想是不是很酷炫,那么今天他来了 安卓手机远程控制app下载地址58588.goho.co
- 安卓手机变成横屏_学会用手机远程控制电脑,出门在外,随时随地也能轻松办公!...
日常工作生活中,有时我们外出,有些情况有些事情需要使用个人电脑或者公司电脑,这时候我们就可以通过手机远程控制电脑来解决问题.今天我们就给大家分享一下手机如何远程控制电脑? 1.首先,我们需要在手机端和 ...
- 使用手机远程控制电脑
使用手机远程控制电脑 使用TeamViewer 首先下载TeamViewer,下载地址: http://www.xp510.com/xiazai/Networking/Assistant/12130. ...
- 用手机远程控制电脑的软件 ---TeamViewer远程控制
透过TeamViewer免费版即可在旅途中远端控制电脑! 无论您身在何处,皆可为亲朋好友轻松解决电脑问题.您也可以于旅途中轻松存取.编辑家用电脑文件. 功能: 1.可支援亲朋好友并存取无人看管的电脑( ...
最新文章
- 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库
- [Python]架设python虚拟环境以及部署PythonWeb服务
- linux怎样自制库_苹果开源Swift System,增加Linux支持
- [转载]Qt之获取本机网络信息_vortex_新浪博客
- 数据库安全性概念与自主安全性机制
- 偷懒才能编程序——计算机达人成长之路(18)
- 路径太深 无法删除文件夹 之解决办法
- IEEE 类各种模板下载--以IEEE Access为例
- ResNet网络结构解析--Pytorch
- FME突然无法连接FMS服务器
- 记忆GRE词汇三大原则
- DNS中A记录和CNAME的区别 什么是CNAME
- Sqli-Labs Less1-16关详细讲解
- Matlab如何提取fig文件中的数据
- OTA频发的“大数据杀熟”,想要治你不容易?
- gif图片裁切、压缩导出无水印图片(保姆级教程,亲测可用)
- RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublas‘
- 华为分布式文件存储服务器配置,分布式存储服务器
- 稳压、调压、监控、DC/DC电路大全
- Lifekeeper 安装的问题
热门文章
- linux系统FW升降级步骤,使用fwupd为Ubuntu 18.04系统更新固件的方法
- android 生成aar文件,Android 中.aar文件生成方法与用法
- 人人开源 / renren-security/小记(二)
- c实现 图像dither算法_Atitit (Sketch Filter)素描滤镜的实现 图像处理 attilax总结...
- android仿酷狗界面,Android仿酷狗动感歌词(支持翻译和音译歌词)显示效果
- 一般硬盘读取速度和写入速度是多少
- 下载到烦人的流氓软件了,电脑卡,弹窗多的看不到鼠标怎么办
- Linux操作系统概述
- python经典教程_零基础 Python爬虫经典实战教程
- 什么是软件 驱动软件 什么是程序