Bluetooth tetheringでは使用できない問題

4623 ワード

プロジェクトのデバッグの過程で、一部の携帯電話のBluetooth tetheringは使えないことに気づき、クライアントとしてもサービス側としても使えないことに気づいた.locatが捕まえたlogは以下のように表示されます.
 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

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()関数
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;
}

 
関数はerr=ioctl(sk,SIOCSIFHWADDR,(caddr_t)&ifr)に実行されます.エラー値を返し、Bluetoothアドレスが正常なアドレスであることを確認します.ペアのマシンアドレスと同じではありません.ioctl関数は、bt-panが起きないほどEADDRNOTABLALエラーを返します.define EADDRNOTAVAIL 49 /* Cannot assign requested address */  SIOCSIFHWADDR: Cannot assign requested address.Bluetooth MACアドレスの設定が間違っていました.IPアドレスは3種類に分けられる:ブロードキャスト、マルチキャスト、ユニキャスト.放送は、FF:FF:FF:FF:FF.マルチキャスト:最初のバイトの最後のビットは1で、例えば47:72:65:65:6 e:00、47の最後のビットは1です.ユニキャスト:48:72:65:65:65:6 e:00など、1バイト目の最後のビットは0です.tetheringができない携帯電話のBluetoothアドレスはE/bt-btif(1735):setting bt address for interface:97:87:54:54:67 97の最下位が1で、アドレスがマルチキャストアドレスになったため、割り当てアドレスが失敗した.上記の住所を98または96に変更すると、この問題は発生しません.Bluetooth共有の問題も使えます.
注意:macアドレスに関する質問:
IEEE 802は、MACアドレスが
|||  | ccccccug cccccccc cccccccc | xxxxxxxx xxxxxxx xxxxxxxx |
ugによってmacアドレスタイプを制御する:
u:0:IEEE指定IDによる統一管理1:ローカル管理g:0:ユニキャスト1:マルチキャストつまり12ビットMACアドレスは4種類に分けられ、そのうち2位によって2位が0|4|8|C:(00)統一管理のユニキャストMAC 1|5|9|D:(01)統一管理のマルチキャストMAC 2|6|A|E:(10)ローカル管理のユニキャストMAC 3|7|B|F:(11)ローカル管理のマルチキャストMAC
==================================================================================================================================================一方、00:25:5 E:08:DE:43のようなMACは、ローカル管理のユニキャストアドレスがBluetooth共有機能に対して有効であることを検証していると考えられている.