Advertising‎ > ‎

Advertising(解説)


PeripheralとCentral

BLE機器は、PeripheralとCentralにより構成されます。一般的なスマートフォンはCentral、一般的なGadgetはPeripheralという位置づけになっていましたが、iOS6以降(*1)からは、iOS自体もPeripheralになれる仕様になりました。一方で、Android 4.3以降(API Level 18) (*2)デバイスは、AndroidはCentralのみサポートしています。iOS7では、AirDropやiBeaconなど、PeripheralとCentralをケースバイケースで使いわける事で、機器との連携をシームレスにおこなう事が可能になってきています。

Reference
*1 CoreBluetoothプログラミング
*2 Android Bluetooth Low Energy


一般的なBLE機器



ANCS等

iBeacon, AirDrop等



BLEの周波数帯

2.4GHZ帯を用いて通信しています。チャンネル数は40チャンネルです。



Advertisingで使われるチャンネル
Channel 37, Channel 38, Channel 39を使用します。


AdvertisingのチャンネルはWifiのチャンネルとも重ならない周波数を使っています。

Advertising



Bluetooth LEのパケットのStructure

BLUETOOTH SPECIFICATION Version 4.0 [Vol 1]  47ページ

AdvertisingのパケットもLEのパケット Structureのフォーマットになる。

BLUETOOTH SPECIFICATION Version 4.0 [Vol 1]  36ページ 

 Preamble 1オクテット (10101010b)
 Access Address 4オクテット (Advertisingは 0x8E89BED6)
 PDU 2オクテット〜38オクテット 
 CRC 3オクテット 

Preambleは、

  • 10101010b
  • 01010101b
が用いられる。

Access AddressがLSB(???)の場合は10101010bで、それ以外では01010101bが用いられる。

それでは、早速、iPhoneをPeripheralにして、PacketSnifferでAdvertisingのパケットを確認する。

// [Step3] Advertisingの開始
NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"Sample"};
[myPeripheralManager startAdvertising:advertisingData];

サンプルソース

iPhoneをPeripheralにして取得できるパケットは以下の通り。

Raw data [hex] : D6 BE 89 8E 40 11 F6 98 0A AA 40 4B 02 01 1A 07 09 53 61 6D 70 6C 65 7C 39 E5

パケット Structureのフォーマットに分離していってみる。

 Preamble 
 Access Address D6 BE 89 8E (逆に並べる 8E 89 BE D6)
 
0x8E89BED6の値は、advertising data を示すAddressとして定義されている。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P36に記載
 PDU  40 11 F6 98 0A AA 40 4B 02 01 1A 07 09 53 61 6D 70 6C 65
 CRC 7C 39 E5

BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P37に記載。

PDUの中身は、Header(16bit)とPayloadに分かれる。

 Preamble 
 Access Address D6 BE 89 8E (逆に並べる 8E 89 BE D6)
 
0x8E89BED6の値は、advertising data を示すAddressとして定義されている。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P36に記載
 PDU Header 40 11 
 PDU Payload  F6 98 0A AA 40 4B 02 01 1A 07 09 53 61 6D 70 6C 65
 CRC 7C 39 E5

PUD Header

BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P38に記載

Preamble 
 Access AddressD6 BE 89 8E (逆に並べる 8E 89 BE D6)
 
0x8E89BED6の値は、advertising data を示すAddressとして定義されている。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P36に記載
 PDU Header 40  -> 0100 0000 
 11 -> 0001 0001  
 PDU Type
(4bits)
RFU 
(2bits)
 TxAdd
(1bit)
 RxAdd
(1bit)
 Length
(6bit)
 RFU
(2bit)
 0000 00 1 0 010001 00

 PDU Payload F6 98 0A AA 40 4B 02 01 1A 07 09 53 61 6D 70 6C 65
 CRC 7C 39 E5

Packet Snifferの解析結果は以下の通り。

PDU Type

PDU Typeの値は、以下の表の通り。

BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P39に記載。

Preamble 
 Access AddressD6 BE 89 8E (逆に並べる 8E 89 BE D6)
 
0x8E89BED6の値は、advertising data を示すAddressとして定義されている。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P36に記載
 PDU Header 40  -> 0100 0000 
 11 -> 0001 0001  
 PDU Type
(4bits)
RFU 
(2bits)
 TxAdd
(1bit)
 RxAdd
(1bit)
 Length
(6bit)
 RFU
(2bit)
 0000
ADV_IND
 00 1 0 010001
0x11
 00

 PDU Payload F6 98 0A AA 40 4B 02 01 1A 07 09 53 61 6D 70 6C 65
 CRC 7C 39 E5


