2021年2月15日月曜日

micro:bitの「Bluetooth UIDをアドバタイズ」、NameSpaceとInstanceは32bitのみ設定可能(その1)

 micro:bitのBluetoothアドバタイズには、「ネームスペース」(NameSpace)と「インスタンス」(Instance)の設定項目がある。これは、EddyStoneのNameSpaceとInstanceに相当するパラメーターで、ビーコンの種別などを指定するものでユーザーが自由に値を設定できる。しかし、ブロックを見ると「ネームスペース(6~9バイト目)」と「インスタンス(2~6バイト)」と書いてある。結論からいうと、「インスタンス(2~6バイト)」は間違いで正しくは「インスタンス(2~5バイト目)」である。

写真01
image

Eddystoneの定義

 そもそも、ネームスペース、インスタントとは何か? EddyStoneの定義をあたる。定義は以下のURL(github)にある。まずは、アドバタイズパケットの構造だが、

EddyStone Specification

には、以下のような定義がある。
表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 件のコメント:

コメントを投稿