Bluetooth tethering不能用问题
来源:互联网 发布:消防车辆应知 编辑:程序博客网 时间:2024/05/11 14:06
在项目调试过程中,发现有些手机的Bluetooth tethering用不了,不管是用做客户端还是服务端都一样用不了。 locat抓到的log显示如下:
<span style="font-size:14px;"> I/PPPOEService( 887): NetdCallbackReceiver onEvent 600600 Iface added bt-panD/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 addressE/bt-btif ( 1776): can not bring up tap interface:bt-panW/Netd ( 217): No subsystem found in netlink eventD/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=0x11I/PPPOEService( 887): NetdCallbackReceiver onEvent 600600 Iface linkstate bt-pan downD/Tethering( 887): sendTetherStateChangedBroadcast 0, 0, 0D/Tethering( 887): InitialState.processMessage what=4I/PPPOEService( 887): NetdCallbackReceiver onEvent 600600 Iface removed bt-panD/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 char *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地址设置不对。
IP地址分为三类:广播,组播和单播。广播就是: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不能用问题
- Bluetooth tethering不能用问题
- goagent不能用的问题
- ios9 http不能用问题
- Tethering
- 解决不能用 ./运行的问题
- JS中addEventListener不能用的问题
- form中 button不能用的问题
- mysql不能用limit的问题
- win组合键不能用的问题
- tomcat5不能用ip访问的问题
- form 不能用submit 提交问题
- mac下make不能用的问题
- 解决输入法不能用的问题
- putty vim 小键盘不能用问题
- android模拟器方向键不能用有关问题
- 关于MVC不能用EasyUI的问题
- TextToSpeech语音解决中文不能用问题
- 第十七周项目1引用
- 2014-12-08工作总结
- qt creator调用vs编译的c的lib库
- 使用ReentrantLock
- Android 使用android-support-multidex解决Dex超出方法数的限制问题
- Bluetooth tethering不能用问题
- 一致性哈希算法 - Consistent Hashing
- 当你心情不好时,
- MAC mysql安装及设置
- 通过 Terracotta实现基于Tomcat的Web应用集群
- UITableView:改变 TableHeaderView 的高度
- Android studio项目不能编译,提示设备版本过低
- Objective-c中在ARC环境下使用PerformSelector方法回产生警告
- 关于对FLASH开发,starling、starling feathers、starling MVC框架的理解