在项目调试过程中,发现有些手机的Bluetooth tethering用不了,不管是用做客户端还是服务端都一样用不了。 locat抓到的log显示如下:

[plain] view plaincopy
  1. <span style="font-size:14px;"> I/PPPOEService(  887): NetdCallbackReceiver onEvent 600600 Iface added bt-pan
  2. D/BT_DUN  ( 2007): Ignoring event PLATFORM_EVENT_RMNET_UP in EMB_DATA_CALL_CONNECTED
  3. D/BT_DUN  ( 2007): Moved to state(EMB_DATA_CALL_CONNECTED)
  4. E/bt-btif ( 1776): Could not set bt address for interface:bt-pan, errno:Cannot assign requested address
  5. E/bt-btif ( 1776): can not bring up tap interface:bt-pan
  6. W/Netd    (  217): No subsystem found in netlink event
  7. D/BT_DUN  ( 2007): Ignoring event PLATFORM_EVENT_RMNET_UP in EMB_DATA_CALL_CONNECTED
  8. D/BT_DUN  ( 2007): Moved to state(EMB_DATA_CALL_CONNECTED)
  9. D/NetlinkEvent(  217): Unexpected netlink message. type=0x11
  10. I/PPPOEService(  887): NetdCallbackReceiver onEvent 600600 Iface linkstate bt-pan down
  11. D/Tethering(  887): sendTetherStateChangedBroadcast 0, 0, 0
  12. D/Tethering(  887): InitialState.processMessage what=4
  13. I/PPPOEService(  887): NetdCallbackReceiver onEvent 600600 Iface removed bt-pan
  14. D/Tethering(  887): sendTetherStateChangedBroadcast 0, 0, 0</span>

从log可以看出,问题主要出在
E/bt-btif ( 1776): Could not set bt address for interface:bt-pan, errno:Cannot assign requested address
E/bt-btif ( 1776): can not bring up tap interface:bt-pan
在出现这个错误的时候代码是走到了btif_pan.c里面的tap_if_up()函数

[objc] view plaincopy
  1. <span style="font-size:14px;">static int tap_if_up(const charchar *devname, BD_ADDR addr)
  2. {
  3. struct ifreq ifr;
  4. int sk, err;
  5. sk = socket(AF_INET, SOCK_DGRAM, 0);
  6. //set mac addr
  7. memset(&ifr, 0, sizeof(ifr));
  8. strncpy(ifr.ifr_name, devname, IFNAMSIZ - 1);
  9. err = ioctl(sk, SIOCGIFHWADDR, &ifr);
  10. if(err < 0)
  11. {
  12. BTIF_TRACE_ERROR2("Could not get network hardware for interface:%s, errno:%s", devname, strerror(errno));
  13. close(sk);
  14. return -1;
  15. }
  16. /* debug("found mac address for interface:%s = %02x:%02x:%02x:%02x:%02x:%02x", devname, */
  17. /*         ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2], */
  18. /*         ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]); */
  19. strncpy(ifr.ifr_name, devname, IFNAMSIZ - 1);
  20. memcpy(ifr.ifr_hwaddr.sa_data, addr, 6);
  21. BTIF_TRACE_ERROR6("setting bt address for interface: %02x:%02x:%02x:%02x:%02x:%02x",
  22. ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2],
  23. ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]);
  24. err = ioctl(sk, SIOCSIFHWADDR, (caddr_t)&ifr);
  25. if (err < 0) {
  26. BTIF_TRACE_ERROR2("Could not set bt address for interface:%s, errno:%s", devname, strerror(errno));
  27. close(sk);
  28. return -1;
  29. }
  30. //bring it up
  31. memset(&ifr, 0, sizeof(ifr));
  32. strncpy(ifr.ifr_name, devname, IF_NAMESIZE - 1);
  33. ifr.ifr_flags |= IFF_UP;
  34. ifr.ifr_flags |= IFF_MULTICAST;
  35. err = ioctl(sk, SIOCSIFFLAGS, (caddr_t) &ifr);
  36. if (err < 0) {
  37. BTIF_TRACE_ERROR2("Could not bring up network interface:%s, errno:%d", devname, errno);
  38. close(sk);
  39. return -1;
  40. }
  41. close(sk);
  42. BTIF_TRACE_DEBUG1("network interface: %s is up", devname);
  43. return 0;
  44. }</span>

函数执行到 err = ioctl(sk, SIOCSIFHWADDR, (caddr_t)&ifr);返回错误值,查看蓝牙地址是正常的地址,也没有跟与之配对的机器地址一样。ioctl函数返回EADDRNOTAVAIL错误以至于bt-pan没有起来。
#define EADDRNOTAVAIL 49 /* Cannot assign requested address */
  SIOCSIFHWADDR: Cannot assign requested address。原来是蓝牙MAC地址设置不对。
MAC地址分为三类:广播,组播和单播。广播就是:FF:FF:FF:FF:FF:FF。组播:第一字节最后一位是1,如47:72:65:65:6e:00,47的最后一位是1。单播:第一字节最后一位是0,如48:72:65:65:6e:00。
tethering不行的手机的蓝牙地址是
E/bt-btif ( 1735): setting bt address for interface: 97:87:87:54:54:67
97的最后一位是1,地址变成了组播地址,所以分配地址失败。把上面的地址改为98或者96就不会出现这个问题了。蓝牙共享问题也就可以用了。

