展会信息港展会大全

Android Bluetooth HID完成详解
来源:互联网   发布日期:2015-09-28 15:53:16   浏览:3042次  

导读:Android Bluetooth HID落实详解Android 关于蓝牙的局部运用的是BlueZ协定栈。然而直到眼前2.3.3都不曾伸展HID的profile,只是完成了最大致的Handset和d2dp的profile一. 当地层路径:framework/base/core/jni......

Android Bluetooth HID落实详解

Android 关于蓝牙的局部运用的是BlueZ协定栈。然而直到眼前2.3.3都不曾伸展HID的profile,只是完成了最大致的Handset和d2dp的profile

一. 当地层

路径:framework/base/core/jni/

比照android_server_BluetoothA2dpService.cpp修建 android_server_bluetoothHidServer.cpp。该类中首要是穿过dbus对bluez协定栈的走访,dbus 的通用方式都在android_bluetooth_common.cpp中完成,我们做的仅仅是经过dbus_func_args_async调用到 bluez供给的input接口,AS3技术与提醒23-28。

重要得逞以下两个方式函数:

tatic jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {#ifdef HAVE_BLUETOOTHLOGV(__FUNCTION__);if (nat) {const char *c_path = env->GetStringUTFChars(path, NULL);bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,c_path, "org.bluez.Input", "Connect",DBUS_TYPE_INVALID);env->ReleaseStringUTFChars(path, c_path);return ret ? JNI_TRUE : JNI_FALSE;}#endifreturn JNI_FALSE;} static jboolean disconnectSinkNative(JNIEnv *env, jobject object,jstring path) {#ifdef HAVE_BLUETOOTHLOGV(__FUNCTION__);if (nat) {const char *c_path = env->GetStringUTFChars(path,<a href="http://www.bo-carter.info/" style="color: black; text-decoration: none; font-size: 8pt;">羊毛被</a>, NULL);bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,c_path, "org.bluez.Input", "Disconnect",DBUS_TYPE_INVALID);env->ReleaseStringUTFChars(path, c_path);return ret ? JNI_TRUE : JNI_FALSE;}#endifreturn JNI_FALSE;}

此地要留神将该文件增加到AndroidRuntime.cpp和Android.mk中,不然不会编译到动态库中。

此局部编译后最终身成libandroid_runtime.so并轮换到system/libs下

二.Framework的java部分

路径framework/base/java/android/server/中增加BluetoothHidService.java文件

路径framework/base/java/android/bluetooth/中增加BluetoothHid.java和IBluetoothHid.aidl文件。

interface IBluetoothHid {boolean connect(in BluetoothDevice device);boolean disconnect(in BluetoothDevice device);int getState(in BluetoothDevice device);boolean setPriority(in BluetoothDevice device, int priority);int getPriority(in BluetoothDevice device);}

BluetoothHid.java中重要的两个措施connect和disconnect间接地穿过aidl探访BluetoothHidService。此地主要是得逞跨过程并为上层供给可直接走访的计策。

由此framework的重要局部打包生成framework.Jar并最后策划到system/framework里。

三.使用(Settings.apk)

最终必要修正利用局部,使用部分的更正点对照疏散,GTK+的编译还真烦琐,不想框架层那样整块模拟A2DP的样子那么适宜,但也不是说jni局部有多么轻易。反而对于我这种对C语言不熟知的人来说,批改jni是最头疼得事了。好在蓝牙HID 这局部框架层的改动都是整块举行的,领会上还算比价简单。

总的来说在Settings.apk中要修正的文件首要是这样几个:

LocalBluetoothProfileManager.java 此地首要供给一个HID的profile以便利用层走访。建一个HIDProfile的class调用framework中的BluetoothHID。切实上即使穿过bender机制调用了BluetoothHidService。

CashedBluetoothDevice中添加显现蓝牙键盘的图标,雅漾,BluetoothPairingDialog中则必要添加一段蓝牙配对印证解决的代码,我是比照i9000中先弹出一个随机数,然后在键盘中敲入相像的随机数即配对胜利,详细落实如下:

Private view createView(){if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) {// HIDif (isDeviceKeyboard(mDevice)) {String pin = String.format("%06d", Long.valueOf(Math.abs(new Random().nextLong() % 1000000L)));mPairingView.setVisibility(View.GONE);messageView.setText(getString(R.string.bluetooth_enter_keyboard_pin_msg, pin, name));byte[] bytePin = BluetoothDevice.convertPinToBytes(pin);if (bytePin != null) {mDevice.setPin(bytePin);}}}

以上为android中完成蓝牙键盘的详细环节。

Android的Handset/Handfree的实现方式和A2DP/AVRCP的方式有很大的不同,Handset/Handfree是 直接在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,所以大大降低了实现的难度。其实bluez的audio plugin上也有Handset/Handfree的实现,但不知道为什么Google没有用它,而要在RFCOMM Socket上自己实现一个,这使得Handset/Handfree的实现显得比较复杂。

HID要用到bluez的input plugin,Android已经把它编译进去了,在system/lib/bluez-plugin/input.so下,与input.so一起的还 有audio.so库,那是供A2DP/AVRCP用的。参照frameworks/base/core/jni /android_server_BluetoothA2dpService.cpp,自己写一个HID用的的.cpp文件,其中跟A2DP一样利用 DBUS调用input.so库的CreateDevice/Connect/Disconnect等函数,具体源码在external/bluez /utils/input/manager.c和external/bluez/utils/input/device.c中。完了之后,参照 frameworks/base/core/java/android/server/BluetoothA2dpService.java和 frameworks/base/core/java/android/bluetooth/BluetoothA2dp.java及 frameworks/base/core/java/android/bluetooth/IBluetoothA2dp.aidl,自己分别写两个 JAVA类及AIDL接口,余下的就是在packages/apps/Settings/src/com/android/settings /bluetooth目录下的各个文件的修改了,比较省事的方法是搜一下A2DP,只要是A2DP要修改的地方照葫芦画瓢添加修改就是了。

DUN/SPP要用到bluez的serial plugin,因Android没有编译进去,所以要在external/bluez/utils/serial目录下写一个Android.mk,把它 编译进去,生成system/lib/bluez-plugin/serial.so库,其它的跟HID类似。

赞助本站

人工智能实验室

相关热词: Bluetooth HID

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港