目次
日付別メモ
6/14メモ
6/15メモ
6/16メモ
6/17メモ(Win8.1StoreApp)
6/17メモ
6/18メモ
6/20メモ
6/24メモ
7/5メモ
7/7メモ
7/8メモ
7/10メモ
7/15メモ
7/16メモ
7/18メモ
7/22メモ
日付別メモ
6/14メモ
下調べ。
開発チームはココ。
mbed BLE API homepage
使っているハードウェアは、nRF51822 Evaluation Kit。
GAPとGATTに対応。
GATTのサンプルコードは、
BLE_HeartRate
。
BLEDevice,GattService,GattCharacteristicクラス。
静的変数を用意しておき、Characteristicクラスに紐づけておくことで、BLEのCharacteristicと同期される模様。
6/15メモ
ハードウェアが手元に届いた。
mbed HRM1017
mbedオンラインコンパイラのPlatformは、Nordic nRF51822を選択する。
内蔵オシレーター32KHzなので注意。(nRF51822-mKITは、外部32KHz。)
コンパイル結果のHEXファイルをmbedドライブへコピーすれば書き込める。ブラウザから直書きはダメ。一旦、ローカル保存を経由する。
SurfacePro2のペアリングには何も表示されない。
EG Bluetooth Smart Device GATT Profile Checker
でも認識されない。
6/16メモ
mbed HRM1017(BLE_Health_Thermometer_
IRC
) + iPhone(Nordic Toolbox)は、認識できた。
mbed HRM1017(BLE_Health_Thermometer_
IRC
) + Nexus7(Nordic Toolbox)は、認識できず。というか、手元のNexus7はBLE未対応みたい。
BLE喋れるデバイスが、SurfacePro2とTOSHIBA DynabookTabしかない。両方、Win8.1。
なんとかしてWin8.1でBLE喋らせるしか道が無さそう。
Win8.1から、WinストアアプリでBLEできる模様。
BluetoothSIG提供の、ApplicationAcceleratorが使えそう。
GATT違いでダメでした。BLE_Health_Thermometer_IRCは「UUID_HEALTH_THERMOMETER_SERVICE = 0x1809,」で、ApplicationAcceleratorは「HeartRateMeasurement 0x2A37」。
明日、ApplicationAcceleratorのコードを書き換えてみることにしよう。
6/17メモ(Win8.1StoreApp)
GattServiceUuids.HeartRate = “{0000180d-0000-1000-8000-00805f9b34fb}”
Uuidを“180d-0000-0000-…“に変更。→Guidで例外。
GattDeviceService.GetDeviceSelectorFromUuid()をGattDeviceService.GetDeviceSelectorFromShortId(0x180d)に変更。→Not found
恐ろしい
記述
を発見。「Windows 8.1 supports only GATT client mode.」
6/17メモ
mbed HRM1017(BLE_Health_Thermometer_IRC改) + SurfacePro2(BluetoothSmartDeviceGATTProfileChecker)で、接続に成功。
6/18メモ
SHORTENED_LOCAL_NAMEのpayloadが正しいか不安だったので、Bluetooth specificationを確認したところ、長さ情報が無かった。したがって、終端の'\0'が必要と思われる。strlen()に+1が必要。
文字コードがUTF-8だということが分かったので、日本語が表示できるか試してみた。(必要なのか?疑問ではあるが。)
6/20メモ
ペアリング後のデバイス名を指定する方法を模索。
Bluetooth LE的には、Generic Access Service)(0x1800)のDevice Name Characteristic(0x2A00)を表示している。
mbed HRM1017のconstに、Generic Access Serviceが定義されていない。orz
無理にSerivceを登録したものの、思うように動かず。(名前変わらず。Advertisingまでおかしくなった。Winアプリによって、Generic Access Serviceが表示されたりされなかったり。)
Generic Access Serviceを登録しなくても、Winアプリに表示されていた。値はnRF5x。
nRFのライブラリ内で設定しているのか???
行き止まり。Generic Access ServiceはSoftDeviceで提供されているため、変更不可らしい。(
元ネタ
)
Device Information ServiceのManufacturer Nameでもダメ。ダメになると、何故かAdvertisingの名前もダメになる。
6/24メモ
mbedコンパイラでの検索操作が間違ってた。orz
CFG_GAP_LOCAL_NAMEに”nRF5x”が定義されていた。
深堀りすると、nRF51822n::init()→btle_init()→btle_gap_init()→sd_ble_gap_device_name_set()で設定していることが分かった。
こちらに類似情報あり。
How to discover a custom Bluetooth LE device
偶然、
mbed+HRM1017
の情報を発見。「なお mbed版 nRF51822ではライブラリ側に“Generic Access”と“Generic Attribute”が組み込まれているため」という記述がある。←0x1800,0x1801
7/5メモ
6/18メモの「Bluetooth specificationを確認したところ、長さ情報が無かった。」は間違いっぽい。掘り下げ中。vol3,PartB,3 Data Representationあたり。
data element = header field + data field
header field = type descripter + size descripter
type descripterは5bits
size descripterは3bits
The size index is contained in the least significant (loworder) 3 bits of the first byte of the data element header.
というわけで、6/18メモの「Bluetooth specificationを確認したところ、長さ情報が無かった。」は間違い。
以前によくわからなかったUUID。ここに載っていた。vol3,Part F,3,3.2 Basic Concepts。
7/7メモ
WindowsのBluetoothLEアクセス方法を再考。
Bluetooth LEの対応は、Windows8以降。
Windows8以降は、APIがある。SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces,SetupDiGetDeviceInterfaceDetailでサービスを探して、CreateFileでオープン。BluetoothGATTGetServicesやBleGetGattCharacteristicでアクセス。
Windows8.1は、WinRTにクラスが追加されている。Windows.Devices.Bluetooth.GenericAttributeProfile名前空間。
DesktopAppでも、(csprojを編集して)TargetPlatformVersionを8.1にして、Windowsコア参照すれば、WinRTのクラスが使える。
7/8メモ
WinRTクラスを確認。いろいろ難あり。
1.deviceだけの一覧を取得できない。(deviceとserviceの直積が得られる。)
2.serviceからcharacteristicの一覧を取得できない。(Windows Phoneだけは可能?)
特に、2.ができないのは開発時にツラい。
7/10メモ
DeviceInformationを掘り下げた結果、deviceやserviceの一覧取得に成功。
ライブラリ化した。
mjwinble
7/15メモ
WindowsでUUIDを生成したいときは、uuidgen。
7/16メモ
{BLE_
API
_Native_
IRC
}が、128bit UUID Characteristicに対応していないことが判明。{BLE_
API
+nRF51822}で対応している。
がっ! {BLE_
API
+nRF51822}だと、Windowsとのペアリング時にドライバエラーが発生して接続できず。orz
nRF51822のRev.31→33で、ペアリングできなくなっている。
BOND_MANAGERとPSTORAGEが無効になったことが影響している。両方とも有効にしてみたところ、ペアリングできた!
7/18メモ
PSTORAGEだけ有効ではダメ。
BOND_MANAGERを有効にするには、PSTORAGEも有効にする必要がある。(コンパイルエラー)
したがって、両方を有効にすることで、Windows 8.1とペアリング可能に。
NEED_BOND_MANAGERならびにNEED_PSTORAGEをdefineすると有効化できるようにコーディングしてあるように見受けられるが、定義するファイルが不明…。
mbed.orgに、カタコト英語で質問をポスト!
7/22メモ
NEED_BOND_MANAGERとNEED_PSTORAGEの件、
回答
あり。当面はライブラリ書き換えで対応する。
キャッシュ無しreadが4秒周期。vol3, Part C, 12.3 Peripheral Preferred Connection Paramterが作用している模様。
GAPから取得した値はこちら。“9001200300009001” → 500msec, 1000msec, 0, 4000msec.
btle_gap.cppのbtle_gap_init()で初期設定している。値はprojectconfig.hから。
Connection Supervision timeout multiplier(CFG_GAP_CONNECTION_SUPERVISION_TIMEOUT_MS)が4秒。
projectconfig.hを書き換えても、connection parameter変わらない!?Characteristicを読み出して確認。