前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信、蓝牙配对、IM来传送数据。它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享。

此外支付宝曾经试推过“声波支付”,利用手机发送超声波至终端作为交易密码进一步完成交易。然而支付宝的技术目前只是使用在了支付上,而需要可接受声波支付的特定售货机方可使用。

Advanced Sound for Games and Interactive Apps - WebAudio API》的作者Boris Smus用HTML5的Web Audio API实现了一个基于Web的超声波互联方案,通过这种方式不需要安装任何客户端,也不需要蓝牙或者NFC的支持,就能够将两台用浏览器上网的设备连接到一起并传递图片、音乐、视频等文件。这个idea很酷,帮助我们在Web的功能和应用层面迈进了一大步(这种想法也许你都想所未想,闻所未闻),下面我们就一起来看看具体的原理和实现过程。

……………………………………✄……………………………………华丽的分隔线

你口袋里的手机是一个酷炫的、美观的、有很多功能的工具。但是当它想要和其它设备对话时,例如电视或者笔记本,用户体验就大幅下降。Bill Buxton关于这个主题有一个极富感染力的演讲,描述了高科技演化的三个阶段:

1、设备工作:功能的完整性和稳定性

2、 设备流畅:良好的用户体验

3、 许多设备在一起工作

我们已经随着iPhone的发布,正式的进入了第2个阶段,但是连接设备是一件让人痛苦的事情。有许多方法来实现这一点:蓝牙、蓝牙LE、WiFi直连、通过本地WiFi网络发现等等。这篇文章通过一个完全让人意想不到的角度来解决这个问题:利用超声波来广播和在相邻设备间发送数据。最重要的是,这种方法采用Web Audio API,使得纯Web应用的连接成为可能。

演示视频

        设备的通天塔

Airplay 和 Chromecast是解决同一生态系统(例如苹果或谷歌)内设备连接问题的伟大方法 ,但是普遍问题仍然难以得到解决。

因为有许多可能的技术途径,所以可能碰巧你要连接的设备间没有共同的方法。即便两个设备都有蓝牙,其中一个或许需要配置,但是另外一个却不支持,或者是支持不同版本的标准。现在这对于蓝牙来说尤其普遍,许多设备硬件上支持蓝牙4.0(又名BTLE),但是很多设备却因为各种原因不支持这个最新的协议。

在Web上这种情况甚至更糟,因为低级别设备的连接API因为安全沙盒方面的原因并没有提供。而由于Web的发展非常慢,所以很难想像这种情况能够在短时间内得到解决。

        通过有趣的方式传输数据

Electric Imp提供的Blinkup是一种跨端通信的有趣方式。它使用了一系列闪光来在智能手机和Imp – 一种形似小型SD卡并带有光线传感器的设备间传输数据。

拨号调制解调器做了类似的事情。它们在模拟电话线上编码和解码数字数据。还记得那些烦人的连接噪音吗?拨号调制解调器会打开扬声器来让用户了解正在进行握手。如果你忘记了这些,可以在这儿复习一下。即使在今天的模拟电话里,你在键盘上按下数字键时听到的声音也相当于电话系统用于模拟数字转换的频率。这个转换使用了双音多频信号(DTMF)。

你的手机和周围的其它很多设备都有扬声器和麦克风。这两种硬件可以用声音来发送和接收数据,类似于调制解调器在电话线路上所做的事情。更妙的是,如果操作系统支持发送和接收的频率足够高,我们可以创建一个无声的数据通道。

        用声音传输数据

我应该注意到通过声音编码数据并不新颖。音频水印的创意就是把签名编码到音乐中,听众通过人类的方式并无法识别,但是却能够被另外一台设备所理解。这是一种防止盗版的聪明方式。

大多数普通的扬声器能够产生44.1KHz采样率的声音(这导致最高的频率为22KHz - 根据香农采样定理)。这让我们将数据不仅编码为声音,还会产生成人无法听到的音频。不过儿童和动物仍然有可能会听到:)

