最近接手了一个针对Google Chrome的需求,最终是使用Native Messaging来实现的。通过这个连载,将把本次开发从方案选定到编码的全部过程进行完整的回顾,并记录开发过程中踩过的各种坑,给首次接触或希望使用chrome插件/扩展技术的朋友,提供一些经验参考。

需求概要是这样,项目本身是一个在线办公的web应用,其中有一个功能模块是刷卡考勤,原来的这个功能仅支持IE浏览器,具体是在某个页面上,通过IE的AtiveX控件,显示出连接在客户机上的IDR读卡器上识别到的卡片的卡号。新的需求要求这个功能要支持Chrome浏览器。

分析一下,目标是让Chrome浏览器通过某个途径,能够达到和在IE浏览器上同样的效果,而已知的条件是磁卡机厂商提供的AtiveX控件。由于这个项目中的磁卡机款式比较老,并不像现在市面上能买到的免驱的设备,电脑通过usb连接马上就识别为HID Device,因此借助驱动和磁卡读卡器通讯是避免不了的。另一个技术关键点是,Chrome本身提供的硬件访问相关API也无法直接和读卡器通讯,那么剩下可选的方案逃不出NaCl和Native Messaging。

接下来先看看NaCl,它确实是一项深受开发者喜爱的技术,在Google大力推动下,ppapi取代npapi成为Chrome唯一的核心插件方式,以往开发过的c/c++的组件和应用尽皆得以保留和web页面交互,它的发布形式也相当丰富,nacl/pnacl甚至都可以通过web服务器获取,和自己的web站点一起部署。遗憾的是,我手上可用的磁卡机的访问组件,是随ActiveX控件一起打包的win32下开发的x86类库,更要命的是没有.h头文件和.lib库,只有一个dll动态库,也就是说,我是需要win32 api的,使用LoadLibrary和GetProcAddress才能调用到dll库中需要的函数,结合NaCl SDK,最合适的方案应该是pepper plugin。但我最后否定了这个方案,原因是Chrome上注册pepper plugin是通过命令行的,而且不是永久生效的,也许是我并没有找到正确的方法,在时间j有限的前提下,我没有深入下去。

NaCl

Pepper Plugin

所以,最后只有祭出Native Messaging这个大杀器了,它的原理很好理解,Chrome的沙箱开辟了一个跨进程通讯的通道,允许Chrome Extension扩展能发送消息给本地任何一个支持stdio的进程,并从这个进程获得响应消息。这个方案对Chrome来说,需要开发一个扩展,对本地来说,需要一个控制台程序或windows service,在时间和难度的考虑下,这就可以接受了。

Native Messaging

后续我将分成几篇分别展示各个部分开发的内容,在本篇结尾,我分享几个资源 ,是我在尝试NaCl方案时,收集到的还不错的资料,因为我也是头一回接触这个,所以类似开发指南和介绍的内容是相当难得的。

1.Google I/O 2012 - Native Client LIVE

2.CEF和PPAPI

3.Google I/O 2012 - Life of a Native Client Instr

Google Chrome Native Messaging开发实录(一)背景介绍的更多相关文章

  1. Google Chrome Native Messaging开发实录(二)Chrome Extension扩展

    接上一篇<Google Chrome Native Messaging开发实录(一)背景介绍>的项目背景,话不多说,有关Chrome Extension介绍和文档就不展开了,直接上代码. ...

  2. Chrome Native Messaging 与本地程序之间的通信

    最近项目上出现了web打印不稳定的问题,师父决定web调用本地打印程序,在查阅了相关资料和加了几个相关群咨询后得知新版的chrome不支持NNAPI了,最好用Native Messaging来处理,经 ...

  3. Google Chrome 扩展程序开发

    根据公司的规定,每月八小时,弹性工作制.所以大家平时来的不太准时,如果有事,下班也就早些回去了.所以一个月下来工作时间可能不够,但是公司的考勤日历是这样的: 除了请假和法定节假日外,其他样式显示都是一 ...

  4. Google Chrome浏览器插件入门开发

    --1. 在html文件中引用js 文件 --2.在Google Chrome中开发简单插件 1.首先,简单说明一下在html 中引用js 文件: 将kittenbook.html 和 kittenb ...

  5. Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging

    通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机(native messaging host)”,Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应 ...

  6. Chrome 小工具: 启动本地应用 (Native messaging)

    最近遇到一个新的问题.需要使用Chrome 插件, 从我们对我们当地的一个网站之一启动C#应用,同时通过本申请值执行不同的操作. 在这里记录下解决的过程.以便以后查找 首先我们须要新建一个google ...

  7. Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报  分类: PPAPI(27)  通过将浏览器 ...

  8. Chrome 插件: 起动本地应用 (Native messaging)

    Chrome 插件: 起动本地应用 (Native messaging) www.MyException.Cn  网友分享于:2014-08-01  浏览:3次   Chrome 插件: 启动本地应用 ...

  9. 作为Web开发人员,我为什么喜欢Google Chrome浏览器

    来源: http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html 在Google Chrome浏览器出来之前,我一直使用FireF ...

随机推荐

  1. tp5,thinkphp5,隐藏index.php,隐藏入口文件

    一.找到/public/.htaccess文件 Apache: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews R ...

  2. 20155205 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20155205 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 (一)使用Code菜单 在IDEA中使用工具(Code->Reformate Code ...

  3. 1.9yield方法

    yield()方法的作用放弃当前的cpu资源,将他让给其他的任务去占用cpu的执行时间,但放弃的时间不确定,有可能刚放弃,马上又获得cpu时间片 测试 package com.cky.thread; ...

  4. mysql 中 datetime和 timestamp的区别

    DATETIME日期和时间的组合.支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'.MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DA ...

  5. Objective-C:01简介

    1.Objective-C简介 Objective-C是一种面向对象的计算机语言 OC不是一门全新的语言 C语言的基础上增加了一层最小的面向对象语法 OC完全兼容C语言 可以在OC代码中混入C语言代码 ...

  6. hdu 3191 次短路的长度和个数

    http://acm.hdu.edu.cn/showproblem.php?pid=3191 求次短路的长度和个数 相关分析在这里http://blog.csdn.net/u012774187/art ...

  7. [mysqli_escape]mysql转义两次

    // mysqli_real_escape_string // 第一次转义的结果 SELECT * FROM example WHERE f_email='example@exampl.com' an ...

  8. FNDLOAD使用大全

    FNDLOAD使用大全   Syntax FNDLOAD [username/password] 0 Y [mode] [configuration file] [target data file] ...

  9. Apollo 配置详细步骤(Windows环境)

    一. 准备工作 1.下载 apollo 安装包 下载链接:http://activemq.apache.org/apollo/download.html 2.下载 JavaJDK 安装包 ( apol ...

  10. fping常用参数介绍

    fping的主要参数有以下两个: -a:只显示存活主机: -u:只显示不存活主机: -l:循环ping目标IP地址的输入方式: fping IP1 IP2 IP3 ...: fping -f file ...