65.9K
CodeProject 正在变化。 阅读更多。
Home

将音频插孔用作 Android 系统上的数据接口

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2015 年 5 月 1 日

CPOL

4分钟阅读

viewsIcon

18003

作为手机和平板电脑上的接口之一,音频插孔的主要功能是播放音乐。然而,它的其他用途也不容忽视——音频插孔还可以用于传输数据。

Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,帮助开发者创新并取得成功。加入我们的社区,了解 Android物联网Intel® RealSense™ 技术Windows,下载工具,获取开发套件,与志同道合的开发者交流想法,并参与黑客松、竞赛、路演和本地活动。

概述

作为手机和平板电脑上的接口之一,音频插孔的主要功能是播放音乐。然而,它的其他用途也不容忽视——音频插孔还可以用于传输数据。

用于连接设备的音频插孔的更多用法正在不断开发中。iHealth Lab 的血糖仪¹(血糖计算器)、Irdroid²(提供红外遥控功能,可控制电视、机顶盒和音响设备)以及 Flojack*³(一款 NFC 读取器,可实现近场通信功能,与 NFC 标签或移动设备交互)等外围设备,都通过音频插孔连接成为可能。

鉴于可穿戴设备和外围设备具有广阔的市场前景,我相信音频插孔将成为主要的数据通信端口。在本文中,我将更详细地介绍这项新功能。

引言

音频插孔接口有两种标准:OMTP 和 CTIA⁴。OMTP 是国际标准;ATIS 是美国标准,用于 Apple iPhone* 和 iPad*。它们在 V-Mic 和 GND 位置上有所不同,区别如图 1 所示。

图 1. OMTP 与 CTIA

如何传输数据

当我们发送 0x00FF 数据值时,第一步是将数字数据值转换为模拟信号。我们需要对数据值进行调制。通常,我们使用正弦波载波作为模拟信号。

图 2. FSK⁵ 调制信号⁶

第二步,在 Android 系统中,调用 AudioTrack API⁷ 函数播放缓冲区。以下代码使用 `audioTrack` 函数将数据发送到缓冲区。

public void send(byte[] bytes_pkg) {
		int bufsize = AudioTrack.getMinBufferSize(8000,
				AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_16BIT);
		AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC,
				8000, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_16BIT, bufsize, 
AudioTrack.MODE_STREAM);
		trackplayer.play();
		trackplayer.write(bytes_pkg, 0, bytes_pkg.length);
	}

如何接收数据

作为接收器,我们需要将模拟信号转换为数据值,对信号进行解调以去除载波信号,并通过协议解码数据。协议可以是公共数据格式,也可以是私有定义协议。

图 3. 解调信号⁶

在 Android 系统中,我们使用 `audioRecord` API⁸ 函数来录制音频。

public void receive(){
		int minBufferSize = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_FREQ, 2,
				AudioFormat.ENCODING_PCM_16BIT);
		AudioRecord ar = new AudioRecord(MediaRecorder.AudioSource.MIC,
				AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_IN_MONO,
				AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
		ar.startRecording();
	   }

如何从音频信号中获取能量

显然,音频插孔外围设备需要电力来驱动电路。例如,L 声道发送数据信息。R 声道发送持续的方波或正弦波。这些波形可以转换为能量,为 MCU(微控制器单元)和几个传感器供电。

案例研究:红外外围设备

Androlirc⁹ 是一个基于 Github 的项目。它的功能是利用音频插孔接口发送红外命令。我们可以研究这个项目来了解音频插孔的数据通信。Androlirc 使用 LIRC¹⁰ 库创建数据缓冲区。该库是一个 Linux* 红外库,支持多种接口,例如:USB、音频插孔等。Androlirc 可以使用 LIRC 库进行数据封装或数据封装。在市场上,您可以找到许多红外编码类型,如 RC-5 和 RC-6 协议。在本例中,我们使用 RC-5 协议来控制电视机。首先,我们需要使用 38k 频率的正弦波对数据值进行调制,以生成缓冲区数据;然后,我们使用 Android 音频 API 函数播放音频缓冲区数据。同时,我们可以使用两个声道中的一个来播放正弦波或方波,为外围设备硬件供电。

案例研究:音频插孔开发工具

NXP Semiconductors 的新型智能手机解决方案 Quick-Jack*¹¹ 是一款基于名为 Hijack 的原型项目的工具/开发板。Hijack¹² 是密歇根大学的学生项目。Hijack 平台支持即插即用操作,能够实现一类新型的小型、廉价、以手机为中心的高科技传感器外围设备。我们可以使用 NXP Quick-Jack 开发板来帮助构建我们的原型产品设计。图 4 显示了一个智能手机显示来自音频插孔外围温度传感器的室内温度。

图 4. 来自 Quick-Jack 的温度值

图 5 显示了我们如何通过基于 Android 的应用程序控制外围设备的 LED。

图 5. 控制 Quick-Jack 上的 LED

摘要

可穿戴设备和智能设备外围设备在消费市场中越来越普遍。音频插孔作为一种数据通信功能,正被越来越多的 ODM 和 iMaker 采用。也许在未来,音频插孔数据通信功能将得到智能手机操作系统的普遍支持。

参考

  1. http://www.ihealthlabs.com/glucometer/ihealth-align/
  2. http://www.irdroid.com/
  3. https://www.kickstarter.com/projects/flomio/flojack-nfc-for-ipad-and-iphone
  4. http://en.wikipedia.org/wiki/Phone_connector_(audio)
  5. http://en.wikipedia.org/wiki/Frequency-shift_keying
  6. http://www.maximintegrated.com/en/app-notes/index.mvp/id/4676
  7. https://developer.android.com.cn/reference/android/media/AudioTrack.html
  8. https://developer.android.com.cn/reference/android/media/AudioRecord.html
  9. https://github.com/zokama
  10. http://lirc.org
  11. http://www.nxp.com/news/press-releases/2014/05/nxp-unveils-smartphone-quick-jack-solution-transforming-audio-jack-into-multi-purpose-self-powered-data-port.html
  12. http://web.eecs.umich.edu/~prabal/projects/hijack/

关于作者

李亮(Li Liang)毕业于长春工业大学,获得信号与信息处理专业硕士学位。他于 2013 年加入英特尔,担任中国 Android 移动赋能团队的应用工程师。他专注于 Android 平台上的差异化赋能,例如多窗口等。

© . All rights reserved.