RW_BLE_CORE¼Ç¼
´«ÊäÐŵÀ
BLEµÄ´«ÊäÐŵÀÔÚ2.4GƵ¶ÎÓÐ40¸öchannel¡£°üÀ¨2ÖÖÎïÀíÐŵÀ£º¹ã²¥ÐŵÀºÍÊý¾ÝÐŵÀ¡£Êý¾ÝÖ¡ÖÐÉèÖÃAccess AddressÓÃÓÚ±êʶ¸ÃÐŵÀ£¬·ÀÖ¹ÐŵÀÅöײ¡£Channel MAPÈçÏ£º
Êý¾Ý֡ͨÐÅ
À¶ÑÀÖ¡½á¹¹ÈçÏ£º
Preamble£º¸ù¾ÝAccess Address¶ø¶¨£¬¼ÙÈçAAµÄLSB£¨×îÓÒbit£©bitΪ1£¬Ôòǰµ¼±ãÊÇ10101010b£¬·´Ö®ÔòΪ01010101b¡£
Access Address£º¹ã²¥Ö¡µÄAAΪ£º0x8E89BED6¡£ÆäËûÇé¿ö¿ÉÒÔÊÇÒ»¸ö32bitµÄËæ»úÊý¡£AAÐèÂú×ãÒÔÏÂÌõ¼þ
¡¤²»³¬¹ýÁ¬Ðø6¸ö1»òÕß0¡£
¡¤Óë¹ã²¥Ö¡µÄAA²»Í¬bit³¬¹ý1¸ö¡£ ¡¤²»ÄÜ4byteÏàͬ¡£
¡¤0 1Ìø±ä²»Äܳ¬¹ý24´Î
¡¤MSB 6bit 0 1Ìø±ä³¬¹ý2´Î¡£ ÒÔÏÂÖð¸ö½éÉÜPDU¡£
Ò»¡¢Advertising Channel PDU
À¶ÑÀ¹ã²¥Ö¡Ö¡½á¹¹
ÆäÖÐHeaderµÄÖ¡¸ñʽÈçÏ£º
ÆäÖУ¬
a¡¢¹ã²¥Ö¡ÀàÐÍ£¨PDU Type£©·ÖΪÒÔϼ¸Àࣺ
? ADV_IND: connectable undirected advertising event
? ADV_DIRECT_IND: connectable directed advertising event ? ADV_NONCONN_IND: non-connectable undirected advertising event
? ADV_SCAN_IND: scannable undirected advertising event
b¡¢Length£º3~37bytes ¹ã²¥Ö¡·ÖΪºÜ¶àÖÖ£¬ÆäÇø±ð¾ÍÊÇpayloadËù´ú±íµÄÒâÒ岻ͬ£¬ÒÔÏ·ֱð¶Ô¼¸Öֹ㲥֡×÷·Ö±ð²ûÊÍ£º 1¡¢ADV_IND
ADV_INDµÄpayload¸ñʽÈçÏ£º
Ôڹ㲥֡֡ͷÖеÄTxAddλÊǹ㲥µØÖ·µÄ±êʾλ£º TxAdd==0£ºAdvAµØÖ·Îª¹«ÓõØÖ·£» TxAdd==1£ºAdvAµØÖ·ÎªËæ»úµØÖ·¡£ AdvDataÔòÊǹ㲥HOSTµÄ¹ã²¥Êý¾Ý¡£
2¡¢ADV_DIRECT_IND
ÕâÖÖÖ¡ÓÃÓÚÖ±½Ó½ÓÈëµÄ¹ã²¥Ê¼þ¡£
ADV_DIRECT_INDµÄpayloadÖ¡¸ñʽÈçÏ£º
ÆäÖÐAdvAµÄÒâÒåÓëADV_INDÏàͬ¡£ InitAΪ¹ã²¥·¢ÆðÕßµØÖ·£º
RxAdd==0£º·¢ÆðÕßµØÖ·Êǹ«ÓõØÖ·£» RxAdd==1£º·¢ÆðÕßµØÖ·ÊÇËæ»úµØÖ·¡£ ×¢Ò⣺¸ÃÖ¡²»°üº¬ÈκÎHOSTÊý¾Ý¡£
3¡¢ADV_NONCONN_IND
ÓÃÓÚ²»¿É½ÓÈë²»Ö±´ï£¨non-connectable undirected£©µÄÍøÂç¡£ÆäpayloadÒâÒåÓëADV_INDÀàËÆ¡£
4¡¢ADV_SCAN_IND
ÓÃÓÚ¿ÉɨÃè²»Ö±´ïÍøÂç¡£PayloadÒâÒåÓëADV_INDÀàËÆ¡£
¶þ¡¢Scaning PDUs
1£© SCAN_REQ£º
ÕâÊÇɨÃèÇëÇóÖ¡£¬´¦Óڹ㲥״̬µÄ½ÓÊÕÉ豸½ÓÊÕÕâÖÖÖ¡¡£
´Ë´¦£¬
ScanAΪɨÃèÕߵĵØÖ·£¬ÆäµØÖ·ÓÉTxAdd¿ØÖÆÊǹ«¹²µØÖ·»¹ÊÇËæ»úµØÖ·¡£ AdvAΪ¸ÃɨÃèÖ¡µÄÄ¿µÄµØÖ·¡£ÓÉRxAdd¿ØÖÆÒâÒå¡£ 2£© SCAN_RSP
ɨÃèÈ·ÈÏ¡£´¦Óڹ㲥״̬µÄÉ豸ÔÚÊÕµ½É¨ÃèÇëÇóºó£¬ÐèÒª»Ø¸´É¨ÃèÈ·ÈÏÖ¡¡£AdvAµØÖ·ÒâÒåÓÉTxAddÈ·¶¨¡£ScanRspDataΪ¹ã²¥¶ËµÄ¸½´øÊý¾Ý¡£
Èý¡¢Initiating PDU
¸Ã²¿·ÖΪÁ¬½Ó·¢ÆðÐÒé¡£·¢ÆðµÄÖ¡¸ñʽ½öÒ»ÖÖ£ºCONNECT_REQ¡£ÓÉ·¢Æð·½·¢Ë͸ÃÖ¡£¬¹ã²¥·½½ÓÊÕ¸ÃÖ¡¡£
1£© CONNECT_REQ
CONNECT_REQÖ¡¸ñʽÈçÏ£º
TxAddÈ·ÈÏInitAµØÖ·Îª¹«¹²µØÖ·»¹ÊÇËæ»úµØÖ·£» RxAddÈ·ÈÏAdvAµØÖ·Îª¹«¹²µØÖ·»¹ÊÇËæ»úµØÖ·¡£ LLDataµÄÊý¾Ý¸ñʽÈçÏ£º
AA£ºAccessAddress
CRCInit£ºCRCУÑéµÄ³õʼֵ£¬ËüÓ¦¸ÃÊÇLinkLayer²úÉúµÄÒ»¸öËæ»úÖµ¡£
WinSize£º·¢ËÍ´°³¤¶È²ÎÊý¡£transmitWindowSize=WinSize*1.25ms¡£
WinOffset£º·¢ËÍ´°ÆðÊ¼Æ«ÒÆÁ¿¡£TransmitWindowOffset=WinOffset*1.25ms¡£ ÉÏÊöÁ½¸öwindowÒâÒåÈçÏ£º
Interval£ºÈ·¶¨connect intervalµÄʱ¼ä³¤¶È¡£connInterval = Interval * 1.25 ms¡£ Latency£ºconnSlaveLatency =Latency¡£
TimeOut£ºconnSupervisionTimeout= Timeout * 10 ms£¨100ms~32sÖ®¼ä£©£¬µ±Á½Ö¡Êý¾ÝÖ®¼äµÄʱ¼ä¼ä¸ô³¬¹ý6*connInterval»òÕßconnSupervisionTimeoutʱ£¬ÔòÈÏΪÁ¬½Ó¶ªÊ§¡£
ChM£º¼´ChannelMAP£¬Ò»¹²0~36¸öÐŵÀ¡£LSB´ú±íchannel0£¬ÄÄÒ»¸öÊÇ1£¬ÔòÄÄÒ»¸öÐŵÀÓÐЧ¡£Channel 37~39±£Áô¡£
Hop£º5~16Ö®¼äµÄËæ»úÖµ£¬ÓÃÓÚÉèÖÃHopIncrement¡£ÓÃÓÚ¼ÆË㲻ʹÓõÄÐŵÀ±àºÅ¡£
unmappedChannel= (lastUnmappedChannel+ hopIncrement) mod 37
Èç¹û¼ÆËã½á¹ûÊÇÊôÓÚ±£ÁôÐŵÀ£¬Ôòͨ¹ýÏÂʽ¼ÆË㣺
remappingIndex= unmappedChannelmod numUsedChannels
SCA£ºÉèÖÃMaster˯ÃßʱÖÓ¾«È·¶ÈµÄ×î´óÖµ¡£¶ÔÓ¦±íÈçÏ£º
ËÄ¡¢Data Channel PDU
Êý¾ÝÐŵÀµÄÖ¡¸ñʽÈçÏ£º
ÆäÖаüÀ¨16bit Header£¬³¤¶È¿É±äµÄPayload£¬ºÍÒ»¸öÐźÅÍêÕûÐÔÈ·ÈÏ×ֶΣ¨MIC£©¡£ 1¡¢¹ØÓÚHeaderºÍMIC
HeaderµÄÊý¾Ý¸ñʽÈçÏ£º
ÿ¸ö×ֶεÄÒâÒåÈçÏ£º
MIC×Ö¶ÎʹÓõÄʱºò£¬ÓÐÁ½¸öÌõ¼þ£º1¡¢²»ÄÜʹÓÃÓڷǼÓÃܵÄÊý¾ÝÖ¡£»2¡¢Êý¾ÝÖ¡payload³¤¶È²»ÄÜΪ0¡£×Ö³¤Îª4byte¡£ 2¡¢¹ØÓÚPayload
Payload·ÖΪÁ½À࣬LL Data PDUºÍLL Control PDU£¨LLID==11b£©¡£LL Data PDUÀïÃæÓÖ·ÖΪÁ½À࣬һÀàÊÇÍêÕûÊý¾ÝÖ¡»òÖ¡Ë鯬Æðʼ֡£¨LLID==10b£©£¬ÁíÒ»ÀàÊÇÖ¡Ë鯬£¨LLID==01b£©¡£ÆäÖУ¬Ö¡Ë鯬֡µÄÖ¡³¤¶È¿ÉÒÔΪ0£¬¶øÍêÕû£¨Æðʼ£©Ö¡µÄ³¤¶È²»¿ÉÒÔΪ0¡£
ÏÂÃæ¾ßÌå½éÉÜLL Control PDU£º LL Control PDUµÄÖ¡¸ñʽÈçÏ£º
ÆäÖ¡³¤¶È²»ÄÜΪ0£¬ÆäÖаüº¬Á½¸ö×ֶΣºOpcodeºÍCtrData¡£
OpcodeÓÃÓÚÈ·¶¨¿ØÖÆÖ¡ÀàÐÍ£º
¼ÙÈçÊÕµ½µÄLLC PDU¸ñʽ²»Ö§³Ö»òÕßÊÇÎÞÓÃÖ¡£¬Ôò»Ø¸´LL_UNKNOWN_RSP PDU£¬´ËʱµÄType×Ö¶ÎÐèÉèÖóÉÊÕµ½µÄÎÞÓõÄopcode¡£ LL_CONNECTION_UPDATA_REQ£º ¸ÃÖ¡µÄÖ¡¸ñʽÈçÏ£º
ÕâЩÐÅÏ¢µÄÒâÒåÔÚÏÂÒ»ÕµÄËÄÖÐÓÐÏêÊö¡£ LL_CHANNEL_MAP_REQ£º
LL_TERMINATE_IND:
Õâ¸öErrorCodeÔÚÀ¶ÑÀÐÒéÖÐÓоßÌåÖÆ¶¨ÒâÒå¡£[Vol2 Part D] LL_ENC_REQ:
ºÍ¼ÓÃÜÏà¹ØµÄÇëÇóÖ¡
LL_ENC_RSP:
ºÍ¼ÓÃÜÏà¹ØµÄ»Ø¸´Ö¡ LL_START_ENC_REQ: ûÓÐCtrData×Ö¶Î LL_START_ENC_RSP: ûÓÐCtrData×Ö¶Î LL_UNKNOWN_RSP:
LL_FEATURE_REQ:
LL_FEATURE_RSP:
LL_PAUSE_ENC_REQ: ûÓÐCtrData×Ö¶Î LL_PAUSE_ENC_RSP: ûÓÐCtrData×Ö¶Î LL_VERSION_IND:
LL_REJECT_IND:
¹ØÓÚÀ¶ÑÀͨÐÅÐÒéµÄÀí½â
Ò»¡¢Ê±ÖÓÒªÇó
Active״̬ÏÂСÓÚ¡À50ppm¡£ Sleep ModeÏÂСÓÚ¡À500ppm¡£
¶þ¡¢É豸¹ýÂË
³ýÁ˽öÖ§³Ö²»¿ÉÁ¬½ÓµÄ¹ã²¥ÏµÍ³£¨non-connectable advertising£©£¬ÆäËûģʽ¾ùÐèÖ§³ÖÉ豸¹ýÂË¡£¹ã²¥¡¢É¨Ãè¡¢Á¬½Ó·¢Æð¾ù¾ßÓи÷×Ô¶ÀÁ¢µÄ¹ýÂË»úÖÆ¡£Èç¹ûоƬ²»Ö§³ÖÕ⼸ÖÖģʽµÄ»°£¬ÄǾͿÉÒÔ²»Ö§³ÖÉ豸¹ýÂË¡£É豸¹ýÂËÊÇΪÁ˾¡Á¿¼õÉÙ²»±ØÒªµÄÊý¾ÝͨÐÅ¡£ É豸¹ýÂËʱÐèÒª¾ß±¸Ò»¸ö°×Ãûµ¥£¬°×Ãûµ¥ÄÚÈݰüÀ¨²»¹ýÂËÉ豸µÄµØÖ·ºÍµØÖ·ÀàÐÍ£¨¹«¹²»òËæ»ú£©¡£°×Ãûµ¥ÄÚÈÝÓÉHOSTÉèÖá£ÒÔ϶Ը÷ÖÖ¹ýÂËģʽ×÷Ò»¸ö½éÉÜ£º 1¡¢¹ã²¥¹ýÂË
Ö§³Ö¹ýÂË·½Ê½ÈçÏ£¬Ò»´Î½öÖ§³ÖÒ»ÖÖ·½Ê½£º
¡¤¹ã²¥É豸½ö´¦ÀíÀ´×Ô°×Ãûµ¥µÄÉ豸µÄɨÃè¡¢Á¬½ÓÇëÇó¡£ ¡¤¹ã²¥É豸´¦ÀíÒ»ÇÐÉ豸µÄɨÃè¡¢Á¬½ÓÇëÇó¡££¨¸´Î»Öµ£©
¡¤¹ã²¥É豸´¦ÀíËùÓÐÉ豸µÄɨÃèÇëÇ󣬽ö´¦Àí°×Ãûµ¥µÄÁ¬½ÓÇëÇó¡£ ¡¤¹ã²¥É豸´¦ÀíËùÓÐÉ豸µÄÁ¬½ÓÇëÇ󣬽ö´¦Àí°×Ãûµ¥µÄɨÃèÇëÇó¡£
2¡¢É¨Ãè¹ýÂË
Ö§³Ö¹ýÂË·½Ê½ÈçÏ£º
¡¤É¨ÃèÉ豸½ö´¦ÀíÀ´×Ô°×Ãûµ¥É豸µÄ¹ã²¥Ö¡¡£ ¡¤É¨ÃèÉ豸´¦ÀíÒ»ÇÐÉ豸µÄ¹ã²¥Ö¡¡£ ¼ÙÈç¹ã²¥·½ÒѾ¹ýÂ˸ÃɨÃèÉ豸µÄ»°£¬Í¨ÐŲ»Äܳɹ¦¡£
3¡¢·¢Æð¹ýÂË
Ö§³Ö¹ýÂË·½Ê½ÈçÏ£º
¡¤±»·¢ÆðÉ豸´¦ÀíÀ´×Ô°×Ãûµ¥ÄÚËùÓÐÉ豸µÄÁ¬½Ó·¢ÆðÇëÇó¡£
¡¤±»·¢ÆðÉ豸ºöÂÔ°×Ãûµ¥£¬½ö´¦Àíhost¸ø³öÉ豸µÄÁ¬½Ó·¢ÆðÇëÇó¡£
Èý¡¢·ÇÁ¬½Ó״̬¼òÊö
1¡¢standby
StandbyÊǸ´Î»ºóµÄоƬ³õʼ״̬£¬ÓÉËü¿ÉÒÔ½øÈë¹ã²¥¡¢É¨ÃèºÍÁ¬½Ó״̬¡£ 2¡¢advertising
½øÈë¹ã²¥×´Ì¬ºó£¬±ã¿ªÊ¼·¢Ë͹㲥֡¡£ÔÚ·¢ËÍÍêÒ»Ö¡¹ã²¥Ö¡ÒÔºó£¬advertising event½«±»¹Ø±Õ£¬À´ÊÊÓ¦ÆäËû¹¦ÄÜ¡£¹ã²¥Ê¼þÓÐÒÔϼ¸ÖÖÀàÐÍ£º
µÚÒ»Ö¡¹ã²¥Ö¡Ó¦¸ÃÔÚchannel indexÖеÄ×îµÍµÄ¹ã²¥ÐŵÀ·¢ËÍ¡£
¹ã²¥Ê¼þÊÇ·ñÓлظ´Ö¡Óɹ㲥֡ÀàÐ;ö¶¨£¬¾ßÌåÈçÏÂ±í£º
µ±ÊÕµ½´íÎóµÄ·µ»ØÖ¡Ê±£¬¹ã²¥¶Ë»áÔÚÏÂÒ»¸ö¹ã²¥ÐŵÀ·¢Ë͹㲥֡£¬»òÖ±½ÓÍ£Ö¹¹ã²¥Ê¼þ¡£ ¹ã²¥Ê¼þ¼ä¸ô±ØÐëÊÇ625usµÄ±¶Êý£¬·¶Î§ÔÚ20ms~10.24s£¬ÆäÉèÖ÷½Ê½ÈçÏ£º
T_advEvent = advInterval+ advDelay
scannable undirectedºÍnon-connectable undirectedʼþ£¬advInterval³¤¶È±ØÐë´óÓÚ100ms£»connectable undirectedʼþ£¬advInterval³¤¶È±ØÐë´óÓÚµÈÓÚ20ms ¡£advDelay
ÊÇ0~10msµÄÎ±Ëæ»úÊý¡£Á¬Ðø¹ã²¥Ö¡·¢ËÍʾÒâͼÈçÏ£º
a£©Connectable Undirected Event Type
Èçͼ4.5½ÓÊÕµ½CONNECT_REQÖ®ºó£¬¹ã²¥·½±ãÍ˳ö¹ã²¥×´Ì¬£¬½øÈëSlave״̬¡£
b£©Connectable Directed Event Type
c£©Scannable Undirected Event Type
d£©Non-connectable Undirected Event Type
1¡¢ scanning
¼ì²â״̬ÊÇÓÃÀ´¼àÌý¹ã²¥Ö¡µÄ£¬Æä״̬ÓÉHOST¿ØÖÆ£¬·ÖΪÖ÷¶¯É¨ÃèºÍ±»¶¯É¨Ãè¡£ ɨÃè״̬ÏÂÓÐÁ½¸ö²ÎÊýscanWindow¡¢scanIntervalÓÃÓÚÉèÖÃÒ»´ÎɨÃèµÄʱ¼ä¡£É¨Ãèʱ¼ä²»Äܳ¤Óë10.24s£¬scanWindow ±»¶¯É¨Ã裨Passive Scanning£©£ºÖ»½ÓÊÕÖ¡£¬²»·¢ËÍÖ¡¡£ Ö÷¶¯É¨Ã裨Active Scanning£©£º¼àÌý¹ã²¥Ö¡£¬¸ù¾Ý¹ã²¥Ö¡¸ñʽ£¬»Ø¸´ÏàÓ¦Ö¡¡£ ADV_IND/ADV_SCAN_IND ->SCAN_REQ ADV_DIRECT_IND PDU/ADV_NONCONN_IND²»»Ø¸´SCAN_REQ ɨÃèÐè½øÐÐÍ˱ܲÙ×÷¡£¾ßÌå¿´Îĵµ°É£¬¾Í²»Ìù½øÀ´ÁË¡£ 2¡¢ initiating initiatingûÓÐchannel indexµÄÏÞÖÆ¡£ µ±ÊÕµ½Ò»¸öÔÚ¹ýÂ˰×Ãûµ¥ÄÚµÄADV_IND»òADV_DIRECT_IND£¬·¢ÆðÕß½«»á·¢ËÍÒ»¸öCONNECT_REQ¸ø¹ã²¥·½¡£·¢ËÍÍêCONNECT_REQºóÍ˳ö·¢Æð״̬£¬½øÈëÁ¬½Ó״̬¡£ ËÄ¡¢Á¬½Ó״̬¼òÊö£º µ±·¢ÆðÕß·¢ËÍCONNECT_PDU»òÕ߹㲥·½ÊÕµ½CONNECT_REQ£¬ÔòÈÏΪÁ¬½Ó±»´´½¨£¬µ«´Ëʱ²¢·ÇÈÏΪÒѾ½¨Á¢Á¬½Ó¡£Ö»Óе±Õýʽ¿ªÊ¼Êý¾ÝͨÐź󣬲ÅÈÏΪÁ¬½ÓÒѾ±»½¨Á¢¡£ Á¬½Ó½¨Á¢ºó£¬Á¬½ÓÖÐÓÐÁ½¸ö½ÇÉ«£ºMasterºÍSlave¡£MasterÖ÷¿Øconnection eventµÄʱÐò¡£Ã¿´Îconnection event±ãÊÇMasterºÍSlaveµÄÒ»´Îͬ²½½áµã¡£ 1¡¢Á¬½Óʼþ£¨Connection Events£© Ò»´ÎÁ¬½Óʱ¼ä£¬Ê¹ÓÃͬһ¸öchannel index¡£Ã¿´ÎÁ¬½ÓÖÁÉÙ½øÐÐÒ»´ÎÊý¾Ý´«Êä¡£Slave¶Ë ÔÚ½ÓÊÕµ½À´×ÔMasterµÄÊý¾ÝÖ¡ºó£¬ÎÞÂÛCRCÊÇ·ñÕýÈ·£¬¾ùÐèÒª»Ø¸´Êý¾Ý£¬³ý·Ç¶à´ÎÁ¬ÐøCRC²»ÕýÈ·¡£MasterÒ²ÊDz»¹ÜSlave·¢¹ýÀ´µÄÖ¡ÊÇ·ñÕýÈ·£¬¾ùÐè»Ø¸´Êý¾Ý£¬Ã»Óгý·Ç¡£ÎÞÂÛCRCÊÇ·ñÕýÈ·£¬ÎÒÃǶ¼ÈÏΪHeaderÊǶԵġ£MasterÊÕ²»µ½À´×ÔSlaveµÄÊý¾Ý£¬Ôò¹Ø±Õconnection event¡£MasterºÍSlave¶¼Äܹرմ˴Îconnection¡£ Á¬½Óʼþ³ÖÐøÊ±¼ä³¤¶ÈÓÉconnIntervalºÍconnSlaveLatency¾ö¶¨¡£ ÿ´ÎÁ¬½ÓʼþµÄÆðʼµã³Æ×÷anchor point¡£ÔÚanchor point£¬Master¿ªÊ¼·¢ËÍÊý¾Ý£¬Slave¿ªÊ¼½ÓÊÕÊý¾Ý¡£connInterval±ãÊDZ¾´ÎÁ¬½ÓµÄ³ÖÐøÊ±¼ä¡£Master±ØÐëÈ·±£±¾´ÎÁ¬½Óʱ¼äÔÚÏ´Îanchor point֮ǰ¼ä¸ôT_IFSµÄʱ¼ä¹Ø±Õ¡£connInterval³¤¶È±ØÐëÊÇ1.25msµÄ±¶Êý£¬³¤¶ÈÔÚ7.5ms~4.0s²»µÈ¡£connIntervalÓÉ·¢ÆðÕßͨ¹ýCONNNECT_REQ´«Ë͸ø¹ã²¥·½¡£ connSlaveLatencyÊÇSlave¶ËÔÊÐíµÄ¼àÌýÑÓʱʱ¼ä£¬Æä³¤¶È·¶Î§ÈçÏ£º 0~((connSupervisionTimeout/ connInterval) - 1)ÇÒ±ØÐëСÓÚ500¡£ Ò²¾ÍÊÇ˵£¬¼ÙÈçconnSlaveLatency=0£¬ÔòSlaveÐèÒªÔÚÿ¸öanchor pointʱ¿Ì¼àÌý¡£Ã»ÊÕµ½ÉèÖÃconnSlaveLatencyµÄ֡ʱ£¬ÒàÈçÊÇ¡£ MasterºÍSlave¾ùÓÐÒ»¸ö16bitµÄ¼ÆÊýÆ÷connEventCounterÿÓÐÒ»´Îconnection event£¬¼ÆÊýÆ÷¾Í¼ÓÒ»£¬¼ÙÈçÒç³öÔòÑ»·¡£ËüÊÇÓÃÓÚLinkLayer×÷ͬ²½Ê±Óá£SlaveÔڵȴýconnSlaveLatencyʱ£¬¸Ã¼ÆÊýÆ÷Òà¼ÆÊý¡£ 2¡¢Á¬½Ó³¬Ê±£¨Supervision Timeout£© À¶ÑÀϵͳΪÁ˼ì²âÁ¬½Ó¶ªÊ§£¬±ãÉèÖÃÁËÒ»¸öSupervisionTimeout¼ÆÊýÆ÷TLLconnSupervision¡£Ã¿´Î½ÓÊÕµ½Êý¾ÝÖ¡£¬Ôò¼ÆÊýÆ÷ÇåÁã¡£Supervision Time³¬¹ýÒÔϼ¸¸ö·¶Î§ÔòÈÏΪ³¬Ê±£º ¡¤´óÓÚ6 * connInterval ¡¤´óÓÚconnSupervisionTimeout connSupervisionTimeoutΪ10msµÄ±¶Êý£¬·¶Î§ÊÇ100ms~32s£¬²¢ÇÒСÓÚ(1 + connSlaveLatency) * connInterval¡£ TimeoutÒÔºó£¬É豸ֹͣ·¢ËÍ£¬½øÈëStandby״̬£¬²¢ÇÒÉϱ¨Öжϡ£ 3¡¢ ·¢ËÍ´°£¨Transmit Window£© Transmit WindowµÄÐÅÏ¢°üº¬ÔÚCONNECT_REQÖУ¬´«Ë͸ø·¢ÆðÕß¡£ ·¢ËÍ´°ÆðʼÊÇÔÚÊÕµ½CONNECT_REQÖ®ºótransmitWindowOffset+ 1.25ms£¬ transmitWindowSize¶¨Òå·¢ËÍ´°µÄ¿í¶È¡£ transmitWindowOffset·¶Î§1.25msµÄ±¶Êý£¬0 ms~connInterval¡£ transmitWindowSize·¶Î§1.25msµÄ±¶Êý£¬1.25ms~10ms|connInterval - 1.25 ms¡£ 4¡¢Ö÷É豸£¨Master Role£© ½¨Á¢Á¬½Óºó£¬·¢ÆðµÄÒ»·½³ÉΪMaster¡£ Á¬½Ó״̬½¨Á¢ÒÔºó£¬MasterÖØÐÂÉèÖÃTLLconnSupervision£¬LinkLayerÈ·ÈÏÁ¬½ÓÒѾ½¨Á¢¡£ËæºóMasterÔÚtransmit windowʱ¼äÄÚ¿ªÊ¼·¢Ë͵ÚÒ»¸öÊý¾ÝÖ¡£¬MasterµÄµÚÒ»Ö¡³¤¶È¿ÉÒÔ³¬¹ý transmit window¡£Master¾ö¶¨µÚÒ»¸öanchor point£¬ ÏÂÒ»¸öanchor point=connInterval+first anchor point¡£ ÒÔÏÂÊÇÒ»¸öÀý×Ó£º 5¡¢´ÓÉ豸£¨Slave Role£© ½¨Á¢Á¬½Óºó£¬¹ã²¥µÄÒ»·½³ÉΪSlave¡£ SlaveÒ»·½Ò²Ïàͬ£¬ÖØÐÂÉèÖÃTLLconnSupervision£¬LinkLayerÈ·ÈÏÁ¬½ÓÒѾ½¨Á¢¡£Á¬½Ó½¨Á¢ºóµÄµÚÒ»Ö¡£¬ÎÞÂÛCRCÊÇ·ñÊÕ¶Ô£¬¶¼°ÑËü×÷ΪµÚÒ»´ÎÁ¬½ÓʼþµÄanchor event¡£ ¼ÙÈçµÚÒ»¸ötransmit windowûÓÐÊÕµ½Êý¾ÝÖ¡£¬Ôò×¼±¸ÔÚÏÂÒ»¸ötransmit windowϽÓÊÕÊý¾Ý£¬¶ø´Ëʱʼþͬ²½¼ÆÊýÆ÷connEventCountÒà¼ÓÒ»¡£ 6¡¢¹Ø±ÕÁ¬½Óʼþ£¨Closing Connection Events£© HeaderÖеÄMDλ±êʶÊÇ·ñ¸Ã´ÎʼþÖ®ºó»¹ÓÐÊý¾Ý·¢ËÍ¡£¼ÙÈçMDÖÃ룬ÔòMaster½Ó×Å·¢£¬Slave½Ó×ÅÊÕ¡£ÈκÎÒ»·½ÊÕ²»µ½¶Ô·½µÄÖ¡ÁË£¬¾ù¹Ø±ÕÁ¬½Óʼþ¡£ Á¬ÐøÁ½´ÎÊÕµ½Êý¾ÝCRC²»¶Ô£¬Ò²¹Ø±ÕÁ¬½Óʼþ¡£×ܽáÈçÏ£º 7¡¢·¢ËÍ´°ÍØ¿í£¨Window Widening£© ÓÉÓÚ·¢ËͶ˽ÓÊն˶¼´æÔÚ¾§ÕñƵƫ£¬ËùÒÔ¿ÉÄܻᵼÖÂSlave¶Ëanchor point²»Í¬²½£¬Òò´ËSlaveÿ´Î½ÓÊÕÍêÒ»¸öÊý¾ÝÖ¡£¬¾ùÐèͬ²½Ò»´Îanchor point¡£ ½ÓÊÕ¶ËÐèÒª¸ù¾Ý·¢ËÍ¶ËµÄÆµÆ«MasterSCAºÍ½ÓÊÕ¶ËÆµÆ«SlaveSCAÀ´¼ÆËã½ÓÊն˵ĽÓÊÕ´°ÍØ¿í²ÎÊý£¬ÒÔ±£Ö¤Êý¾Ý³É¹¦½ÓÊÕ¡£¼ÆË㷽ʽÈçÏ£º ÆäֵӦСÓÚ((connInterval/2) - T_IFS us)¡£¼ÙÈçµ½´ïÕâ¸öÖµ£¬ÔòÈÏΪÁ¬½Ó¶ªÊ§¡£ 8¡¢ÐŵÀÁбíÑ¡Ôñ£¨Data Channel Index Selection£© Master¶ËÐèÒª¸ø´Ë´ÎÁ¬½ÓµÄÐŵÀ·ÖÀࣺʹÓÃÐŵÀºÍ²»Ê¹ÓÃÐŵÀ¡£Ê¹ÓÃÐŵÀ×îÉÙΪÁ½¸ö¡£ÐŵÀ·ÖÀàÓÉHOST²úÉú¡£¶øSlaveµÄChannel Mapͨ¹ýCONNECT_REQÖ¡½ÓÊÕµ½±¾µØ¡£ Á¬ÐøµÄconnection eventÿ´ÎÐèÒª»ñÈ¡Á½¸ö²ÎÊýunmappedChannelºÍlastUnmappedChannel¡£Ç°ÕßÊÇ´Ë´ÎÁ¬½ÓûÓÐʹÓùýµÄÐŵÀÁÐ±í£¬ºóÕßÊÇǰһ´ÎÁ¬½ÓδÓùýµÄÐŵÀ±àºÅ¡£ δÓÃÐŵÀ±àºÅ¼ÆËã·½·¨ÈçÏ£º unmappedChannel= (lastUnmappedChannel+ hopIncrement) mod 37 ¼ÙÈçunmappedChannelΪused ChannelµÄ»°£¬Ôò´Ë´ÎµÄChannel IndexÔò¸ù¾ÝÕâ¸öunmappedChannelµÃµ½¸Ã´ÎconnectionËùʹÓõÄChannel¡£ ¼ÙÈçunmappedChannelΪunused Channel£¬Ôò¸ù¾ÝÏÂÃæ¹«Ê½¼ÆËãµÃµ½Ò»¸öremappingIndex¡£ remappingIndex= unmappedChannelmod numUsedChannels ×ܽáÈçÏÂͼ£º 9¡¢È·ÈÏ»úÖÆºÍÊý¾ÝÁ÷¿ØÖÆ£¨Acknowledgement and Flow Control£© Êý¾ÝµÄÈ·ÈÏÒÀ¿¿transmitSeqNum£¨SN£©ºÍnextExpectedSeqNum£¨NESN£©À´¿ØÖÆ¡£NESNÓÃÓÚÈ·ÈÏǰһ֡ÊÇ·ñ½ÓÊÕÕýÈ·£¬ÊÇ·ñÐèÒªÖØ·¢¡£¸Õ¸Õ½øÈëÁ¬½Ó״̬£¬SNºÍNESN¾ùÐèÉèÖóÉ0¡£¿ØÖÆ·½Ê½ÈçÏÂͼ£º NESNÔÚÒ»ÖÖÇé¿öϲ»»á±»¸üУ¬¾ÍÊǽÓÊÕBUFFER²»¹»µÄÇé¿ö¡£Õâ»áʹ·¢ËͶËÖØ´«¸ÃÖ¡£¬Èç´ËʵÏÖÊý¾ÝÁ÷¿ØÖÆ¡£ Îå¡¢LinkLayer¿ØÖÆÃèÊö LLCP£¨LinkLayer Control Protocol£©ÊÇÓÃÀ´¿ØÖÆÁ½¸öLinkLayerÖ®¼äµÄ¿ØÖƺÍÐÉ̵ġ£ÆäÖаüÀ¨Á¬½Ó¿ØÖÆ£¬¼ÓÃÜ¿ØÖƵȵȡ£ 1¡¢ LinkLayerÁ¬½Ó¸üкÍChannelMap¸üРÿ´Î½øÈëÁ¬½Ó״̬ºó£¬É豸¾ùÐè¸üÐÂconnInterval, connSlaveLatencyºÍconnSupervisionTimeout¡£Masterͨ¹ý·¢ËÍLL_CONNECTION_UPDATE_REQÖ¡À´ÊµÏÖ²ÎÊý¸üУ¬Slave²»ÄÜ·¢ËÍÕâÖÖ¸ñʽµÄÖ¡£¬Ëüͨ¹ýʹÓÃL2CAPÐŵÀ»Ø¸´¸üÐÂÈ·ÈÏÀ´È·ÈϲÎÊý¸üС£²ÎÊý¸üÐÂ֮ǰʹÓÃÀϵIJÎÊý£¬¸üÐÂÖ®ºóʹÓÃвÎÊý¡£ Slave¶ËÊÕµ½LL_CONNECTION_UPDATE_REQÖ®ºó£¬¼ÙÈç connEventCount mod 65535СÓÚ32767£¬²¢ÇÒ²»µÈÓÚ±¾µØµÄconnEventCount£¬´ËʱËüÐè¼àÌýËùÓеÄConnection Event£¬Ö±µ½È·ÈÏMasterÊÕµ½×Ô¼ºµÄREQ ACK¡£SlaveÔÚÈ·ÈÏÁ½±ß connEventCountÏàµÈ֮ǰµÄConnection Event¾ùÐèÒª¼àÌý¡£ ¼ÙÈçconnEventCount mod 65535´óÓÚ32767£¬ÔòSlaveÈÏΪÓëMaster¶ªÊ§Á¬½Ó£¬»Øµ½ Standby״̬£¬²¢Éϱ¨Ö÷»ú¡£ MasterÕâ±ß£¬ÐèÒªÔÚµÚÒ»¸öTransmit WindowÄÚ·¢ËÍÊý¾Ý£¬Ëü·¢Ë͵ÄÕâÖ¡Êý¾Ý×÷Ϊ´Ë´ÎConnectionµÄanchor point¡£MasterÔÚÕâ¸öanchor pointÒÔºó¸üÐÂËüµÄconnInterval£¬²¢ÇåÁãTLLconnSupervision¼ÆÊý¡£ ¼ÙÈçʹÓÃ×Ô¶¯·¢ËÍLL_CONNECTION_UPDATE_REQ£¬ÔòTimeout²ÎÊý²»¸úУ¬Óëǰ´ÎLL_CONNECTION_UPDATE_REQ»òÕßCONNECT_REQÉèÖÃʱÏàͬ¡£ÆäËû²ÎÊýÒàÈçÊÇ¡£ ×Ô¶¯¸üлúÖÆÓÃÓÚMasterÓÉÓÚÆäËûÐèÇó£¬ÐèÒª¸ü¸Äanchor pointʱ¼ä¡£ ChannelMapµÄ¸üÐÂÓÉLL_CHANNEL_MAP_REQÍê³É£¬ 2¡¢¼ÓÃÜ ¼ÓÃܲÎÊýÉèÖÃͨ¹ýLL_ENC_REQºÍLL_ENC_RSP ¿ªÊ¼¼ÓÃÜ£º LL_START_ENC_REQ ºÍ LL_START_ENC_RSP ½áÊø¼ÓÃÜ£º LL_PAUSE_ENC_REQ or LL_TERMINATE_IND PDUs Empty PDUs or LL_PAUSE_ENC_RSP orLL_TERMINATE_IND 3¡¢Feature Set Exchange ½øÈëÁ¬½Ó״̬ÒÔºó£¬À¶ÑÀÉ豸֮¼äÐèÒª½»»»¸÷×ÔËùÖ§³ÖµÄ¹¦ÄܲÎÊý¡£¸Ã¹ý³Ìͨ¹ýLL_FEATURE_REQ PDUºÍLL_FEATURE_RSP PDU½»»»ÐÅÏ¢¡£Êý¾ÝÖ¡½»»»Ê±¼ä¹ØÏµÈçÏ£º ¾ßÌåµÄFeature¶ÔӦλÈçÏÂͼËùʾ£º 4¡¢Version Exchange Ö÷´ÓÖ®¼ä½»»»É豸ËùÖ§³ÖµÄÀ¶ÑÀÐÒé°æ±¾ÐÅÏ¢£¬Í¨¹ýLL_VERSION_INDÀ´½»»»ÐÅÏ¢¡£ÆäÐÅÏ¢°üÀ¨£º VersNr£ºËùÖ§³ÖµÄÀ¶ÑÀÐÒé CompId£ºÈÏÖ¤ÐÅÏ¢ SubVersNr£ºControllerµÄʵÏÖ°æ±¾ºÅ¡£ 5¡¢Termination Procedure ÖÕֹͨÐÅ£¬Í¨¹ýLL_TERMINATE_INDÀ´½»»»ÐÅÏ¢¡£ IP¼Ü¹¹ ÒÔÏÂÊǼ¸¸öÀí½âÉϵÄÄѵ㣺 Ò»¡¢¹ØÓÚExchangeTableºÍControlStructure ExchangeMemoryÊÇÒ»¸ö¶¯Ì¬µÄ´æ´¢Æ÷¼þ£¬ÆäÖаüÀ¨ÁËExchangeTabel¡¢ControlStructure¡¢T/RxDescriptor¡¢T/RxBuffer£¬ËüÃÇÖ®¼äµÄÁ¬½Ó¶¼ÊÇÓÉÖ¸ÕëÍê³É¡£¹ØÏµ´ó¸ÅÈçÏ£º Ê×ÏÈÐèÒª½«ControlStructureºÍTRXDescriptorÔÚEMÖÐÅäÖÃÍê³Éºó£¬ÔÙÅäÖÃExchangeTabel¡£Æä¿ÉÅäÖõĿռäÈçÏÂͼËùʾ£º Ò²¾ÍÊÇ˵Ê×ÏÈÐèÒªÔÚ0x0050~0xFFFFµØÖ·ÄÚÅäÖÃControlStructure¡¢DescriptorºÍDataBuffer£¬È»ºóÔÚ0x0000~0x001FÄÚÅäÖÃControlStructurePtr0µÄÖ¸Õ룬ָÏòControlStructureµÄÊ×µØÖ·¡£ÕâÑùÔÚÏ´ÎPreFetchµÄʱºò£¬BLE_CORE¾ÍÄܹ»¶ÁÈ¡ÏàÓ¦ControlStructureµÈµÈµÄÖµÁË¡£ BLE_CORE»á¸ù¾ÝÏÂͼ£¬¶ÔExchangeTabel½øÐÐɨÃ裬ÆäÖÐÁâÐÎΪPreFetchʱ¼äµã£¬ºÚɫ׸±êΪevent·¢Éúʱ¼ä£º 1¡¢ Ò»´ÎɨÃè3¸öET£ºET_n,ET_n+1,ET_n+2¡£¸ù¾ÝÕâ3¸ö״̬ÊÇ·ñÊÇÓÐЧ¿É¶ÁÀ´ÅжϽÓÏÂÀ´ Òª×öʲô£¬·½Ê½ÈçÏÂͼËùʾ¡£ 2¡¢ µ±É¨Ãèµ½ET_n+2ΪETÓÐЧÈë¿Ú£¬ÔòÁ¢¼´ÖÕÖ¹µ±Ç°µÄevent£¬ÖÕֹʱ¼ä×î¶Ì²»ÄÜСÓÚ max packet length *2 + T_IFS * 2 £¨+ ~25£¨¼ÙÈçÓÐAES-CCM¼ÓÃܵϰ£©£©¡£