注:
关于mac地址的问题:

IEEE 802定义MAC地址为

|<--------- 24 bit --------->|<--------- 24 bit -------->|
 | ccccccug cccccccc cccccccc | xxxxxxxx xxxxxxx xxxxxxxx |

由ug控制mac地址类型:

u: 0:由 IEEE 指定ID统一管理
    1:本地管理
g: 0:单播
    1:多播
 也就是12位MAC地址分为四类,由其中第二位决定
 第二位为
 0 | 4 | 8 | C :(00)统一管理的单播 MAC
  1 | 5 | 9 | D :(01)统一管理的多播 MAC
  2 | 6 | A | E :(10)本地管理的单播 MAC
  3 | 7 | B | F: (11)本地管理的多播 MAC

=================================================================
由于针对ADSL路由等这样的网络终端,一般使用的都是 统一管理的单播MAC
所以会判断 02:10:18:01:00:01 或者(11:01:18:00:00:30)为无效MAC,导致无线等功能失效,或者网络连接失败等现象。
 而对于 00:25:5E:08:DE:43 这样的MAC就被认为是有效的
 验证了下 本地管理的单播地址对于蓝牙共享功能也是可以的。

Bluetooth tethering不能用问题相关推荐

  1. What is tethering and how do you enable tethering?

    https://3g.co.uk/guides/tethering-everything-you-need-to-know What is tethering and how do you enabl ...

  2. android wifi设备连接通信,通过wifi与设备进行通信(Android)

    通过wifi与设备进行通信(Android) [复制链接] 本帖最后由 灞波儿奔 于 2019-2-17 21:40 编辑 通过wifi与设备进行通信(Android) 最近leader决定把app与 ...

  3. Android11 热点开启流程

    Android11 热点开启流程 文章目录 Android11 热点开启流程 一.应用中热点开启和关闭的代码: 二.系统源码追踪 1.ConnectivityManager.startTetherin ...

  4. android 13 热点启动流程

    近期在看一个热点启动的问题.发现网上基本上都算android 9 的wifi热点启动流程.自己去看android 13 的源码的时候发现与之前相比已经有一些小改动了. 在此总结一下wifie热点的启动 ...

  5. 转载的--------待整理

    Launcher 总结:1.launcher的布局太居中,要想两边拉伸<\packages\apps\Launcher2\res\values\dimens.xml><dimen n ...

  6. Android系统小知识

    Launcher 总结: 1.launcher的布局太居中,要想两边拉伸 <\packages\apps\Launcher2\res\values\dimens.xml>     < ...

  7. 安卓系统定制常见问题解决

    1.launcher的布局太居中,要想两边拉伸 <\packages\apps\Launcher2\res\values\dimens.xml> <dimen name=" ...

  8. wi-fi_免费Wi-Fi计分方法

    wi-fi Readily available internet access is the lifeblood for laptops, netbooks, tablets, and other p ...

  9. android WiFi扫描并连接

    wifi扫描并显示 获取列表 获取Wifi列表并不难,网上有一个WifiAdmin的工具类,一找一大堆.但是这个工具类其中还是有很多问题的,并不建议直接使用.在使用过程中还是踩到了其中的一些坑,然后修 ...

最新文章

  1. Matlab数据的可视化 -- 三维特殊图形
  2. 爆气球这道题目,展开了新的思路
  3. matlab 用fplot和plot作出函数图像
  4. js源生惯性滚动与回弹(备用)
  5. 谈API网关的背景、架构以及落地方案--转
  6. php 静态扩展,thinkphp5行为扩展实现html静态缓存设置
  7. SQL数据库权限授予grant
  8. h5比html新增加的标签,HTML5(H5)新增属性和标签
  9. python按身高体重排队_LeetCode-python 406.根据身高重建队列
  10. koa2 mysql 中间件_Koa2 和 Express 中间件对比
  11. solaris php,针对 Solaris 的安装提示
  12. 对称加密和非对称加密大概介绍和区别
  13. Eclipse下的java工程目录问题和路径问题理解
  14. 几个常见翻译引擎的不完全对比
  15. 评分模型和额度模型的两种不同应用场景
  16. python分词词典_基于python的分词算法的实现(3) – 建立字典 | 学步园
  17. 关于《精武门》的回忆
  18. 【bb平台刷课记】wireshark结合实例学抓包
  19. 奥鹏教育的计算机作业,东师计算机应用基础20秋在线作业2【标准答案】
  20. 理解FFT, STFT, 加窗的含义

热门文章

  1. 解决安装ubuntu时,出现安装程序向硬盘复制文件时遇到的错误
  2. 广播(BroadcastReceiver)---安卓中的四大天王之一
  3. 普通链接与迅雷、旋风、快车链接相互转化的步骤
  4. watershed 算法原理以及skimage/opencv中的使用
  5. 模态框间相互传输数据
  6. HBase原理 -Regin切分
  7. 虚拟存储器:页面置换算法
  8. 将Gif图转换成Unity Texture2D
  9. 现代流行的平面设计风格有哪些?——黎乙丙
  10. 嵌入式分享合集112