TxAdd, RxAddはおそらく、
  • TxAdd 送信?
  • RxAdd 受信?
(要調査)

PUD Payload

PUD Payloadのフォーマットは、PDU Typeにより変化する。

 PDU Type Packet Name Format
 0000 ADV_IND Payload
 AdvA AdvData
6 octets0-31 octets
 0001 ADV_DIRECT_ID Payload
 AdvA InitA
6 octets6 octets
 0010 ADV_NONCONN_ID Payload
 AdvA AdvData
6 octets0-31 octets
 0011 SCAN_REQ Payload
 AdvA AdvData
6 octets6 octets
 0100 SCAN_RSP Payload
 AdvA ScanRspData
6 octets0-31 octets
 0101 CONNECT_REQ Payload
 AdvA AdvA LLData
6 octets 6 octets 22 octets
 0110 ADV_SCAN_IND Payload
 AdvA AdvData
0 Octet0-31 Octet
 0111-1111 reserved 

BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P39-P41に記載。

Preamble 
 Access AddressD6 BE 89 8E (逆に並べる 8E 89 BE D6)
 
0x8E89BED6の値は、advertising data を示すAddressとして定義されている。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P36に記載
 PDU Header 40  -> 0100 0000 
 11 -> 0001 0001  
 PDU Type
(4bits)
RFU 
(2bits)
 TxAdd
(1bit)
 RxAdd
(1bit)
 Length
(6bit)
 RFU
(2bit)
 0000
ADV_IND
 00 1 0 010001
0x11
 00

 PDU PayloadAdvA (6 octets)
 F6 98 0A AA 40 4B 
AdvData (0-31 octest)
 02 01 1A 07 09 53 61 6D 70 6C 65

 CRC 7C 39 E5

Ad Structure

AdvDataのフォーマットは、Ad Structureにより構成される。上記の例だと、AdvData(Advertising Data)とScapRspData(Scan Response Data)も、下図で定義されたAd Structureのフォーマットに準拠する。

図) BLUETOOTH SPECIFICATION Version 4.0 [Vol 3]の375ページのFigure11.1
BLUETOOTH SPECIFICATION Version 4.0 [Vol 3]の375ページのFigure11.1

Advertising DataとScan Response Dataは、31オクテットにより構成され、最初の1オクテットが長さ、長さの1オクテットを除いた残りはAd TypeとAd Dataにより構成される。

Preamble 
 Access AddressD6 BE 89 8E (逆に並べる 8E 89 BE D6)
 
0x8E89BED6の値は、advertising data を示すAddressとして定義されている。
BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P36に記載
 PDU Header 40  -> 0100 0000 
 11 -> 0001 0001  
 PDU Type
(4bits)
RFU 
(2bits)
 TxAdd
(1bit)
 RxAdd
(1bit)
 Length
(6bit)
 RFU
(2bit)
 0000
ADV_IND
 00 1 0 010001
0x11
 00

 PDU PayloadAdvA (6 octets)
 F6 98 0A AA 40 4B 
AdvData (0-31 octest)
 02 01 1A 07 09 53 61 6D 70 6C 65

 CRC 7C 39 E5


02 01 1A 07 09 53 61 6D 70 6C 65

のフォーマットは、

 02 Length  2オクテット
 01 AD Type  01は、Flags  
(AD Typeの種類は下記のAD Typeの項目を参照)
 1A 0001 1010 0001 1010  
Flags. Device is capable of LE and EDR (Controller and Host) & LE General Discoverable Mode

0000 0001 LE Limited Discoverable Mode
0000 0010 LE General Discoverable Mode
0000 0100 BR/EDR Not Supported
0000 1000 Simultaneous LE and BR/ERD to Same Device Capable(Controller)
0001 0000 Simultaneous LE and BR/ERD to Same Device Capable(Host)
 07 Length  7オクテット
 09   AD Type 09は、Complete Local Name
(AD Typeの種類は下記下記のAD Typeの項目参照)
 53 'S'  
 61 'a' 
 6D 'm' 
 70 'p' 
 6C 'l' 
 65 'e' 

Ad Type

主要なAd Typeは下記に示す通りです。Security関連のAd Typeは下記以外にも別途定義されているようです。

  AD Type 原文 意味
 0x01 Flags  
 0x02 16-bit Service UUIDs More 16-bit UUIDs available 
 0x03 16-bit Service UUIDs Complete list of 16-bit UUIDs available 
 0x04 32-bit Service UUIDs  More 32-bit UUIDs available 
 0x05 32-bit Service UUIDs Complete list of 32-bit UUIDs available 
 0x06 128-bit Service UUIDs More 128-bit UUIDs available 
 0x07 128-bitのサービスのUUID Complete list of 128-bit UUIDs available 
 0x08 Local Name Shortened local name 
 0x09 Local Name Complete local name 
 0xFF   Manufacture Specific Company Identifier(2 Octet) 