技术上需要注意的是,麦克风有时候与扬声器并不兼容,尤其是在手机上,因为它们经常会针对人们的通话进行优化,通过更低的采样率来让声音效果更佳。在另外一些情况下,即便硬件兼容,固件也需要运行在低采样率上来保证电量供应。如果是这样的话,设备将无法接收声波,同时基于声音的连接将只能单向进行。

        SONICNET.JS,一个Web Audio的实现

为了说明这些概念,我搭建了一个JavaScript库,用于通过声音发送和接收数据。我的做法没有学习复杂的音频水印技术,甚至比DTMF更为简便。基本上,你可以指定使用一个范围的频率,以及可以传送的字母集合。频谱被分成对应于所指定开始和结束字母之间的范围,每个字母/代码对应整个频率范围内的一部分。

发送端将需要发送的每个字符转换为对应频率范围的中点值,并且在一个时间间隔内发送该频率。接收端会对信号进行不连续的傅立叶变换(宇捷注:我的本科专业就是信息与通信工程,学过数字信号处理的朋友应该对此非常了解),并且寻找指定频率范围内的峰值。在找到一个信号间隔内的峰值后,它会将频率转换回字符。这基本上是一个单音多频信号(STMF)的方案。

有一个发送时机的问题:在发送端,应该多长时间发送一个字符;在接收端,应该多长时间接收?我们用了一个简单的方案来规避相邻的重复字符。

我设计了一个类似于socket的API用于声波通信。客户端代码看起来如下所示:

  1. ssocket = new SonicSocket({alphabet: '0123456789'});
  2. function onButton() {
  3. ssocket.send('31415');
  4. }

服务端看起来像这样:

  1. sserver = new SonicServer({alphabet: '0123456789'});
  2. sserver.on('message', function(message) {
  3. //Expect message to be '31415'.
  4. console.log(message);
  5. });
  6. sserver.start();

JS库支持github

当然,使用它需要一个Web Audio的实现(大多数在发送端使用OscillatorNode ,在接收端用AnalyserNode )。我已经尝试过Macbook上Chrome到Chrome,以及Mac Chrome到Android Chrome的传输案例。

我写了一对示例来说明这个想法。它们出现在本文开头所演示的视频里。第一个示例让你可以从一台设备上发送表情到另外一台。它使用了一个很小的字符集,仅仅包括6个字符,每个对应1种表情。你可以从6种表情中挑选一个,对应的字符将会通过声波网络发送出去,在另一端被接收和展示出来。

一种对sonicnet.js更为现实的应用是这个聊天应用,生成不重复的5位数令牌并且用它来在2台设备间创建连接。这在配对服务器的帮助下完成,在这两台设备间通过WebSocket来建立代理连接。一旦连接建立后,对话本身将通过WebSocket发送。服务端代码托管在nodejitsu上。

        结论和期望

Web Audio API已经可以演变到让这样的应用成为可能,这是重大的进步。我迷上了sonicnet.js物联网上的实现。这是纯Web技术,可以用来对设备进行配对。无处不在的浏览器和音频硬件相结合将会是一个巨大的胜利,甚至在硬件层面,Web平台完全不需要等待蓝牙或其它近场连接技术的成熟。

如果这篇文章已经激起了你的兴趣,你可以尝试使用sonicnet.js来编写一个应用。就像我前文提到的一样,接收高频音频因为硬件/固件限制并不是在所有的设备上都可用,所以我很想知道哪些可用,而哪些不可以。我的期望是,大多数手机应该只能发送,而大多数笔记本可以同时接收和发送。如果你在你的设备上尝试了表情演示,请填写这份表格。在写这篇文章的时候,Android平台上Chrome Beta版本并不支持实时输入,所以从手机传输数据到笔记本是唯一的选择。

相关链接:

1、《Web Audio API》阅读

2、《Web Audio API》所附演示

译自:sums的博客 译者:蒋宇捷 转载请注明

