Chinaunix首页 | 论坛 | 博客
  • 博客访问: 404420
  • 博文数量: 120
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 741
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-27 18:15
文章分类

全部博文(120)

文章存档

2016年(13)

2015年(41)

2014年(66)

我的朋友

分类: Android平台

2014-08-12 00:24:27

1. java中加入打开bluetooth的操作
首先在AndroidManifest.xml中加入bluetooth的权限
  1. <uses-permission android:name="android.permission.BLUETOOTH" />
  2.     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
然后在java中加入以下几句,先获取adapter,然后发一个广播。
  1. BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
  2. if(!adapter.isEnabled())
  3. {
  4.     //如果蓝牙设备不可用的话,创建一个intent对象,该对象用于启动一个Activity,提示用户启动蓝牙适配器
  5.     Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  6.     startActivity(intent);
  7. }


2. framework层对于打开的处理
2.1 这个getDefaultAdapter是获取的什么东东呢?
在./frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java中
  1. public static synchronized BluetoothAdapter getDefaultAdapter()
  2. {
  3.     if (sAdapter == null) {
  4.         IBinder b = ServiceManager.getService(BLUETOOTH_MANAGER_SERVICE);
  5.         IBluetoothManager managerService = IBluetoothManager.Stub.asInterface(b);
  6.         sAdapter = new BluetoothAdapter(managerService);
  7.         }
  8.     }
  9.     return sAdapter;
  10. }
先获取了BLUETOOTH_MANAGER_SERVICE服务,然后在构造函数中
将代理IBluetoothManager赋给了mManagerService。
  1. BluetoothAdapter(IBluetoothManager managerService)
  2. {
  3.     mService = managerService.registerAdapter(mManagerCallback);
  4.     mManagerService = managerService;
  5.     mServiceRecordHandler = null;
  6. }
以后就用这个mManagerService来进行操作了。
2.1.1 这个BLUETOOTH_MANAGER_SERVICE服务是什么呢?
在./frameworks/base/services/java/com/android/server/SystemServer.java中
  1. bluetooth = new BluetoothManagerService(context);
  2. ServiceManager.addService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE, bluetooth);
就是BluetoothManagerService这个东东。
2.2  enalbe过程的各个调用
./frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java
  1. public boolean enable() {
  2.         if (isEnabled() == true){
  3.             return true;
  4.         }
  5.         try {
  6.             return mManagerService.enable();
  7.         } catch (RemoteException e) {Log.e(TAG, "", e);}
  8.         return false;
  9.     }
其中mManagerService.enable(),就是通过代理调用了BluetoothManagerService的enable
2.2.1 bt_adapter调用了bt_ms的enable
在frameworks/base/services/java/com/android/server/BluetoothManagerService.java中
  1. public boolean enable() {
  2.     mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission");
  3.     synchronized(mReceiver) {
  4.         mQuietEnableExternal = false;
  5.         mEnableExternal = true;
  6.         long callingIdentity = Binder.clearCallingIdentity();
  7.         persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
  8.         Binder.restoreCallingIdentity(callingIdentity);
  9.         sendEnableMsg(false);
  10.     }
  11.     return true;
  12. }
BluetoothManagerService的enalbe过程就是调用了sendEnableMsg,即发送一个MESSAGE_ENABLE
在msg的handler中
  1. private void handleEnable(boolean quietMode) {
  2.     if (!mQuietEnable) {
  3.         if(!mBluetooth.enable())
  4.     }
  5.     else {
  6.         mBluetooth.enableNoAutoConnect();
  7.     }
  8. }
BluetoothManagerService的enable就是调用了mBluetooth的enable.

2.3  这个mBluetooth是什么东东呢?
  1. 这个mBluetooth是 mBluetooth = IBluetooth.Stub.asInterface(service);
在./packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java中
  1. private static class AdapterServiceBinder extends IBluetooth.Stub
噢,原来这个BluetoothManagerService的enable又是通过代理调用到了Bluetooth.apk中的enalbe。


3. Bluetooth.apk中对于enable的操作
在./packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java中

  1. boolean enable() {
  2.     return enable (false);
  3. }
  4. public synchronized boolean enable(boolean quietMode) {
  5.      Message m = mAdapterStateMachine.obtainMessage(AdapterState.USER_TURN_ON);
  6.      mAdapterStateMachine.sendMessage(m);
  7.      return true;
  8. }
就是发送一个msg: USER_TURN_ON
在./packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterState.java中
的processMessage在处理USER_TURN_ON时要进行状态切换,会调用mAdapterService.processStart()
再次发送一个msg: STARTED,最终会调用 mAdapterService.enableNative();
3.1 Bluetooth.apk调用jni中的enableNative
在./packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cpp中
  1. static jboolean enableNative(JNIEnv* env, jobject obj) {
  2.     int ret = sBluetoothInterface->enable();
  3.     result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
  4.     return result;
  5. }
3.1.1 这个sBluetoothInterface又是怎么来的呢?
在./packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cpp中
  1. static void classInitNative(JNIEnv* env, jclass clazz) {
  2.     const char *id = (strcmp(value, "1")? BT_STACK_MODULE_ID : BT_STACK_TEST_MODULE_ID);   
  3.     hw_get_module(id, (hw_module_t const**)&module);
  4.     hw_device_t* abstraction;
  5.     module->methods->open(module, id, &abstraction);
  6.     bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction;
  7.     sBluetoothInterface = btStack->get_bluetooth_interface();
  8. }
