Bluetooth tethering不能用问题
在项目调试过程中,发现有些手机的Bluetooth tethering用不了,不管是用做客户端还是服务端都一样用不了。 locat抓到的log显示如下:
- <span style="font-size:14px;"> I/PPPOEService( 887): NetdCallbackReceiver onEvent 600600 Iface added bt-pan
- D/BT_DUN ( 2007): Ignoring event PLATFORM_EVENT_RMNET_UP in EMB_DATA_CALL_CONNECTED
- D/BT_DUN ( 2007): Moved to state(EMB_DATA_CALL_CONNECTED)
- 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
- W/Netd ( 217): No subsystem found in netlink event
- D/BT_DUN ( 2007): Ignoring event PLATFORM_EVENT_RMNET_UP in EMB_DATA_CALL_CONNECTED
- D/BT_DUN ( 2007): Moved to state(EMB_DATA_CALL_CONNECTED)
- D/NetlinkEvent( 217): Unexpected netlink message. type=0x11
- I/PPPOEService( 887): NetdCallbackReceiver onEvent 600600 Iface linkstate bt-pan down
- D/Tethering( 887): sendTetherStateChangedBroadcast 0, 0, 0
- D/Tethering( 887): InitialState.processMessage what=4
- I/PPPOEService( 887): NetdCallbackReceiver onEvent 600600 Iface removed bt-pan
- 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()函数
- <span style="font-size:14px;">static int tap_if_up(const charchar *devname, BD_ADDR addr)
- {
- struct ifreq ifr;
- int sk, err;
- sk = socket(AF_INET, SOCK_DGRAM, 0);
- //set mac addr
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, devname, IFNAMSIZ - 1);
- err = ioctl(sk, SIOCGIFHWADDR, &ifr);
- if(err < 0)
- {
- BTIF_TRACE_ERROR2("Could not get network hardware for interface:%s, errno:%s", devname, strerror(errno));
- close(sk);
- return -1;
- }
- /* debug("found mac address for interface:%s = %02x:%02x:%02x:%02x:%02x:%02x", devname, */
- /* ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2], */
- /* ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]); */
- strncpy(ifr.ifr_name, devname, IFNAMSIZ - 1);
- memcpy(ifr.ifr_hwaddr.sa_data, addr, 6);
- BTIF_TRACE_ERROR6("setting bt address for interface: %02x:%02x:%02x:%02x:%02x:%02x",
- ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2],
- ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]);
- err = ioctl(sk, SIOCSIFHWADDR, (caddr_t)&ifr);
- if (err < 0) {
- BTIF_TRACE_ERROR2("Could not set bt address for interface:%s, errno:%s", devname, strerror(errno));
- close(sk);
- return -1;
- }
- //bring it up
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, devname, IF_NAMESIZE - 1);
- ifr.ifr_flags |= IFF_UP;
- ifr.ifr_flags |= IFF_MULTICAST;
- err = ioctl(sk, SIOCSIFFLAGS, (caddr_t) &ifr);
- if (err < 0) {
- BTIF_TRACE_ERROR2("Could not bring up network interface:%s, errno:%d", devname, errno);
- close(sk);
- return -1;
- }
- close(sk);
- BTIF_TRACE_DEBUG1("network interface: %s is up", devname);
- return 0;
- }</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不能用问题相关推荐
- 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 ...
- android wifi设备连接通信,通过wifi与设备进行通信(Android)
通过wifi与设备进行通信(Android) [复制链接] 本帖最后由 灞波儿奔 于 2019-2-17 21:40 编辑 通过wifi与设备进行通信(Android) 最近leader决定把app与 ...
- Android11 热点开启流程
Android11 热点开启流程 文章目录 Android11 热点开启流程 一.应用中热点开启和关闭的代码: 二.系统源码追踪 1.ConnectivityManager.startTetherin ...
- android 13 热点启动流程
近期在看一个热点启动的问题.发现网上基本上都算android 9 的wifi热点启动流程.自己去看android 13 的源码的时候发现与之前相比已经有一些小改动了. 在此总结一下wifie热点的启动 ...
- 转载的--------待整理
Launcher 总结:1.launcher的布局太居中,要想两边拉伸<\packages\apps\Launcher2\res\values\dimens.xml><dimen n ...
- Android系统小知识
Launcher 总结: 1.launcher的布局太居中,要想两边拉伸 <\packages\apps\Launcher2\res\values\dimens.xml> < ...
- 安卓系统定制常见问题解决
1.launcher的布局太居中,要想两边拉伸 <\packages\apps\Launcher2\res\values\dimens.xml> <dimen name=" ...
- wi-fi_免费Wi-Fi计分方法
wi-fi Readily available internet access is the lifeblood for laptops, netbooks, tablets, and other p ...
- android WiFi扫描并连接
wifi扫描并显示 获取列表 获取Wifi列表并不难,网上有一个WifiAdmin的工具类,一找一大堆.但是这个工具类其中还是有很多问题的,并不建议直接使用.在使用过程中还是踩到了其中的一些坑,然后修 ...
最新文章
- Matlab数据的可视化 -- 三维特殊图形
- 爆气球这道题目,展开了新的思路
- matlab 用fplot和plot作出函数图像
- js源生惯性滚动与回弹(备用)
- 谈API网关的背景、架构以及落地方案--转
- php 静态扩展,thinkphp5行为扩展实现html静态缓存设置
- SQL数据库权限授予grant
- h5比html新增加的标签,HTML5(H5)新增属性和标签
- python按身高体重排队_LeetCode-python 406.根据身高重建队列
- koa2 mysql 中间件_Koa2 和 Express 中间件对比
- solaris php,针对 Solaris 的安装提示
- 对称加密和非对称加密大概介绍和区别
- Eclipse下的java工程目录问题和路径问题理解
- 几个常见翻译引擎的不完全对比
- 评分模型和额度模型的两种不同应用场景
- python分词词典_基于python的分词算法的实现(3) – 建立字典 | 学步园
- 关于《精武门》的回忆
- 【bb平台刷课记】wireshark结合实例学抓包
- 奥鹏教育的计算机作业,东师计算机应用基础20秋在线作业2【标准答案】
- 理解FFT, STFT, 加窗的含义