Android 蓝牙AVRCP功能的实现.docx
Android蓝牙AVRCP功能的实现作者:ICaCro1.iuAVRCP的按便定义:sdkcmu1.atorkeymapsAVRCP.k1.key200MEDIAP1.AYPAUSEWAKEkey201MEDIAP1.AYPAUSEWAKEkey166VEDIA_SToPWAKEkey163MEDIA_NEXTWAKEkey165MEDIAPREVIOUSWKEkey168MEDIA_REWNDWAKEkey208MEDIA_FASFORWARDWAKEBCM(broadco<n)宏定义需要IB开:BOARDHAVEB1.UETOoTH_BCM:=trueBT音演控制的代码externa1.b1.ue1.oo1.hb1.uezaudiocontro1.C(1)按键的MAPstaticstructconstchar*name;uint8tavrep;uint16_tuinput;key_map="W,j"STOP","PAUSE","FORWARD","BACKWARD*,.REMIND",PIY-0P,STOPOP,PAUSEOP,KEY_P1.AYCD),KEYSTOpCD),KEY_PAUSECD),"FASTFORWARD”,NU1.1.):(2)按键处理FORWARDOP,BACKWARD()I>,REWINDOP,FASTFORWARDKEYM-XTSONG,keyirevIoussong,KEYRCTIND,OP1KEY_FASTrORWARD),staticvoidhand1.epane1.passthrough(structcontro1.*contro1.,or(i=0;keympi.n<11e!=NU1.1.;i+*)uint8tkeyquirks;if(operandsO'&0x7F)!-keyrmpi.avrcp)continue;1.)IXi(*VRCP:%s%s*,keywpi.name,status);keyquirks=contro1.->keyquirkskcy_mapi.avrcp;if(keyquirks&QUIRKNORE1.EASE)if(!pressed)DBG("AYRCP:Ignoringre1.ease*):break:)DBG(",AVRCP:treatingkeypressaspress÷re1.ease*);st?nd_key(contro1.->uinput,keymapfi'.uinput,1):sendkey(contro1.>uiput,keyapij.uinput,0);break;)sendkey(conIro1.>uiput,keymaj,i.uinput,pressed);break:)HC1.iMJMP数据分析以Sony耳机DRC-BT15为例Sadbshe1.14hcidunp-X左犍:>AC1.data:hand1.e12f1.ags0x02dien121.2CAP(d):ci<0x0042Ien8psn00000:3011Oe00487c4c000.H1.<HCICoounand:ExitSniffMode(0x02OxOOO1.)P1.en2OOOO:Oc00<AC1.*data:hand1.e12f1.agsOxOOdien12OOOO:08004b003211Oe09487c4c00.K.2.H1.>IIC1.Event:MaxS1.otsChange(Ox1.b)p1.en3050000:Oc00>HCIEvent:ModeChange(0x14)p1.en0000:006Oc00000000>HCIEvent:CommandStatus(OxOf)408>AC1.data:hand1.e12f1.ags0x02dien121.2CAP(d):ci<1.0x0042Ien8psm0Oe00487ccc0000:401100<AC1.>HCI00data:hand1.e12f1.ags0x00dien120000:08004b004211Oc09487ccc00Event:NumberofComp1.etedPackets(0x13)0000:01Ip1.en5Oc.I1.?00.K.B.H?02播放/哲停:>AC1.data:hand1.e12f1.ags0x02dien121.2CP(d):ci<OxOO42Ien8psm00000:50I1.OO<AC1.data:hand1.e12f1.agsOxOOdien12OOOO:08OO4bOO5211Oe09487c4bOO>C1.data:hand1.e12f1.ags0x02dien121.2CAP(d):ci<J0x0042Ien8psm00000:6011OO<C1.data:hand1.e12f1.agsOxOOdien120000:08OO4bOO6211Oe09487ccbOO>HC1.Event:NumberofComp1.etedPackets(0x13)0000:0100OeOcIp1.en5Oc00P.00HK.H?4848007c4b.K.R.HK.7ccb.K.b.Hi?02右键:>AC1.00<AC1.>AC1.00<AC1.>HCI00>HCIdata:hand1.e12f1.ags0x02dien121.2CAP(d):cid0x0012Ien8psm00000:70Hdata:hand1.e12f1.ags0x00dien120000:0800Ib007211Oe09487c4600data:hand1.e12f1.ags0x02dien121.2CAP(d):cidOxOO42Ien8psm00000:8011data:hand1.e12f1.ags0x00dien120000:08004b0082IIOe09487cc6OOEvent:NunberofComp1.etedPackets(0x13)0000:01Event:MaxS1.otsChange(Ox1.b)p1.en3OeOeIp1.en5Oc00p00*HF.H?4848007c46.K.r.HF.7cc6.KH?02O1.>HCIEvent:ModeChange(0x14)p1.en60000:00Oc0002c800.?然后将ntro1.c的日志打印出来:按一次"“播放/暂停键":D/ACRVP(237):hand1e_pane1_passthroughD/ACRVP(237):operands0=46对庖PAUSEj)PD/ACRVP(237):koy_quirks=0,pressed=1底键按下D/ACRVP(237):contro1.->uinput=fffffffe,sendkey=201对应MED1.AP1.AY_PAUSED/ACRVP(237):hand1e_pane1_passthroughD/ACRVP(237):operands0=c6(=0x460x80表示按键择放了)D/ACRVP(237):key_quirks=0,pressed=0按键释放D/ACRVP(237):contro1.->uinput=ffffffe,sendkey=201对应MEDIAP1.YPAUSE再按次”播放/否停犍":D/ACRVP(237):hand1.epane1.passthroughD/ACRVP(237):operands0=44对应P1.AY_OPD/ACRVP(237):key_quirks=0,pressed=1按键按下D/ACRVP(237):contro1.->uinput=fffffffe,send_key=200对应MEDIA_P1.APAUSED/ACRVP(237):hand1.epane1.passthroughD/ACRVP(237):operands0=c4D/ACRVP(237):key_quirks=0,pressed=0按键释放D/ACRVP(237):contro1.->uinput=fffffffe,sendkey=200对应MED1.A_P1.AY_PAUSEnextkey:D/ACRVP(237):hand1e_pane1_passthroughD/ACRVP(237):operandsf=4b对应F0R*ARD_()PD/ACRVP(237):keyquirks=0,pressed=1D/ACRVP(237);contro1.->uinput=fffffffe,send_key=163对应MED1.A_NEXTD/ACRVP(237):hand1e_pane1_passthroughD/ACRVP(237):operands0=cbD/ACRVP(237):keyquirks=0,pressed=0D/ACRVP(237);contro1.->uinput=fffffffe,send_key=163prevkey:D/ACRVP(237):-hand1.epane1.passthroughD/ACRVP(237):operands0=4c对应BACKWARDJ)PD/ACRVP(237):key_quirks=0,pressed=1D/ACRVP(237):contro1.->uinput=fffffff。,send_key=165对应D/ACRVP(237):hand1.epane1.passthroughDCRVP(237):operands=ccD/ACRVP(237);key_quirks=0,pressed=0D/ACRVP(237):contro1.->uinput=fffffffe,send_key=165NED1.A.PREVIOUS从上面可以看到b1.uetooth的协议栈b1.ueZ是没有问题的将frae>orksbase1.ibsuiEventHub.cpp的1.oGiB开,只能看到了8ntro1.c的日志,EventHub的getEvent完全不响应观察所有1.og日志发现,openDevice里也没有装载AVRCI>.k1.