蓝牙和wifi的一个奇怪问题之解决 淩亂°似流年 2022-01-14 13:53 345阅读 0赞 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] [http://www.oschina.net/question/158589\_55569][http_www.oschina.net_question_158589_55569] 以下是我自己关于这个问题的详细分析过程: 问题:bluetooth必须在wifi开启后才能正常开启。 目标:bluetooth的开启不受wifi影响。 现象: 先打开wifi,再打开bluetooth。 I/wpa\_supplicant( 2748): CTRL-EVENT-STATE-CHANGE id=-1 state=1 V/WifiMonitor( 2359): Event \[CTRL-EVENT-STATE-CHANGE id=-1 state=1\] V/WifiStateTracker( 2359): Changing supplicant state: INACTIVE ==> INACTIVE D/BluetoothService( 2359): Bluetooth state 10 -> 11 V/BluetoothEventRedirector( 2533): Received android.bluetooth.adapter.action.STATE\_CHANGED init: no such service 'hciattach' I/bluedroid( 2359): Starting hciattach daemon I/bluedroid( 2359): Starting bluetoothd deamon E/BluetoothEventLoop.cpp( 2359): event\_filter: Received signal org.freedesktop.DBus:NameAcquired from /org/freedesktop/DBus D/BluetoothService( 2359): found 1 bonded devices I/BluetoothDeviceProfileState( 2359): Entering ACL Connected state with: -1 D/BluetoothService( 2359): Bluetooth state 11 -> 12 V/BluetoothEventRedirector( 2533): Received android.bluetooth.adapter.action.STATE\_CHANGED D/BluetoothService( 2359): updateDeviceServiceChannelCache(E4:B0:21:58:18:53) I/bluetooth\_ScoSocket.cpp( 2439): Listening SCO socket... D/BluetoothService( 2359): uuid(system): 00001105-0000-1000-8000-00805f9b34fb 3 I/BtOppRfcommListener( 2571): Accept thread started on channel 12 D/BluetoothService( 2359): Registering hfag record 打开bluetooth,不打开wifi D/BluetoothService( 2359): Bluetooth state 10 -> 11 V/BluetoothEventRedirector( 2533): Received android.bluetooth.adapter.action.STATE\_CHANGED init: no such service 'hciattach' I/bluedroid( 2359): Starting hciattach daemon D/dalvikvm( 2571): GC\_EXPLICIT freed 194K, 49% free 2802K/5447K, external 716K/1038K, paused 104ms 打开bluetooth,然后打开wifi D/BluetoothService( 2359): Bluetooth state 10 -> 11 V/BluetoothEventRedirector( 2533): Received android.bluetooth.adapter.action.STATE\_CHANGED init: no such service 'hciattach' I/bluedroid( 2359): Starting hciattach daemon D/dalvikvm( 2571): GC\_EXPLICIT freed 120K, 49% free 2782K/5447K, external 716K/1038K, paused 89ms WLAN FW already running! Skip FW download WLAN FW is active I/bluedroid( 2359): Starting bluetoothd deamon W/Netd ( 2215): action=1, iface=mlan0 D/Tethering( 2359): mlan0 is not a tetherable iface, ignoring D/NetdConnector( 2359): RCV <- \{600 Iface added mlan0\} W/Netd ( 2215): action=5, iface=mlan0 D/Tethering( 2359): interfaceLinkStatusChanged mlan0, false D/NetdConnector( 2359): RCV <- \{600 Iface linkstate mlan0 down\} W/Netd ( 2215): action=1, iface=uap0 D/Tethering( 2359): uap0 is not a tetherable iface, ignoring W/Netd ( 2215): action=5, iface=uap0 D/Tethering( 2359): interfaceLinkStatusChanged uap0, false D/NetdConnector( 2359): RCV <- \{600 Iface added uap0\} D/NetdConnector( 2359): RCV <- \{600 Iface linkstate uap0 down\} I/BluetoothEventLoop.cpp( 2359): agent\_event\_filter: Received method org.bluez.Agent:Release D/BluetoothService( 2359): found 1 bonded devices D/BluetoothService( 2359): Bluetooth state 11 -> 12 V/BluetoothEventRedirector( 2533): Received android.bluetooth.adapter.action.STATE\_CHANGED I/bluetooth\_ScoSocket.cpp( 2439): Listening SCO socket... 分析: 定位关键代码 if (set\_bluetooth\_power(1) < 0) goto out; LOGI("Starting hciattach daemon"); if (property\_set("ctl.start", "hciattach") < 0) \{ LOGE("Failed to start hciattach"); goto out; \} // Try for 10 seconds, this can only succeed once hciattach has sent the // firmware and then turned on hci device via HCIUARTSETPROTO ioctl for (attempt = 1000; attempt > 0; attempt--) \{ hci\_sock = create\_hci\_sock(); if (hci\_sock < 0) goto out; if (!ioctl(hci\_sock, HCIDEVUP, HCI\_DEV\_ID)) \{ break; \} close(hci\_sock); usleep(10000); // 10 ms retry delay \} if (attempt == 0) \{ LOGE("%s: Timeout waiting for HCI device to come up", \_\_FUNCTION\_\_); goto out; \} LOGI("Starting bluetoothd deamon"); if (property\_set("ctl.start", "bluetoothd") < 0) \{ LOGE("Failed to start bluetoothd"); goto out; \} 在标红的代码两端添加打印,看是否是该段代码阻塞了蓝牙的打开。 I/bluedroid( 2385): Starting hciattach daemon I/bluedroid( 2385): <<James.C>> --- Turning on HCI device D/dalvikvm( 2583): GC\_EXPLICIT freed 170K, 49% free 2800K/5447K, external 716K/1038K, paused 89ms D/dalvikvm( 2385): GC\_EXPLICIT freed 434K, 38% free 4808K/7751K, external 1867K/3065 并没有LOGI("<<James.C>> --- End of Turning on HCI device: attemp = %d", attempt);的打印。 =》可能是卡死在for循环了。 =》可能是直接走out了。 需要进行确认。 在for循环中添加打印: LOGI("<<James.C>> --- Turning on HCI device"); for (attempt = 1000; attempt > 0; attempt--) \{ hci\_sock = create\_hci\_sock(); LOGI("<<James.C>> --- hci\_sock = %d, attempt = %d", hci\_sock, attempt); if (hci\_sock < 0) goto out; if (!ioctl(hci\_sock, HCIDEVUP, HCI\_DEV\_ID)) \{ break; \} close(hci\_sock); usleep(10000); // 10 ms retry delay \} LOGI("<<James.C>> --- End of Turning on HCI device: attemp = %d", attempt); if (attempt == 0) \{ LOGE("%s: Timeout waiting for HCI device to come up", \_\_FUNCTION\_\_); goto out; \} 一直在循环。 通过for循环前的注释,初步定位为hciattach服务的问题。Grep关键词,主要是在以下文件中: ./device/fsl/imx51\_3stack/mxc\_bt.sh:/system/bin/hciattach -n -s 921600 /dev/ttymxc1 bcsp 921600; ./device/fsl/imx51\_3stack/init.rc:service hciattach /system/bin/logwrapper /system/bin/sh /system/etc/bluez/mxc\_bt.sh 经确认,不是这个原因,因为fsl目录下的东西没有被执行。 HCI device无法通过ioctl打开 =》ioctl(hci\_sock, HCIDEVUP, HCI\_DEV\_ID)失败了 =》查看hci socket的ioctl static int hci\_sock\_ioctl(struct socket \*sock, unsigned int cmd, unsigned long arg) \{ case HCIDEVUP: if (!capable(CAP\_NET\_ADMIN)) return -EACCES; return hci\_dev\_open(arg); \} 其实就是权限检查\+设备打开。 增加打印 case HCIDEVUP: if (!capable(CAP\_NET\_ADMIN)) return -EACCES; printk("<<James.C>> --- hci\_dev\_open(arg) \\n"); ret = hci\_dev\_open(arg); printk("<<James.C>> --- ret = %d \\n", ret); return ret; 目标:通过打印看是权限不对还是打开hci设备出错。 <<James.C>> --- ret = -110 <<James.C>> --- hci\_dev\_open(arg) I/bluedroid( 2386): <<James.C>> --- hci\_sock = 164, attempt = 997 \#define ETIMEDOUT 110 /\* Connection timed out \*/ 于是问题就定位为HCI device做request时产生了timeout的错误。 int hci\_dev\_open(\_\_u16 dev) \{ ret = \_\_hci\_request(hdev, hci\_init\_req, 0, msecs\_to\_jiffies(HCI\_INIT\_TIMEOUT));//10s timeout \} 执行hci\_init\_req(hdev, 0)产生了超时 =》对hci device进行考察,找出超时原因。(android hci; Linux hci; hci device;) =》wifi开启时,哪些东西会影响hci device? 猜想:有可能是固件加载的问题。打开蓝牙时没有对固件进行加载。 已经排除此可能。 猜想:是不是nh387还没有上电? Nh387已经成功初始化。 猜想:HCI daemon没有启动,或者确实文件。 方法:了解HCI通信机制及其需要的文件。 在bt\_main.c中有如下函数: /\*\* \* [@brief][brief] This function send module cfg cmd to firmware \* \* Command format: \* +--------+--------+--------+--------+--------+--------+--------+ \* | OCF OGF | Length | Data | \* +--------+--------+--------+--------+--------+--------+--------+ \* | 2-byte | 1-byte | 4-byte | \* +--------+--------+--------+--------+--------+--------+--------+ \* \* @param priv A pointer to bt\_private structure \* @param subcmd sub command \* [@return][return] BT\_STATUS\_SUCCESS or BT\_STATUS\_FAILURE \*/ int bt\_send\_module\_cfg\_cmd(bt\_private \* priv, int subcmd) 它在执行如下语句时失败了 ret = bt\_send\_module\_cfg\_cmd(priv, MODULE\_BRINGUP\_REQ); if (ret < 0) \{ PRINTM(FATAL, "Module cfg command send failed!\\n"); goto err\_init\_fw; \} 这就很有可能是问题所在。提高PRINTM打印级别,看bt模块是否正确的初始化其firmware。 Firmware初始化正常了,但是bringup module这个request却执行失败。 bt\_send\_module\_cfg\_cmd(priv, MODULE\_BRINGUP\_REQ);这句话会如何执行? 用旧的驱动和firmware: 加载蓝牙驱动时,没有timeout的错误,也就是说module\_bringup\_req执行成功了。但是,依然是不能打开蓝牙,现象和新的蓝牙驱动一样。 另外,使用旧的wifi驱动,系统启动后,”setting” -> “open wifi”会导致down机。 还原SDIO驱动 ok。。。。。。。。我擦! 转载于:https://my.oschina.net/u/158589/blog/61168 [2019_Python_]: https://my.oschina.net/u/2663968/blog/3061697 [hot3.png]: /images/20220114/48b06a6cf77f4ae383c419b84cec9956.png [http_www.oschina.net_question_158589_55569]: http://www.oschina.net/question/158589_55569 [brief]: http://my.oschina.net/brief [return]: http://my.oschina.net/u/556800
相关 Android底层禁用WiFi和蓝牙功能 手机要root 并安装RE管理器 > 进入手机内存/system/bin/wpa\_supplicant(文件无后缀) > re管理器改成读写模式后, 修改wpa\_ 叁歲伎倆/ 2023年10月03日 17:53/ 0 赞/ 31 阅读
相关 蓝牙鼠标卡顿,蓝牙与wifi冲突解决方式 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE1 短命女/ 2023年01月01日 10:57/ 0 赞/ 542 阅读
相关 Android 蓝牙通信及WiFi开发 在我们正常的Android蓝牙功能开发步骤中,一般要经过系统权限和蓝牙开关状态监测、设备扫描、设备连接、蓝牙数据通信这几个过程。 在Android 4.3系统之后,我们可以 柔光的暖阳◎/ 2022年09月29日 14:51/ 0 赞/ 472 阅读
相关 android 蓝牙BLE扫描和wifi扫描总结 做室内定位的程序员应该都知道,在android 5.0之后,google推出了蓝牙扫描新接口,我们在实测中发现出一些问题,现在给大家列出,以供参考: 1.android 4. 秒速五厘米/ 2022年07月20日 15:19/ 0 赞/ 916 阅读
相关 Android手机蓝牙总结之传统蓝牙 出处:[Android手机蓝牙总结之传统蓝牙][Android] 最近,公司有一个项目时关于手机蓝牙和硬件蓝牙相互通信的需求。基于之前很久没有学习硬件的知识,这次记录下来,以 ゝ一纸荒年。/ 2022年05月18日 08:57/ 0 赞/ 719 阅读
相关 Win10系统联想笔记本wifi和蓝牙无法打开的解决方法 Win10系统联想笔记本wifi和蓝牙无法打开的解决方法 自己的win10系统联想笔记本电脑中的蓝牙和wifi突然出现了无法打开的情况。电脑任务栏的WLAN处显示红叉,可是打 淡淡的烟草味﹌/ 2022年03月16日 03:50/ 0 赞/ 786 阅读
相关 CarPlay wireless(蓝牙+WiFi)连接方案(蓝牙部分) 本文转自:[https://blog.csdn.net/huangke2012hk/article/details/51226220][https_blog.csdn.net_ 深碍√TFBOYSˉ_/ 2022年02月18日 23:43/ 0 赞/ 1218 阅读
相关 蓝牙和wifi的一个奇怪问题之解决 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] [http://www.oschina.net/ques 淩亂°似流年/ 2022年01月14日 13:53/ 0 赞/ 346 阅读
还没有评论,来说两句吧...