µÍ¹¦ºÄÀ¶ÑÀ(BLE)ѧϰ¼Ç¼ ÏÂÔØ±¾ÎÄ

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¼ÓÃܵϰ£©£©¡£