ドキュメントの参照先は、以下の通り。
 Flags BLUETOOTH SPECIFICATION Version 4.0 [Vol 3]  P401 Table 18.1: Flags
 Service BLUETOOTH SPECIFICATION Version 4.0 [Vol 3]  Table 18.2: Service UUIDs
 LocalName BLUETOOTH SPECIFICATION Version 4.0 [Vol 3]  P402 Table 18.3: Local Name
 TX Power Level BLUETOOTH SPECIFICATION Version 4.0 [Vol 3] P402 Table 18.4:TX Power
 Manufacture Specific BLUETOOTH SPECIFICATION Version 4.0 [Vol 3]  P405 Table 18.11: Manufacturer Specific Data

Flags

複数の論理和のflagビットが格納される。
代表的なFlagsとして、LE physicalの値は下記の通り定義されている。

 0000 0001 LE Limited Discoverable Mode
 0000 0010 LE General Discoverable Mode
 0000 0100 BR/EDR Not Supported
 0000 1000 Simultaneous LE and BR/EDR to Same Device Capa- ble (Controller) 
 0001 0000 Simultaneous LE and BR/EDR to Same Device Capa- ble (Host)

これらの値の論理和が、Flagsの値になる。

   // [Step3] Advertisingの開始
    NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"Sample"};
    [myPeripheralManager startAdvertising:advertisingData];

サンプルソース


ちなみに、iPhoneからAdvertisingすると、Flagsの値が1Aになる。

1A = 0001 1010  

 0000 0001 LE Limited Discoverable Mode
 0000 0010 LE General Discoverable Mode
 0000 0100 BR/EDR Not Supported 
 0000 1000 Simultaneous LE and BR/EDR to Same Device Capable (Controller) 
 0001 0000 Simultaneous LE and BR/EDR to Same Device Capable (Host)

iPhoneは、
  • LE General Discoverable Mode
  • Simultaneous LE and BR/EDR to Same Device Capable (Controller) 
  • Simultaneous LE and BR/EDR to Same Device Capable (Host)
のFlags。

BR/EDRは、Basic Rate/Enhanced Data Rate (BR/EDR)の略で、Classic Bluetoothを意味している。iPhoneは、Bluetooth Basic Rate/Enhanced Data Rate とBluetooth Low Energyをサポートしたデバイスであるという事を意味する。

BLEのみサポートしてデバイスであるBLE113の場合、いかのようになる。

call gap_set_mode(gap_general_discoverable, gap_non_connectable)



02 01 06 ....

Flagsの値は06。つまり
06 = 0000 0101

 0000 0001 LE Limited Discoverable Mode
 0000 0010 LE General Discoverable Mode
 0000 0100 BR/EDR Not Supported 
 0000 1000 Simultaneous LE and BR/EDR to Same Device Capable (Controller) 
 0001 0000 Simultaneous LE and BR/EDR to Same Device Capable (Host)

BLE113の上記のBGScriptの記述は
  • LE General Discoverable Mode
  • BR/EDR Not Supported 
のFlags。

Bluetooth Basic Rate/Enhanced Data Rateは非サポート、Bluetooth Low Energyをサポート。つまりClassic Bluetoothは非サポートで、Bluetooth Low Energyはサポート。

Service

128-bit Service UUIDs


iPhoneから128bitのService UUIDを発信するサンプルを作ってみる。まず1つ。

static NSString * const kUUIDServiceSample =   @"D7792ECA-23E2-4253-8C29-78EF42DB4D1C";
....
// [Step3] Advertisingの開始
NSArray *services=@[[CBUUID UUIDWithString:kUUIDServiceSample]];
NSDictionary *advertisingData = @{CBAdvertisementDataServiceUUIDsKey:services};[myPeripheralManager startAdvertising:advertisingData];

サンプルソース


AdvDataの中身は下記の通り。
02 01 1A 11 07 1C 4D DB 42 EF 78 29 8C 53 42 E2 23 CA 2E 79 D7


 02 Length of this Data (2オクテット)
 01<<Flags>> 
 1A 11010  
Flags. Device is capable of LE and EDR (Controller and Host) & LE General Discoverable Mode

