Advertising Parameter
Bluetooth Low EnergyのLink Layerのパケットは、Preamble、AccessAddress、PDU、CRCにより構成される。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] P36より
Access Address
AccessAddressは4オクテットで構成され、Advertising時は、0x8E89BED6の値がもちられる。接続時には、それぞれ個別のアドレスが割り振られる。
0x8E89BED6
BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] P36に記載
PDU
PDUは、HeaderとPayloadにより構成される。Payloadの長さや書式は、Headerで定義されたTypeにより変化する。
PDU Headerは、16ビットしか割り振りがないので、ビット単位で構成される。最初の4ビットがPDU Typeが定義される。
領域名 | 長さ | 意味 |
---|---|---|
PDU Type | 4bit | PDUのタイプを定義 |
RFU | 2bit | 現在は使用していない。(未定義の領域) |
TxAdd | 1bit | AdvA, InitA, ScanAなどがpublicな場合0、randomの場合1。 PDU Typeにより定義がかわる。 |
RxAdd | 1bit | AdvA, InitA, ScanAなどがpublicな場合0、randomの場合1。PDU Typeにより定義がかわる。 |
Length | 6bit | PDU Typeや、Payloadの中身によっても変化 |
RFU | 2bit | 現在は使用していない。(未定義の領域) |
HeaderのTypeは下図の値で定義される。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] P39に記載。
Advertisingに関連するPDU Typeは以下の通りである。
Type | 意味 |
---|---|
ADV_IND | 不特定多数デバイスから接続可能なアドバタイズイベント(undirected) |
ADV_DIRECT_IND | 特定デバイスから接続可能なアドバイタイズイベント(directed) |
ADV_NONCONN_IND | 不特定多数デバイスから接続不可能なアドバイタイズイベント(undirected) |
ADV_SCAN_IND | 不特定多数デバイスからスキャン可能なアドバタイズイベント(undirected) |
iBeaconでは、ADV_NONCONN_INDを使用する。また、PDU Type別のフォーマットは下表のように定義されている。
Type | フォーマット |
---|---|
ADV_IND | TxAdd 0:AdvA public TxAdd 1:AdvA random |
ADV_DIRECT_IND | TxAdd 0:AdvA public TxAdd 1:AdvA random RxAdd 0:InitA public RxAdd 1:InitA random |
ADV_NONCONN_IND | TxAdd 0:AdvA public TxAdd 1:AdvA random |
SCAN_REQ | TxAdd 0:ScanA public TxAdd 1:ScanA random RxAdd 0:AdvA public RxAdd 1:AdvA random |
SCAN_RSP | TxAdd 0:AdvA public TxAdd 1:AdvA random |
CONNECT_REQ | TxAdd 0:InitA public TxAdd 1:InitA random RxAdd 0:AdvA public RxAdd 1:AdvA random |
ADV_SCAN_IND | TxAdd 0:AdvA public TxAdd 1:AdvA random |
BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] P39-P41より抜粋
#define NON_CONNECTABLE_ADV_INTERVAL MSEC_TO_UNITS(100, UNIT_0_625_MS) /**< The advertising interval for non-connectable advertisement (100 ms). This value can vary between 100ms to 10.24s). */
ble_gap_adv_params_t m_adv_params;
memset(&m_adv_params, 0, sizeof(m_adv_params));
m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_NONCONN_IND; // ADV_NONCONN_IND
m_adv_params.p_peer_addr = NULL; // 不特定多数デバイスから接続可能に
m_adv_params.fp = BLE_GAP_ADV_FP_ANY; // 不特定多数デバイスから接続可能に
m_adv_params.interval = NON_CONNECTABLE_ADV_INTERVAL; // 発信周期
m_adv_params.timeout = 0;