原文链接:http://android.eoe.cn/topic/android_sdk
2012年的Android辅助设备开发工具包(ADK)是Android开放设备协议(AOA)设备的最新参考实现,它被用于帮助Android硬件辅助设备开发者
和软件开发者开发制造Android辅助设备。ADK2012基于Arduino开源电子产品原型设计平台,并增加了一些软硬件方面的扩展,而这些扩展能够使该工具包开发的产品与Android设备进行通信。
在2012年的Google I/O开发者大会上只有数量很少的工具包被发行。如果你没有得到其中的一个工具包,不要着急,关于硬件的规范和设计文件将由生产商和业余爱好者发布。你将看到有相似功能的工具包,你可以通过购买得到它们,当然你也可以自己开发一套工具包。
这个ADK中一个重要的新功能是你可以通过USB连接播放音频文件。如果你对在Android平台上开发与音频相关的USB辅助设备感兴趣,请确定这个
ADK中包含了对USB音频扩展坞的参考实现。
ADK2012基于Arduino开源电子产品原型设计平台,同时也是开放的硬件设计。其硬件设计文件和固件源代码包含在了下载的ADK软件包中。
此ADK包含了两个重要的物理硬件组件:
1.主板包括了微处理器,USB连接,电源接口和输入输出针口。这个主板可以被移除然后独立于余下的硬件单独使用。
2.屏蔽传感器,发光二极管(LED),输入控制,音频放大器和扬声器输出,把它们包含在一个自定义的多边形盒外壳中。
以下是主要的ADK硬件特性:
* 一个32位的ARM Cortex M3 微处理器。
* 将Android设备的USB连接和程序设计和调试的电脑连接分离。
* 灯光,颜色,距离,温度,湿度,气压,加速传感器
* 微SD卡插槽
* 支持蓝牙
此ADK预载了一个你可以立即使用的闹钟固件程序。ADK 2012是一个Android伴随程序,你可以在Google Play上下载它。Android应用程序和ADK固件(一个Arduino的草图)的源代码都可以在此页下载。
与ADK 2012一起发布的还有其他的部件,这些部件可以帮助你开发辅助设备,包括:
* AC能源适配器
* USB A 到 微型USB B的连接电缆
* 微型USB B到微型USB AB连接器(小的,矩形的插头)
* 微型 SD卡,在ADK的SDK卡槽中已经预装
ADK中预载了一个闹钟程序。这个固件程序允许你像使用闹钟一样使用这个ADK。
一下是ADK使用步骤:
1.轻轻按压外壳两个最宽的面来打开ADK
2.将提供的AC电源适配器(圆形插头)连接到ADK主板上,或者将一根USB电缆连接到端口标记的电脑和你的电脑的USB端口上。
3.将你的指尖持续放在控制面板的闹钟符号上。
注意:你可能需要将你的手指持续放在适当的地方1-2秒。
4.使用时钟数字内部的+、-符号来设置正确的时间。
5.将你的指尖放在闹钟符号上来激活闹钟。
6.使用时钟数字内部的+、-符号来设置闹钟时间。
7.使用最近两个时钟数字内部的+、-符号来开启或关闭闹钟。
8.将你的指尖持续放在闹钟符号上,然后点击外壳上方的滑动控制来改变闹钟的音调。
使用ADK2012版伴随应用中的闹钟的步骤:
1.在你的Android设备中下载伴随应用,Android版本需要3.1(API等级12)或更高:
:* 用一个有NFC功能的Android设备,解锁,并按住ADK外壳左侧,按照提示安装应用。
:-或者-
:* 在你的设备上启动Google Play搜索ADK 2012应用并安装。如果你找不到应用程序,你的设备可能是不兼容的,请尝试在另一个设备上安装。
2.用下面其中的一种方法将你的Android设备连接到ADK上:
:* 用蓝牙连接:
:1.将AC电源适配器的插头插入ADK中
:2.将你的Android设备中的蓝牙功能开启(设置-蓝牙)
:3.在设置页面中,按蓝牙选项来查看匹配的设备
:4.选择搜索设备来找到ADK2012辅助设备,然后根据屏幕上的指示进行连接
:5.匹配完成后,在你的Android设备上开启ADK2012医用程序
:6.在启动画面中,选择使用蓝牙按钮
:7.在匹配设备的列表中,选择ADK 2012设备
:8.ADK 2012应用程序应该切换到菜单画面中,你可以开始与ADK辅助设备进行交互。
:* 用USB进行连接:
1.将AC电源适配器的插头插入ADK中
2.将微型USB AB的连接插头(小的矩形插头)连接到ADK板上端口标记的听筒上。
3.解锁你的Android设备,将微型USb B的连接插头连接到你的设备上。
注意:你的设备必须支持Android usb辅助设备模式。支持这种模式的设备包括Google Nexus设备。
4.在Android设备上,你应该看见连接到ADK DemoKit 2012的提示,选择 是 。
5.ADK 2012应用程序应该自动启动,然后你可以与ADK进行交互。
注意:当以USB连接Android设备来使用ADK的时候,要确保AC电源适配器已经插入。连接到电脑的USb连接插头不提供充足的电压来给ADK以及连接到设备的USb连接插头提供电力。
ADK2012带有音频输出功能,包括一个放大器和扬声器。你可以通过蓝牙或者usb连接使用它让你的Android设备播放音频。
通过蓝牙播放音频:
1.根据上一节的指示,通过蓝牙将你的Android设备连接到ADK上
2.在你的Android设备上,操作到设置-蓝牙页面来查看匹配的设备列表,并确认与ADK连接
3.选择ADK2012边上的设置图标
4.确保媒体音频功能已启用
5.打开一个播放音乐或其他音频的应用程序
6.播放歌曲或声音,并通过ADK扬声器来聆听他!
通过USB来播放音频,你必须使用Android4.1(API等级16)或者更高版本的设备:
1.将AC电源适配器的插头插到ADK中
2.将微型USb AB的连接插头(小的矩形插头)连接到ADK板上端口标记的听筒上。
3.解锁你的Android设备,将微型USb B的连接插头连接到你的设备上。
注意:你的设备必须支持Android USb辅助设备模式。支持这种模式的设备包括Google Nexus设备。
4.在Android设备上,你应该看见一个连接到ADK Deomkit 2012的提示,选择取消使ADK仅作为媒体设备连接。
5.打开一个播放音乐或其他音频的应用程序
6.播放歌曲或声音,并通过ADK扬声器来聆听它!
注意:当以USb连接Android设备来使用ADK的时候,要确保AC电源适配器已经插入。连接到电脑的USb连接插头不提供充足的电压来给ADK以及连接到设备的USb连接插头提供电力。
ADK 2012是一个硬件平台,也是一套以原型设计Android辅助设备的软件库。这个部分讨论如何为ADK变成建立开发环境,来使它做你想做的事以及为建立你自己的Android辅助设备进行软件测试。
ADK2012支持的软件和硬件可以在Android源码库。按照以下的指示为ADK获取源材料。
下载ADK2012软件,源码,硬件设计说明书:
1.给你的开发系统下载并安装Git
2.按照Android open source project网站上的说明下载并安装回购工具
3.在终端窗口中,给所下载的资源文件建立一个新的指南,初始化并同步本地存储库:
$> mkdir android-accessories
$> cd android-accessories
$> repo init -u https://android.googlesource.com/accessories/manifest
$> repo sync
在成功完成这个步骤后,你应该拥有利用ADK2012工作的源码和工具。
ADK2012带有集成开发环境(IDE),你可以使用它来开发软件并未ADK2012辅助设备编写程序。下面的指示解释了如何建立并运行 ADK2012的IDE。
建立和运行ADK2012的IDE:
1从java.oracle.com上下载并安装JDK6或者更高的版本
2.为你的开发平台下载ADK2012的IDE
:* Windows
:* Mac
:* Linux32bit,64bit
3.解压下载的文件
4.解压ADK2012_IDE文件夹并执行arduino文件来运行应用程序
在你成功安装并运行ADK2012 IDE后,你必须配置它以使用ADK2012资源库。
使用ADK类库配置ADK2012 IDE:
1.启动ADK2012 IDE ,然后选择File>Preferences.
2.在Preferences对话框中,记下Sketchbook location这个目录
3.复制 /adk2012/board/library/ADK2这个目录和它的内容到你的sketchbook/libraries/目录,如此,你就可以创建一个sketchbook/libraries/ADK2目录。
4.停止然后重启ADK2012 IDE。
5.在IDE中,选择File>Examples>ADK2,然后选择其中一个例子
* clock-预载在ADK2012中的示例
* BluetoothScan-一个将辅助设备与Android设备通过蓝牙连接的示例演示代码
* usbaccessory-一个将辅助设备与Android设备通过USB电缆连接的示例演示代码
6.将ADK板上的电脑端口与你的用于开发的电脑用微型USB电缆相连接。
7.在ADK2012 IDE中,用ADK建立一个串行端口连接。选择Tools>Serial Port然后选择用于ADK的端口。
8.在ADK2012 IDE中,通过Tools>Board>GoogleADK2选择ADK
9.修改一个示例或新建一个
10.通过File>Upload上传示例到ADK。当ADK2012 IDE提示Done uploading,示例已经上传而且ADK已经准备好于你的Android设备通信。
一个替代的,基于文件生成和上传的系统也可以在ADK2012中使用。这个系统基于命令行,也是为当使用IDE环境去装载软件到辅助设备不太方便时的生产环境设计的。
建立环境:
1.下载ADK2012源码文件
2.在一个终端窗口中,进入/adk2012/board/MakefileBasedBuild
3.运行一下命令,然后跟着指示:
$> ./setup
为你的辅助设备建立一个程序
1.将你的辅助设备的代码放到MakefileBasedBuild/app这个目录中,包括所有的类库文件。将app/main.c这个文件的格式作为你的标准格式
2.运行以下命令,然后跟着指示:
$> ./build
在你的辅助设备上载入程序:
1.运行构建程序,并确保你的程序编译成功
2.将辅助设备与你的电脑用USB连接
3.检查你的辅助设备连接到哪一个端口上,然后在flash脚本中修改UART这个变量以修正端口地址。在Linux机器上,端口地址一般是/dev/ttUSB0
4.运行以下命令以在辅助设备上载入程序
$> ./flash
Android辅助设备的核心特性是它的与Android设备连接及通信的能力。在你的辅助设备和Android设备被之间连接一个快速稳定的连接是构建一个应用于辅助设备被的软件的第一步。这个部分介绍ADK2012中使用连接和通信的要领,然后,你就可以应用它们去开发你自己的Android辅助设备。
ADK2012应用和硬件部分的辅助设备使用蓝牙串行端口配置文件(SPP)连接来通信。这种连接允许ADK辅助设备和Android设备之间的双向通信。
注意:ADK硬件的实现允许使用其他配置文件和多种连接方式。然而,ADK2012与Android应用之间的基本通信是基于SPP。
辅助设备的蓝牙代码
为了使用蓝牙进行通信,ADK2012辅助设备的clock.ino示例在执行setup()方法时调用一个btStart()方法以使使用无线电频率通信成为可能和开启蓝牙的监听模式。
ADK L;
void setup() {
L.adkInit();
L.btStart();
}
...
void btStart(){
uint8_t i, dlci;
int f;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
L.btEnable(adkBtConnectionRequest, adkBtLinkKeyRequest, adkBtLinkKeyCreated,
adkBtPinRequest, NULL);
dlci = L.btRfcommReserveDlci(RFCOMM_DLCI_NEED_EVEN);
if(dlci) dbgPrintf("BTADK: failed to allocate DLCIn");
else{
//change descriptor to be valid...
for(i -1; i < sizeof(sdpDescrADK); i++){
if(sdpDescrADK[i] == MAGIX){
if(f i;
else break;
}
}
if(i != -1){
dbgPrintf("BTADK: failed to find a single marker in descriptorn");
L.btRfcommReleaseDlci(dlci);
return;
}
sdpDescrADK[f] = dlci >> 1;
dbgPrintf("BTADK has DLCI %un", dlci);
L.btRfcommRegisterPort(dlci, btAdkPortOpen, btAdkPortClose, btAdkPortRx);
L.btSdpServiceDescriptorAdd(sdpDescrADK, sizeof(sdpDescrADK));
}
|
}
请注意,sdpDescrADK这个对象包括了一个通用的唯一标识符(UUID)在变量BT_ADK_UUID中。这个标识符必须与在bluetoothSocket连接请求中提供的设备的UUID匹配。这个连接请求在Android应用的代码中可以找到。
一旦蓝牙可以与以上代码一起使用,辅助设备监听连接请求。ADK类库处理监听和连接详情,然后,辅助设备在每一个循环运行时调用
ADK::adkEventProcess()方法:
void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}
如果一个蓝牙连接已经被建立了,任何命令都被路由到btAdkPortRx()这个回调方法(这个回调方法在ADK类库中作为btStart()方法的一部分注册)然后根据情况执行。ADK辅助设备通过蓝牙连接用ADK::btRfcommPortTx()方法发回消息。如果你想了解更多细节,仔细看在clock.ino中这些方法的实现。
在ADK2012Android应用中,处理蓝牙连接的代码封装在一个BTConnection类中。在这个类中,应用的请求访问蓝牙适配器然后与ADK2012辅助设备建立一个连接。一下是相关代码的摘要:
mAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = mAdapter.getRemoteDevice(address);
mSocket = device.createInsecureRfcommSocketToServiceRecord(ADK_UUID);
mSocket.connect();
注意第二行中的ADK_UUID参数。这个标识符必须辅助设备输出的标识符(就是之前提到的BT_ADK_UUID)相符。否则,协议将会失效,然后BluetoothSocket连接不会建立。一旦连接建立了,你从socket连接获得了一个InputStream和OutputStream对象以与辅助设备通信。
mInStream = mSocket.getInputStream();
mOutStream = mSocket.getOutputStream();
仔细阅读BTConnection.java文件,这个文件由下载的ADK2012软件提供,你可以从中获取更多的详情。
ADK2012应用和辅助设备也可以那个USB连接来通信,这一点与最原始ADK类似。
ADK类库拥有大部分USB连接的实现细节,辅助设备的代码必须调用一些方法以初始化USB连接,其中包括设置辅助设备的标示符字符串:
ADK L;
void setup() {
L.adkInit();
L.usbSetAccessoryStringVendor(...);
L.usbSetAccessoryStringName(...);
L.usbSetAccessoryStringLongname(...);
L.usbSetAccessoryStringVersion(...);
L.usbSetAccessoryStringUrl(...);
L.usbSetAccessoryStringSerial(...);
L.usbStart();
}
注意:标识符字符串必须与所连接的Android应用的USB辅助设备过滤设置相符,否则,应用将不会与辅助设备建立连接。
一旦USB与以上代码一起工作了,辅助设备开始监听连接请求。ADK类库处理监听到的事件和连接细节,然后辅助设备在每一次循环执行时调用ADK::adkEventProcess()方法:
void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}
辅助设备必须检查一个正在使用的USB连接以处理命令和发送消息。以下是相关代码的摘要:
void loop() {
if (L.accessoryConnected()) {
int recvLen = L.accessoryReceive(msg, sizeof(msg));
if (recvLen > 0) {
... // process message
}
1 |
L.accessorySend(outmsg, outmsgLen);
|
}
L.adkEventProcess();
}
想获得更多详情,请仔细阅读这些方法在clock.ino示例中的实现代码。
ADK2012的Android应用中,处理USB连接的代码被封装在一个UsbConnection类中,这个类建立一个BroadcastReceiver以监听USB事件然后在一个符合条件的连接事件被接收到是试图进行连接。以下是相关代码的摘要:
import com.android.future.usb.UsbAccessory;
import com.android.future.usb.UsbManager;
mUSBManager = UsbManager.getInstance(this);
UsbAccessory acc = mUSBManager.getAccessoryList()[0];
if (mUSBManager.hasPermission(acc)) return;
ADK2012应用使用支持库来实现USB辅助设备连接,这么做是为了支持Android2.3.4(API等级为10)的设备。如果你只需要支持Android3.1(API等级为12)和更高版本的设备,你可以替换以下代码中的前四行:
import android.hardware.usb.UsbAccessory
import android.hardware.usb.UsbManager
mUSBManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory acc = (UsbAccessory)
1 |
intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);</java>
|
注意,此应用只在USB辅助设备标识符信息与res/xml/usb_accessory_filter.xml文件中的信息相符时才接受事件,这些在应用的清单文件中有记录:
ADK2012辅助设备不会接受来自其他USB设备的连接。
一旦连接被建立了,应用可以通过文件输入输出流与辅助设备通信,这一点在一下代码中可以见到:
ParcelFileDescriptor mFD = mUSBManager.openAccessory(acc);
if (mFD != null) {
FileDescripter fd = mFD.getFileDescriptor();
mIS = new FileInputStream(fd); // use this to receive messages
mOS = new FileOutputStream(fd); // use this to send commands
}
仔细阅读UsbConnection.java文件,这个文件在ADK2012源码中可以找到,你可以从中获得更多的实现细节。
ADK2012中一个重要的新特性是可以使用USB连接播放音频。这个创新举动作为Android开放辅助设备(AOA)协议2.0的一个更新被介绍,它可以在Android4.1(API等级16)或更高的设备上使用。
ADK2012为开发者提供了一个关于这个功能的参考实现。你不需要在Android设备上安装任何应用,辅助设备开发者需要支持AOAv2.这个实现演示了将16位,44.1kHz立体声PCM源数据的音频输出压缩到一个单通道中。而这一切都是基于辅助设备上的音频硬件。
使用由ADK类库提供的音频输出特性只要求调用一些方法。第一个调用的是辅助设备中的常规的setup()方法,这个方法使辅助设备准备好进行USB连接和音频输出,以下为示例代码的摘要:
ADK L;
void setup() {
L.audioInit();
L.usbh_init()
L.usbStart();
}
想要获取更多的关于ADK::audioInit()方法的信息,请查看libraries/ADK/Audio.c类库文件。想要获取更多关于ADK::usbh_init()方法的信息,请查看libraries/ADK/Usbh.c类库文件。
完成setup这个方法后,loop()方法调用ADK::adkEventProcess()方法以处理音频输出和其他ADK的方法:
void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}
这个调用运行ADK的任务队列,然后作为运行过程的一部分,任务队列运行libraries/ADK/Usbh_c中的usbh_work()方法,这个方法处理音频输出请求。仔细阅读这个方法的实现细节。想要获得更多的关于音频输出的实现细节,请查看libraries/ADK/accessroy.c这个类库文件。