0000 0001 LE Limited Discoverable Mode
0000 0010 LE General Discoverable Mode
0000 0100 BR/EDR Not Supported
0000 1000 Simultaneous LE and BR/ERD to Same Device Capable(Controller)
0001 0000 Simultaneous LE and BR/ERD to Same Device Capable(Host)
 11  Length of this Data (0x11, つまり17オクテット)
 07 <<Complete UUIDs 128bit>>
 1C UUID(後) 順番が逆になる
 4D UUID
 DB UUID
 42 UUID
 EF UUID
 78 UUID
 29 UUID
 8C UUID
 53 UUID
 42 UUID
 E2 UUID
 23 UUID
 CA UUID
 2E UUID
 79 UUID
 D7 UUID(前)

次に128bitのUUIDを2つ。Advertising Data(AdvData)の上限である31オクテットを超えているために、2つ目は表示されない模様。

static NSString * const kUUIDServiceSample =   @"D7792ECA-23E2-4253-8C29-78EF42DB4D1C";
static NSString * const kUUIDServiceSample2 =   @"D7792ECB-23E2-4253-8C29-78EF42DB4D1C";

// [Step3] Advertisingの開始
NSArray *services=@[[CBUUID UUIDWithString:kUUIDServiceSample],[CBUUID UUIDWithString:kUUIDServiceSample2]];
NSDictionary *advertisingData = @{CBAdvertisementDataServiceUUIDsKey:services};
[myPeripheralManager startAdvertising:advertisingData];

AdvDataの中身は、1つしかServiceを設定しないのと同じ結果に。

32-bit Service UUIDs

iPhoneで、32bitのUUIDの作り方わからず(要調査)

16-bit Service UUIDs

iPhoneで、16bitのUUIDの作り方わからず(要調査)

Passive ScanningとActive Scanning






Scanningの方法には、Passive ScanningとActive Scanningが存在しています。


BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] P107に記載。

BLE113の場合

BLE113のBGScriptの場合は、gap_set_modeの第二引数で、gap_directed_connectable, gap_undirected_connectableを設定した場合はActive Scan、gap_non_connectableを設定した場合はPassive Scanになる。

Active Scan
 call gap_set_mode(gap_general_discoverable, gap_undirected_connectable)

 call gap_set_mode(gap_general_discoverable, gap_directed_connectable)

Passive Scan
 call gap_set_mode(gap_general_discoverable, gap_non_connectable)

iPhoneをPeripheralにした場合

最初のAdvertisingは、PDU TYPEがADV_INDのパケットが発信されます。ADV_INDの周期はデバイスにより設定されます。

iOSでもAdvertisingをおこなう事が可能です。CoreBluetoothのPeripheralManagerで、startAdvertisingを実行するとAdvertisingが始まります。

// Advertising Dataの作成
NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"Sample"};
    
// [Step3] Advertisingの開始
[myPeripheralManager startAdvertising:advertisingData];

Peripheralのサンプルコード


AdvDataの中は
02 01 1A 07 09 53 61 6D 70 6C 65
となっています。

 02 Length of this Data
 01 << Flags >>   [AD Type]
 1A0001 1010  
Flags. Device is capable of LE and EDR (Controller and Host) & LE General Discoverable Mode

0000 0001 LE Limited Discoverable Mode
0000 0010 LE General Discoverable Mode
0000 0100 BR/EDR Not Supported
0000 1000 Simultaneous LE and BR/ERD to Same Device Capable(Controller)
0001 0000 Simultaneous LE and BR/ERD to Same Device Capable(Host)
 07 Length of this Data
 09<< Complete local name>>  [AD Type]
 53 'S'
 61 'a'
 6D 'm'
 70 'p'
 6C 'l'
 65 'e'



BLE113を用いた任意のAdvDataを作成する方法


BLE113/BLE112で用いられるBGScriptでは、AdvDaraにユーザデータを定義する事が可能です。上記のiOSで出力されているのと同じ、パケットを出力する場合は、下記のように記載します。

dim adv(10)
event system boot(major, minor, patch, build, 11_version, protocol_event, hw)
    adv(0:1) = $02
    adv(1:1) = $01
    adv(2:1) = $1A
    adv(3:1) = $07
    adv(4:1) = $09
    adv(5:1) = $53
    adv(6:1) = $61
    adv(7:1) = $6d
    adv(8:1) = $70
    adv(9:1) = $6C
    adv(10:1) = $65
    call gap_set_adv_parameter(400,400,7)
    call gap_set_mode(gap_general_discoverable, gap_undirected_connectable)
    call gap_set_adv_data(0,10,adv(0:10))
end


スマートフォン(Central)でのScanサンプル


Comments