这个BT_STACK_MODULE_ID 就是bluetooth.default.so,在InitNative函数中打开了bluetooth.default.so这个库。
然后sBluetoothInterface就代表了bluetooth.default.so的接口。


4.  external中的bluetooth.default.so
在./external/bluetooth/bluedroid/btif/src/bluetooth.c中有HAL_MODULE_INFO_SYM 的定义,
Bluetooth.apk中的jni调用的enable也就是调用了bluetoothInterface中的enable
  1. static int enable( void )
  2. {
  3.     if (interface_ready() == FALSE)
  4.         return BT_STATUS_NOT_READY;

  5.     return btif_enable_bluetooth();
  6. }
4.1
在./external/bluetooth/bluedroid/btif/src/btif_core.c中
  1. bt_status_t btif_enable_bluetooth(void)
  2. {
  3.     btif_core_state = BTIF_CORE_STATE_ENABLING;
  4.     bte_main_enable(btif_local_bd_addr.address);
  5.     return BT_STATUS_SUCCESS;
  6. }

在./external/bluetooth/bluedroid/main/bte_main.c中
  1. void bte_main_enable(uint8_t *local_addr)
  2. {
  3.     BTE_Init();
  4.     if (bt_hc_if)
  5.     {
  6.         int result = bt_hc_if->init(&hc_callbacks, local_addr);
  7.         bt_hc_if->set_power(BT_HC_CHIP_PWR_ON);
  8.         bt_hc_if->preload(NULL);
  9.     }
  10. }
其中 bt_hc_if的初始化是:
bt_hc_if = (bt_hc_interface_t *) bt_hc_get_interface();
同时这个get_interface是
./external/bluetooth/bluedroid/hci/src/bt_hci_bdroid.c
  1. const bt_hc_interface_t *bt_hc_get_interface(void)
  2. {
  3.     return &bluetoothHCLibInterface;
  4. }
原来这个bt_hc_if 就是 bluetoothHCLibInterface,
4.2 所以bt_hc_if->set_power,就是调用bluetoothHCLibInterface中的set_power
  1. static void set_power(bt_hc_chip_power_state_t state)
  2. {
  3.     int pwr_state;
  4.     pwr_state = (state == BT_HC_CHIP_PWR_ON) ? BT_VND_PWR_ON : BT_VND_PWR_OFF;
  5.     if (bt_vnd_if)
  6.         bt_vnd_if->op(BT_VND_OP_POWER_CTRL, &pwr_state);
  7.     else
  8.         ALOGE("vendor lib is missing!");
  9. }
这又是一个函数指针
4.3 又是一个函数指针
在./external/bluetooth/bluedroid/hci/src/bt_hw.c中
  1. void init_vnd_if(unsigned char *local_bdaddr)
  2. {
  3.     void *dlhandle;
  4.     dlhandle = dlopen("libbt-vendor.so", RTLD_NOW);
  5.     bt_vnd_if = (bt_vendor_interface_t *) dlsym(dlhandle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
  6.     bt_vnd_if->init(&vnd_callbacks, local_bdaddr);
  7. }
bt_vnd_if就是libbt-vendor.so中的接口,所以这个bt_vnd_if->op就是调用了libbt-vendor.so中的op

5. libbt-vendor.so
在./device/common/libbt/src/bt_vendor_brcm.c中
  1. static int op(bt_vendor_opcode_t opcode, void *param)
  2. {
  3.     switch(opcode)
  4.     {
  5.         case BT_VND_OP_POWER_CTRL: //0
  6.             {
  7.                 int *state = (int *) param;
  8.                 if (*state == BT_VND_PWR_OFF)
  9.                 {
  10.                     upio_set_bluetooth_power(UPIO_BT_POWER_OFF);
  11.                     usleep(200000);
  12.                 }
  13.                 else if (*state == BT_VND_PWR_ON)
  14.                 {
  15.                     upio_set_bluetooth_power(UPIO_BT_POWER_ON);
  16.                     usleep(500000);
  17.                 }
  18.             }
  19.             break;
  20.     }
  21. }
5.1 继续看
在./device/common/libbt/src/upio.c中
  1. int upio_set_bluetooth_power(int on)
  2. {
  3.    char buffer = '0';
  4.     switch(on)
  5.     {
  6.         case UPIO_BT_POWER_OFF:
  7.             buffer = '0';
  8.             break;

  9.         case UPIO_BT_POWER_ON:
  10.             buffer = '1';
  11.             break;
  12.     }
  13.   
  14.     if (is_rfkill_disabled())
  15.         return 0;

  16.     if (rfkill_id == -1)
  17.     {
  18.         //下面这个init确认路径 /sys/class/rfkill/rfkill[n]/state 中的n
  19.         if (init_rfkill())
  20.             return ret;
  21.     }
  22.     //打开/sys/class/rfkill/rfkill0/state
  23.     fd = open(rfkill_state_path, O_WRONLY);
  24.     //将0或者1写到/sys/class/rfkill/rfkill0/state这个文件中
  25.     sz = write(fd, &buffer, 1);
  26.     return ret;
  27. }
原来这最核心的就是向内核sys中写。

6.总结
这一系列的调用如下图所示:


阅读(1333) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~