micro:bitのBluetoothアドバタイズには、「ネームスペース」(NameSpace)と「インスタンス」(Instance)の設定項目がある。これは、EddyStoneのNameSpaceとInstanceに相当するパラメーターで、ビーコンの種別などを指定するものでユーザーが自由に値を設定できる。しかし、ブロックを見ると「ネームスペース(6~9バイト目)」と「インスタンス(2~6バイト)」と書いてある。結論からいうと、「インスタンス(2~6バイト)」は間違いで正しくは「インスタンス(2~5バイト目)」である。
写真01
Eddystoneの定義
そもそも、ネームスペース、インスタントとは何か? EddyStoneの定義をあたる。定義は以下のURL(github)にある。まずは、アドバタイズパケットの構造だが、
には、以下のような定義がある。
表01 EddyStoneSamplePacket
Byte offset | Value | Description | Data Type |
---|---|---|---|
0 | 0x02 |
Length | |
1 | 0x01 |
Flags data type value | AD Type=01=Flags |
2 | 0x06 |
Flags data | 0x06=0b00000110 |
3 | 0x03 |
Length | |
4 | 0x03 |
Complete list of 16-bit Service UUIDs data type value | AD Type=03=16-bit Service UUIDs |
5 | 0xAA |
16-bit Eddystone UUID | |
6 | 0xFE |
… | |
7 | 0x?? |
Length | フレームタイプにより違う |
8 | 0x16 |
Service Data data type value | AD Type=0x16=Service Data |
9 | 0xAA |
16-bit Eddystone UUID (lower bytes) | EddyStone UUID = 0xFEAA |
10 | 0xFE |
16-bit Eddystone UUID (upper bytes) | |
11 | フレームタイプ | EddyStoneフレームタイプ | 0x00/10/20/30/40のどれか |
-
Note: although the core Bluetooth data type are defined in the standard as little-endian, Eddystone’s multi-value bytes defined in the Service Data are all big-endian.
-
注:コアBluetoothデータ型は標準ではリトルエンディアンとして定義されていますが、サービスデータで定義されているEddystoneの複数値バイトはすべてビッグエンディアンです。
EddyStoneビーコンには、4種類あって、micro:bitで使っているのはこのうち「UID」と呼ばれるタイプ。このため、FrameTypeは、0x00となる。
表02 EddyStoneフレームタイプ
Frame Type | High-Order 4 bits | Byte Value |
---|---|---|
UID | 0000 |
0x00 |
URL | 0001 |
0x10 |
TLM | 0010 |
0x20 |
- EID | 0011 |
0x30 |
RESERVED | 0100 |
0x40 |
上記ページでは、UIDタイプのEddyStoneビーコンは、16Bytesのデータがつき、その中は、10Bytesのネームスペース、6BytesのインスタンスID(原文ではインスタンス)であるとする。
Eddystone-UID
The Eddystone-UID frame broadcasts an opaque, unique 16-byte Beacon ID composed of a 10-byte namespace and a 6-byte instance.
Eddystone-UIDフレームは、10バイトの「ネームスペース」と6バイトの「インスタンス」 で構成される不透明(透過的でない?)でユニークな16バイトのビーコンIDをブロードキャストします。
さらにUIDタイプの場合のデータ構造は、以下のようになっているらしい。
eddystone/eddystone-uid at master · google/eddystone
表03 Frame Specification
Byte offset | Field | Description |
---|---|---|
0 | Frame Type | Value = 0x00 |
1 | Ranging Data | Calibrated Tx power at 0 m |
2 | NID0 | 10-byte Namespace |
3 | NID1 | |
: | : | : |
11 | NID9 | |
12 | BID0 | 6-byte Instance |
13 | BID1 | |
: | : | : |
17 | BID5 | |
18 | RFU | Reserved for future use, must be0x00 |
19 | RFU | Reserved for future use, must be0x00 |
ただ、前のところでは、「16Bytes」のデータと言っておきながら、この表では20Bytesの存在することになってる。これはおそらくどっちかが間違っているのではないかと思う。パケットに入っているデータはAdvertiseパケットの構造では、20Bytes(データ構造としてはデータタイプの1Bytesと、データ長の1Bytesがついて合計22Bytes。Typeから後ろの部分は、以下のようになっている。
表04 データ構造
バイトオフセット | サイズ(Bytes) | データ |
---|---|---|
0 | 2 | EddyStone 16bit UUID = 0xfeaa |
2 | 1 | EddyStone Frame Type. UID = 0x00 |
3 | 1 | EddyStone Tx Power |
4~13 | 10 | NameSpace |
14~19 | 6 | Instance |
0 件のコメント:
コメントを投稿