基于HTML5的Web跨设备超声波通信方案的更多相关文章

  1. 基于HTML5移动web应用

    一.基于HTML5移动web应用 1.canvas 绘图 2.多媒体 3.本地存储 4.离线应用 5.使用地理位置 6.移动web框架   二.具体说明 1.HTML5标准最大的变化就是支持Web绘图 ...

  2. Monotype推出基于HTML5的Web字体平台

    著名字体公司Monotype近日宣布推出基于HTML5的Web字体平台,设计者可以访问近10万字体的目录. Monotype推出基于HTML5的Web字体平台 Monotype推出基于HTML5的We ...

  3. 基于HTML5的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  4. Web跨浏览器进程通信(Web跨域)

    Web跨域已是老生常谈的话题,这次来尝试下跨域浏览器进程之间的通信 —— 这在过去基本依靠网络中转实现   在之前一篇文章里尝试了跨浏览器的数据共享,最后提到使用LocalConnection还可以实 ...

  5. 基于HTML5 的WebSql本地设备数据库

    HTML5 的 Web SQL Database 用本地和会话存储实现简单的对象持久化,对繁琐的关系数据进行处理. 在 W3C 的 Web SQL Database 规范中(参照 介绍)有这样的描述: ...

  6. 基于 HTML5 的 Web SCADA 报表

    背景 最近在一个 SCADA 项目中遇到了在 Web 页面中展示设备报表的需求.一个完整的报表,一般包含了筛选操作区.表格.Chart.展板等多种元素,而其中的数据表格是最常用的控件.在以往的工业项目 ...

  7. 一款基于HTML5的Web 3D开发工具

    在我们协助客户进行3D应用的开发过程中,客户遇到的最头疼的问题是如何在短时间内学会使用TWaver 3D引擎,以及使用TWaver 3D来创建和导入项目所需的各种3D业务模型.由于项目涵盖的行业繁多. ...

  8. 基于html5 localStorage , web SQL, websocket的简单聊天程序

    new function() { var ws = null; var connected = false; var serverUrl; var connectionStatus; var send ...

  9. 基于web的IM软件通信原理分析

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

随机推荐

  1. unity3D——自带寻路Navmesh入门教程(二)(转)

    转自:http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来 ...

  2. ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云

    向视图中添加服务 现在,ASP.NET MVC 6 支持注入类到视图中,和VC类不同的是,对类是公开的.非嵌套或非抽象并没有限制.在这个例子中,我们创建了一个简单的类,用于统计代办事件.已完成事件和平 ...

  3. crossplatform---Nodejs in Visual Studio Code 08.IIS

    1.开始 本文部分内容均转载自文章: http://www.hanselman.com/blog/InstallingAndRunningNodejsApplicationsWithinIISOnWi ...

  4. atitit.解决net.sf.json.JSONException There is a cycle in the hierarchy

    atitit.解决net.sf.json.JSONException There is a cycle in the hierarchy 1. 环境:使用hibernate4跟个,,要不个哪的对象系列 ...

  5. atitit.标准时间格式 互相转换 秒数 最佳实践

    atitit.标准时间格式 互相转换 秒数 最佳实践 例如00:01:19 转换为秒数  79,,and互相转换 一个思路是使用div 60 mod...不过麻烦的... 更好的方法是使用stamp ...

  6. paip.log4j兼容linux windows 路径设置

    paip.log4j兼容linux windows 路径设置 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  7. springmvc中@PathVariable和@RequestParam的区别

    顾名思义, @PathVariable和@RequestParam,分别是从路径里面去获取变量,也就是把路径当做变量,后者是从请求里面获取参数. 我的url; http://localhost:808 ...

  8. web前端基础——jQuery编程基础

    1 jQuery简介 jQuery是一个兼容多浏览器的JavaScript库,核心理念是write less,do more(写得更少,做得更多).它对JavaScript进行了封装,使开发更便捷,并 ...

  9. Liferay7 BPM门户开发之29: 核心kernel.util包下面的通用帮助类ParamUtil、GetterUtil使用

    与其闭门造车,不如直接开动原装.进口.免费的法拉利. -- 作者说 不多说废话,直接上代码. ParamUtil ParamUtil.GetterUtil是Liferay最重要的帮助类 ParamUt ...

  10. 通过weburl 启动windows程序

    1. 注册表修改 建立一个reg文件 执行导入  以RunLocal协议为例子 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\RunL ...