2021年07月29日 更新

UUID詳細

どうも、クラゲです。
今回はBLEで使われるUUIDについて、少し詳しく見ていきます。

【 概要 】

[TOC]

UUIDとは

UUID(Universally Unique Identifier)とは、ソフトウェア上でオブジェクトを一意に識別するための識別子である。 by wikipedia

一意とは、重複することなく、世の中に1つしかないということです。つまり、重複しない唯一のIDということですね。
最後に紹介しますが、UUIDは誰でもすぐに生成できてしまいます。
なぜ重複せずに生成できるかを簡単に言うと、戻る事のない情報(時刻情報タイムスタンプ)や世の中に1つしか存在しないはずのアドレス(MACアドレス)などを利用して一意のIDを生成しているためです。
実際は重複してしまう可能性が全くゼロではないのですが、隕石が頭に降ってくる確率より低いので良しとしているようです。
もちろん、人がミスして使ったり、故意的に使うと重複します。

UUIDの中身

では、UUIDの中身を見ていきましょう。
下記はUUIDの一例です。

00002a19-0000-1000-8000-00805f9b34fb

フォーマットは決まっていて、16進数の文字列とハイフンからなる文字列です。
データ長も決まっていて、128bitの数値で、Byteでいうと16Byte、ハイフンを除いて32文字です。

BLEのUUIDが、このように短縮形で書かれている場合もあります。

2a19

Bluetooth SIGという団体にて標準で定義されているUUIDに限り、2Byte(4文字)で表現することが許されています。この2Byte以外は全て共通のデータ値であり、省略しても良いことになっています。
詳しく書くと、下記のX以外の文字列が省略された共通データ値です。

0000XXXX-0000-1000-8000-00805f9b34fb

BLEプログラミングでの記述時のコツです。

  • ハイフンは必要なので省略しないこと
  • 小文字で記述しないとうまくいかない場合があるので気をつけること

BLEにおけるUUID

さて、UUIDがどんなもので、どのようなフォーマットなのかまで学びました。
実際のBLEプログラミングでの使われ方を見ていきましょう。
BLEでUUIDを使う対象は3つあります。

  1. ペリフェラル(Peripheral)のUUID
  2. サービス(Service)のUUID
  3. キャラクタリスティック(Characteristic)のUUID

超簡単BLE入門でも説明しましたが、2と3はパソコンのフォルダ名とファイル名に相当します。1はパソコン名に相当します。BLEプログラミングにおいて使うのはほぼ2と3です。少なくともBlueJellyを使う上では1のペリフェラルUUIDを使うことはありません。

ですが、UUIDの詳細説明ということで1について一応説明しておきます。
ややこしいことに、ペリフェラルUUIDはセントラルによって番号が異なるので注意が必要です。1つのセントラルの中では一意的ですが、全体としては一意的ではないということです。

もう少し簡単に言うと、あだ名みたいなものです。
"山田さん"という人がいて、Aさんは "やまさん" と呼んで、Bさんは "やーまだ" と呼ぶことがあるかと思います。つまり山田さん(ペリフェラル)は、AさんやBさん(セントラル)によって呼称が異なるということです。

一方のサービスUUIDとキャラクタリスティックUUIDは、どのセントラルの中であろうが呼称は一意的で1つです。

色々説明しましたが、大事なのは、ServiceのUUID と CharacteristicsのUUIDで、一意のIDであるということだけです。

BLEにおけるUUIDの種類

定義済UUIDとオリジナルUUIDの2種類あります。
定義済UUIDの中に合致するServiceやCharacteristicがなければオリジナルUUIDを作る必要があります。定義済UUIDを本来とは別の用途で使用すること自体は技術的には問題ないですが、オリジナルUUIDを生成して使ったほうが分かりやすいと思います。

定義済UUID

定義済UUIDは、Bluetooth SIGが定義して割り当てているUUIDのことです。
16Byteのうち14Byteは共通で2Byteだけが異なります。

共通部分はのBASE UUIDと呼ばれています。

0000XXXX-0000-1000-8000-00805f9b34fb

定義済のService UUID
https://www.bluetooth.com/ja-jp/specifications/gatt/services
例えば 180f は Battery Service を意味します。

定義済みのCharacteristic UUID
https://www.bluetooth.com/ja-jp/specifications/gatt/characteristics
例えば 2a19 は Battery Level を意味します。

UUIDの中身で説明した通り、この定義済UUIDを使う場合は16Byte表記を省略して2Byteで短縮表記することが許されています。
なぜわざわざ短縮表記するのかというと、データを小さくすることで、送信時間と消費電力の短縮につながるというメリットがあるためです。

オリジナルUUID

開発者が独自に割り当てるUUIDで、Vendor Specific UUIDと一般的には呼ばれています。生成方法はこの後説明します。
短縮はダメで、必ず16Byteフォーマットで表現が必要です。

オリジナルUUIDの生成方法

主に2通りで、どちらも非常に簡単できます。
あとは生成されたものをコピペして使えば良いだけです。

コマンドから生成

ターミナルから以下のコマンド1発で生成できます
LinuxまたはMacの人はTerminalでこちらを実行

uuidgen

Windowsの人はPowerShellでこちらを実行

[Guid]::NewGuid()

WEBサービスから生成

こちらはOSに関係なく利用可能です。
https://www.uuidgenerator.net/

version1とversion4がありますが、方式が異なるだけです。どちらで生成しても良いと思います。

参考にさせていただいたサイト

以上、UUID詳細でした。