用手机远程控制扫描仪

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

参考:Wireless TWAIN Document Scanning on Android

PC上的TWAIN扫描

下载Dynamic .NET TWAIN SDK

下载JSON.NET

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

添加引用:DynamicDotNetTWAINNewtonsoft.Json

初始化TWAIN组件:

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服务:

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工程,添加一个ButtonImageView

申明权限:

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

创建socket链接:

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

git clone https://github.com/DynamsoftRD/Wireless-TWAIN-Scan-on-Android.git
时间: 2024-08-05 11:08:53

用手机远程控制扫描仪的相关文章

手机远程控制

1.  设备管理器 手机远程控制最重要的是要外置应用拿到管理设备的权限,这些权限在设备管理器中进行注册,就是大家在我们Settings->安全->设备管理器中能看到的. A.申明一个管理器权限要求列表:myadmin.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 3 <device-admin xmlns:android="http://schemas.android.com/a

手机远程控制电脑桌面的工具用什么呢

今手机的使用率越来越高,同时手机能够支持的功能也越来越多,早期的电脑远程控制电脑,已经是一个黑科技,而现在手机同样也可以控制电脑了,想要实现这一想法只需要借助一个"TeamViewer"的软件,可以用手机或其他电脑远程同步控制一台电脑. 方法就是先下载"TeamViewer":然后安装,安装的时候选"个人/非商务用途",这个是免费的:如果选"公司/商务用途"是要付费的. 安装完成后,打开软件.会有"您的ID"

物联网-手机远程控制家里的摄像头(1)

有这样一个想法,家里摆一个摄像头作为安防用途或者监控小孩子.宠物等, 远端的手机可以通过向摄像头发送指令来控制摄像头. 首先,这种想法已经有成熟的产品了,但是这样的产品有缺陷: 1.没法自己DIY一些功能,出了BUG时只能等待厂家的固件 2.因为要用到服务商的云平台,可能因此每年产生几百块的服务费 3.平台无法复用,比如无法添加NAS功能 4.隐私泄露的问题 这样的产品的需求是: 1.低功耗,因为需要24小时运行 2.高清摄像,红外夜视(可选),容易看清贼的脸 3.稳定的代码 4.历史记录查看功

物联网-手机远程控制家里的摄像头(2) - POP3和SMTP的C语言精简实现

在上一篇博客里面,使用了Python来发送.接收mail,但是实际测试中出现了一些不稳定的 情况,而且Python和即将使用的opencv会不兼容,使用进程间通讯或者其他方法会让整个系统 显得复杂而且可能不稳定,于是尝试用c或者C++实现邮件的发送和接收. 首先考虑的是上网找一个邮件库,找到了VMime库,于是开始安装.在简单看了一下它的文档之后 开始搭建它的环境,可惜要装的东西太多,搭建许久后放弃,而且它里面用了各种C++的特性,使用起来显得眼花缭乱 而且整个库太完整了,显得不够精简. 于是继

使用微软Remote Desktop 手机远程控制 windows

在我的电脑上右击选择“属性”,打开属性面板.然后点击左边的“远程设置”. 2/2 如果你要操作的计算机出入外网(大多数是家里网线进线直连电脑),就选择远程桌面选择框中的“允许运行任意版本远程桌面的计算机连接”,并确定. 如果为路由器假设的局域网,且两个设备都在该局域网内选择第三项“仅允许运行使用网络级别的身份验证的远程桌面的计算”.并确定. 我这里选择的是两个设备均在局域网,所以选择第三项.然后单击确定.Windows7端配置完毕.下面进入Android 端配置,下载并打开软件.界面如下 1/5

PhotoScan Google照片扫描仪,让手机替代扫描仪

看这里告诉你怎么玩!!!

从无人机到手机!视网膜扫描来了!

不论是<黑客帝国>还是<碟中谍>,类似的科技感十足的大片,我们都难免为其中酷炫的电子设备所惊叹,曲面手机,悬浮技术,视网膜扫描,植入人体设备等等.其实我们的生活已经越来越接近电影.从最开始的台式机到笔记本,再从平板到手机,再到可穿戴手表和谷歌眼镜等,我们已经彻底的生活在了一个数字化的世界. 科技是把双刃剑,方便的同时也在暴露着我们的隐私,因此我们都需要一种最安全的方式来保护我们的隐私.它既要足够安全,还要最够方便,这一点上非视网膜扫描技术莫属. 指纹识别VS网膜扫描 还记得iPho

白话(粤语)发音手机,广东话手机,白话手机,粤语手机

白话(粤语)发音手机,广东话手机,白话手机,粤语手机 一元秒杀手机 新手机上市 手机以旧换新 全网通4g手机 手机选号 新手机 手机最新款 苹果新手机 oppo手机怎么样 全网通双4g手机 手机影院 oppo新款智能手机 手机应用 红米手机1s 6s手机 卖手机 手机app制作 苹果手机6plus多少钱 手机性能排行榜 努比亚手机 乐视超级手机1s 1000元智能手机 乐视超级手机 全智能手表手机 华为手机怎么样 一元抢购手机 女性手机 修手机 200元智能手机 可弯曲手机 0首付买手机 手机哪

无尽之海:从手机到万物

在上个世界60年代,麦克卢汉曾经提出过一个概念,即"媒介是人的延伸".这里的媒介指的不是媒体,而是是广义的媒介,例如火车是人双腿的延伸,电话是人耳朵和嘴的延伸.科技的发展改变了时间与空间的关系,因而也改变了人的感知能力. 这一点在移动时代体现的更加淋漓尽致,通过社交媒体和通讯软件,我们可以毫无延迟的感知到这个世界上任何一个角落在发生着什么,也能随时传达自我的感受.手机AI的出现,更是将这种延伸能力推向了顶峰. 手机AI带来的强大计算能力,将媒介带来的感知能力演化成了决策能力.好比AI拍