蓝牙40蓝牙hid和spp的区别都有哪些区别

6030人阅读
Android(132)
分类:& 15:46&7648人阅读&(18)&&
Android Bluetooth HID实现详解
Android&关于蓝牙的部分使用的是BlueZ协议栈。但是直到目前2.3.3都没有扩展HID的profile,只是实现了最基本的Handset和d2dp的profile,所以我们的工作涉及到从应用到jni三层的修改,具体修改文件如图所示,绿色表示新建的类,橙色表示修改的类。
一.&本地层
路径: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接口。
主要实现以下两个方法函数:
static&jboolean&connectSinkNative(JNIEnv&*env,&jobject&object,&jstring&path)&{&&&&#ifdef&HAVE_BLUETOOTH&&&&&&&&LOGV(__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;&&&&&&&&}&&&&#endif&&&&&&&&return&JNI_FALSE;&&&&}&&&&&&&&&static&jboolean&disconnectSinkNative(JNIEnv&*env,&jobject&object,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&jstring&path)&{&&&&#ifdef&HAVE_BLUETOOTH&&&&&&&&LOGV(__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&,&&Disconnect&,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DBUS_TYPE_INVALID);&&&&&&&&&&&&&&&&&env-&ReleaseStringUTFChars(path,&c_path);&&&&&&&&&&&&return&ret&?&JNI_TRUE&:&JNI_FALSE;&&&&&&&&}&&&&#endif&&&&&&&&return&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)
最后需要修改应用部分,应用部分的修改点比较分散,不想框架层那样整块模仿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)&{&&&&……&&&&&&&&&&&&&&&&&&&&&//&HID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(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 上实现蓝牙的一些Profile
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2165328次
积分:20156
积分:20156
排名:第304名
原创:52篇
转载:739篇
评论:257条
(1)(4)(9)(1)(4)(7)(2)(1)(5)(5)(7)(8)(7)(3)(5)(11)(4)(5)(9)(6)(4)(8)(8)(10)(13)(10)(21)(24)(6)(4)(29)(19)(12)(24)(12)(4)(6)(5)(16)(27)(23)(17)(5)(15)(23)(50)(6)(5)(19)(11)(9)(2)(13)(15)(19)(1)(2)(2)(11)(8)(2)(14)(1)(9)(6)(8)(2)(2)(29)(41)(24)(36)4.1最大的优点就是蓝牙有了HID,可以用蓝牙键盘了_佳域g2吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:10,788贴子:
4.1最大的优点就是蓝牙有了HID,可以用蓝牙键盘了收藏
以前的版本虽然有蓝牙,但却没有蓝牙HID功能,什么蓝牙键盘手柄鼠标等等都用不了。只有刷乐蛙的才能用,现在4.1也集成了蓝牙HID,蓝牙键盘手柄什么的,立即就能用,很爽。就是蓝牙手柄有0.5秒的延迟感,玩游戏略有不爽,搜索之后才知道,这是蓝牙的硬伤,也正因为如此,才让后来的2.4g模式的手柄大行其道。借用某论坛某版主的话说就是:“要不是蓝牙延迟的如此操蛋,哪轮得到2.4g大行其道”假如将来mtk的6589集成了OTG,那手机就可以用2.4g的手柄了,不过要插个2.4g的usb接收器,显得累赘,不方便携带,而且还挺费电。
好的话剧,坚决不能错过,价格也很重要!
4.03的能直接刷4.1的么?
原来――来自中兴ZTE,中兴专用客户端!低调的奢华,唯你独有!by:伟少
MTK 4.1可以使用蓝牙手柄???
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 蓝牙hid是什么 的文章

 

随机推荐