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就被认为是有效的
 验证了下 本地管理的单播地址对于蓝牙共享功能也是可以的。

 

0 0
原创粉丝点击