标题：WIA
Windows图像采集
Windows 图像采集 (WIA) 是最新 imaging 技术，在Microsoft Windows Millennium Edition中引入, 包含在更高版本的 MicrosoftWindows 操作系统中（例如WindowsXP，注意Win NT3,Win NT 4 和Windows2000不支持WIA）。 WIA 提供广泛的支持以启用 imaging 设备, 如扫描仪和数码相机, 以与图像应用程序 （例如, MicrosoftPicture2000和 Adobe Photoshop）对接。
WIA之前的成像设备行业标准是TWAIN标准。 
使用WIA，制造商只需要写 WIA microdriver 以允许设备使用。 这类似于打印制造商提供 minidriver, 而其他WIA组件由操作系统实现。
使用WIA, 独立硬件供应商 (IHV) 可集中编写代码以提高设备功能。
WIA和TWAIN的关系是，WIA是微软操作系统的影像获取体系结构，属于Windows操作系统驱动程序类；而TWAIN是开放协议，用来解决应用软件对不同影像外设的可移植性调用。应当说，WIA是驱动层上的东西，它为应用程序提供SDK接口；而TWAIN协议在驱动程序和应用程序间提供一个公用接口。TWAIN的层次高于WIA。1．关于 WIAWIA 是 Windows Image Acquisition 的简称，当前可用版本是 WIA 1.0，它是 Windows Millennium Edition (Windows Me) 或者更高版本的 Windows 系统中提供的数字图像获取服务，同时它也能用于管理数字图像设备。
WIA 接口既是应用程序接口（WIA API），又是设备驱动程序接口（WIA DDI），下面要讲述的都是有关 WIA API 的内容。
◆通过 WIA API，应用程序可以：
◆运行在强壮稳定的环境中；
◆最大可能地减少协同配合问题；
◆枚举可用的图像获取设备；
◆同时连接多个设备；
◆用标准的、可扩展的方式查询设备属性；
◆用标准的、高性能的传送机制获取数据；
◆在数据传送过程中维持图像属性；
◆获取大量的设备事件通知消息。2．WIA 架构WIA 是使用进程外（Out of process）服务实现的 COM 组件，和大多数进程外服务程序不同的是，WIA 通过提供自己的数据传送机制（IWiaDataTransfer 接口），避免了图像数据传送过程中的性能损失。高性能的 IWiaDataTransfer 接口使用共享内存来传送数据给客户程序。
WIA 有三个主要的组件：Device Manager，Minidriver Service Library 和 Device Minidriver。
◆Device Manager: 枚举图像设备，获取设备属，为设备建立事件和创建设备对象；
◆Minidriver Service Library: 执行所有设备无关的服务；
◆Device Minidriver 解释映射: WIA 属性和命令到特定的设备。3.使用WIA1）选择设备
应用程序既可以用 WIA 内置的对话框来选择设备，也可以不使用 WIA 的用户界面。下面的程序将弹出一个 WIA 选择设备对话框：
#include #pragma comment (lib, "WiaGuid.lib") int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HRESULT hResult; IWiaItem *pItemRoot; IWiaDevMgr *pWiaDevMgr; CoInitialize(NULL); __try { // Create WIA Device Manager instance pWiaDevMgr = NULL; hResult = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**) &pWiaDevMgr); if (hResult != S_OK) { MessageBox(NULL, "Error: CoCreateInstance().", NULL, MB_ICONSTOP); __leave; } // Display a WIA select device dialog pItemRoot = NULL; hResult = pWiaDevMgr->SelectDeviceDlg(NULL, 0, WIA_SELECT_DEVICE_NODEFAULT, NULL, &pItemRoot); // User canceled if (hResult == S_FALSE) { MessageBox(NULL, "User canceled.", NULL, MB_ICONINFORMATION); __leave; } // No device available else if (hResult == WIA_S_NO_DEVICE_AVAILABLE) { MessageBox(NULL, "No device available.", NULL, MB_ICONINFORMATION); __leave; } // OK, Then .......... } __finally { // Release COM interface. if (pItemRoot) pItemRoot->Release(); if (pWiaDevMgr) pWiaDevMgr->Release(); CoUninitialize(); } return 0; }2．获取图像到文件中
WIA 获取图像非常简单，直接调用 IWiaDevMgr::GetImageDlg()，它集成了 Select Device 和 Select Image 对话框，在传送图像的时候还会自动出现一个进度指示对话框，下面是一个例子：
// ... // Create WIA Device Manager object. hResult = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**) &pWiaDevMgr); if (hResult == S_OK) { // Get a image. hResult = pWiaDevMgr->GetImageDlg(hWnd, 0, WIA_DEVICE_DIALOG_SINGLE_IMAGE, WIA_INTENT_MAXIMIZE_QUALITY, NULL, wszFilename, &guidFormat); // ...... } // ...... 不过由于 IWiaDevMgr::GetImageDlg() 是以图片文件的形式返回数据的，有的时候并不能满足我们的需要，这时候我们就需要使用 IWiaDataTransfer 接口来传送图片。
2）获取内存中的图像数据
在 IWiaDevMgr::SelectDeviceDlg() 之后，可以用它返回的 RootItem 对象的 IWiaItem::DeviceDlg() 方法显示一个对话框浏览 WIA 设备中图片，请看下面的例子：
// ...... // Display a WIA dialog box to the user to prepare for image acquisition. hResult = pRootItem->DeviceDlg(hWnd, 0, WIA_INTENT_MAXIMIZE_QUALITY, &cItem, &ppWiaItems); if (hResult == S_OK) { for (i = 0; i < cItem; i++) { // ...... // ppWiaItems } } // ...... IWiaItem::DeviceDlg() 返回选取的图片总数和每个图片的 WiaItem 指针，我们可以用用 IWiaDataTransfer 接口来传送图片。在传送每个 WiaItem 数据之前，应该先调用 IID_IWiaPropertyStorage 接口设置相应的属性：
// ...... // Get the IWiaPropertyStorage interface so we can set required properties. hResult = pWiaItem->QueryInterface(IID_IWiaPropertyStorage, (void**) &pWiaPropertyStorage); if (hResult == S_OK) { // Prepare PROPSPECs and PROPVARIANTs for setting the media type and format. psPropSpec[0].ulKind = PRSPEC_PROPID; psPropSpec[0].propid = WIA_IPA_FORMAT; psPropSpec[1].ulKind = PRSPEC_PROPID; psPropSpec[1].propid = WIA_IPA_TYMED; guidOutputFormat = WiaImgFmt_MEMORYBMP; pvPropVariant[0].vt = VT_CLSID; pvPropVariant[0].puuid = &guidOutputFormat; pvPropVariant[1].vt = VT_I4; pvPropVariant[1].lVal = TYMED_CALLBACK; // Set the properties. hResult = pWiaPropertyStorage->WriteMultiple(sizeof(pvPropVariant) / sizeof(pvPropVariant[0]), psPropSpec, pvPropVariant, WIA_IPA_FIRST); // ...... } // ......如果用 IWiaDataTransfer 接口传送数据，我们还需要自己写代码实现 IWiaDataCallback 接口，其中 在我们的 IWiaDataCallback::BandedDataCallback() 中可以接收到数据，例如：
// [Summary] Recieve data transfer status notifications. HRESULT CALLBACK CWiaDataCallback::BandedDataCallback(LONG lMessage, LONG lStatus, LONG lPercentComplete, LONG lOffset, LONG lLength, LONG lReserved, LONG lResLength, BYTE *pbData) { PWIA_DATA_CALLBACK_HEADER pHeader = NULL; switch (lMessage) { case IT_MSG_DATA_HEADER: // The data header contains the image's final size. pHeader = (PWIA_DATA_CALLBACK_HEADER) pbData; if ((pHeader) && (pHeader->lBufferSize)) { // Save the buffer size. m_nBufferLength = pHeader->lBufferSize; // Allocate a block of memory to hold the image. m_pBuffer = (PBYTE) HeapAlloc(GetProcessHeap(), 0, m_nBufferLength); if (m_pBuffer == NULL) return S_FALSE; } break; case IT_MSG_DATA: // Make sure a block of memory has been created. if (m_pBuffer) { // Copy the new band. CopyMemory(m_pBuffer + lOffset, pbData, lLength); // Increment the counter. m_nBytesTransfered += lLength; } break; case IT_MSG_TERMINATION: // Notify that we complete to recive a image. break; default: break; } return S_OK; }然后，我们就可以用 IWiaDataTransfer 接口来传送数据了：
// ... // Create our callback class. pCallback = new CWiaDataCallback(hWnd); if (pCallback) { // Get the IWiaDataCallback interface from our callback class. hResult = pCallback->QueryInterface(IID_IWiaDataCallback, (void**) &pWiaDataCallback); if (hResult == S_OK) { // Perform the transfer. wdtiTransferInfo.ulSize = sizeof(WIA_DATA_TRANSFER_INFO); hResult = pWiaDataTransfer->idtGetBandedData(&wdtiTransferInfo, pWiaDataCallback); // ...... } // ...... } // ...... 4. 后注WIA 是 Windows ME 及其以后的操作系统中提供的，Windows 98/2000 均不支持 WIA，因此需要在较新版本的 MSDN Library 中才有 WIA 文档。
另外，因为 Visual C++ 6.0 中没有 WIA 库，所以需要使用 Visual Studio 2002/2003 编译 WIA 程序。
最后得提到的是WIA的架构主件主要有：
①扫描仪和照相机向导
②windows资源管理器用户界面
③WIA设备
④分类安装程序
⑤脚本接口
⑥TWAIN数据源管理程序和兼容性驱动程序
⑦通用系统对话框对象
⑧设备对象
⑨WIA设备管理程序
工业无线网络WIA
1 简介工业无线网络WIA(Wireless Networks for Industrial Automation)技术是由中科院沈阳自动化所推出的具有自主知识产权的高可靠、超低功耗的智能多跳无线传感器网络技术，该技术提供一种自组织、自治愈的智能Mesh网络路由机制，能够针对应用条件和环境的动态变化，保持网络性能的高可靠性和强稳定性。
工业无线网络WIA技术基于短程无线通信IEEE 802.15.4标准，使用符合中国无线委会规定的自由频带，解决工厂环境下遍布的各种大型器械、金属管道等对无线信号的反射、散射造成的多径效应，以及马达、器械运转时产生电磁噪声对无线通信的干扰，提供能够满足工业应用需求的高可靠、实时无线通信服务。 
通过使用工业无线网络WIA技术，用户可以以较低的投资和使用成本实现对工业全流程的“泛在感知”，获取传统由于成本原因无法在线监测的重要工业过程参数，并以此为基础实施优化控制，来达到提高产品质量和节能降耗的目标。  工业无线网络WIA技术主要应用于石油、石化、冶金、环保、污水处理等领域。 2 技术体系工业无线网络WIA技术体系是由中国工业无线联盟推出的具有自主知识产权的技术体系，形成了国家标准草案，并与Wireless HART、ISA100并列为主流的工业无线技术体系。 
WIA网络采用星型和Mesh结合的两层网络拓扑结构。第一层是Mesh结构，由网关设备及路由设备构成；第二层是星型结构，由路由设备及终端设备或手持设备构成。
网关：负责WIA网络与工厂内的其它网络的协议转换与数据映射； 
冗余网关：负责网关的热备份；
网络管理者：负责构建由路由设备构成的Mesh网络；监测全网性能；
安全管理者：负责路由设备及终端设备的密钥管理与安全认证；
WIA网络的协议栈结构遵循ISO/OSI的层次结构，但只定义了物理层、数据链路层、网络层、应用层。
WIA协议栈由协议层实体，包括数据链路层、网络层、应用层（由应用支持子层、用户应用进程、设备管理应用进程构成）、功能模块及层实体间的数据接口和管理接口构成。数据链路层、网络层和应用支持子层包含的功能模块有：数据实体和管理实体。用户应用进程包含的功能模块是多个用户应用对象。设备管理应用进程包含的功能模块有：设备管理模块、网络管理模块、安全管理模块、网络管理代理模块、安全管理代理模块、管理信息库。3 技术特征WIA网络采用了以下措施保障工业环境中无线通信的高可靠性： 
1）TDMA避免了报文冲突
系统产用全网TDMA模式，并且全网的时间同步精度达到微秒级。
2）跳频通信方式提高了点到点通信的抗干扰能力 
WIA技术使用多信道进行通信，通过TDMA/CSMA混合接入模式支持周期性和非周期性通信负载，在DSSS的基础上引入FHSS的思想，采用根据信道状态自适应跳频机制，可以有效地抑制突发性干扰，消除频率选择性衰减。
3）自动请求重传保证了报文传输的成功率 
WIA技术在链路层采用自动请求重传机制，保证了点到点的报文传输成功率，在应用层采用面向连接的（connection-oriented）数据传输技术，通过端到端的重传机制保证数据传输的高可靠性。
4）Mesh路由提高了端到端通信的可靠性 
WIA技术在网络层采用智能的Mesh网络技术。每个设备至少有两条可用的通信路径，设备加入网络后，可以自主选择或由网络管理者分配多条数据传输路径。当一条路径由于干扰被中断，设备可以自动切换到其它通信质量较好的路径。
5）设备冗余提高了系统的鲁棒性。4 技术优势WIA技术与国外同类技术相比较具有的技术优势主要有以下几点：
1）分层的组织模式，对网络拓扑的维护更加灵活、快速；
2）自适应的跳频模式与自动重传机制，对保障通信的可靠性更加有效；
3）支持网内报文聚合，有效地降低了网络开销，延长电池寿命；
4）兼容IEEE802.15.4标准，可以使用现有商用器件，易于实现；
5）兼容无线HART标准，支持HART命令，很容易升级传统仪表，为其增添无线通信功能；
6）用户可以方便地使用、管理，无需较高的专业知识。[1]