Types
BleDevice = ref BleDeviceObj
BleDeviceObj = object peer*: PeerAddr peerAddrStr*: string name*: Option[string] rssi*: int8 advertiseData*: string manufacturerData*: Option[string] seenTime*: Time
BleNim = ref BleNimObj
CCC {.pure, size: 2.} = enum Disable = 0, Notify = 1, Indicate = 2
CharaUuid {.pure.} = enum DeviceName = "2a00", Appearance = "2a01", DateTime = "2a08", BatteryLevel = "2a19", ModelNumber = "2a24", SerialNumber = "2a25", FirmwareRevision = "2a26", HardwareRevision = "2a27", SoftwareRevision = "2a28", ManufactureName = "2a29", SystemId = "2a23", RegCert = "2a2a"
Gatt = ref GattObj
Procs
proc addDeviceToWhiteList(self: BleNim; deviceAddr: string): Future[bool] {. ...stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc allDevices(self: BleNim): seq[BleDevice] {....raises: [], tags: [], forbids: [].}
- アドバタイジング情報を受信したペリフェラル情報の一覧を取得する
proc clearWhiteList(self: BleNim): Future[bool] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc disconnect(self: Gatt; unpair = false): owned(Future[void]) {. ...stackTrace: false, raises: [Exception], tags: [RootEffect, TimeEffect], forbids: [].}
-
接続されている GATT 接続の切断を行う。
- unpair: 同時にペアリング情報の消去を行う。
proc discoverCharacteristicsByUuid(self: Gatt; uuid: Uuid): Future[ Result[GattCharacteristicsOfService, ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc findDeviceByAddr(self: BleNim; peer: string): Option[BleDevice] {. ...raises: [], tags: [], forbids: [].}
-
アドバタイジング情報を受信したペリフェラルを Bluetooth アドレスで検索する。
アドレスの形式は "aa:bb:cc:dd:ee:ff" とする。
proc findDeviceByName(self: BleNim; name: string): Option[BleDevice] {. ...raises: [], tags: [], forbids: [].}
- アドバタイジング情報を受信したペリフェラルを名前で検索する
proc getAllRemoteCollectionKeys(self: BleNim): seq[RemoteCollectionKeys] {. ...raises: [], tags: [], forbids: [].}
-
ペアリング済みデバイスの情報を一括で取得する。
次回起動時にペアリング情報を復旧させるためにはこれを保存しておく必要がある。
proc getWhiteListSize(self: BleNim): Future[int] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc isConnected(self: Gatt): bool {....raises: [], tags: [], forbids: [].}
proc newBleNim(path: string = socketPath; port: uint16 = 0; debug = false; debug_stack = false; mode: SecurityMode = SecurityMode.Level2; iocap: IoCap = IoCap.NoInputNoOutput; initialize = false): BleNim {. ...raises: [ValueError, Exception, OSError], tags: [TimeEffect, RootEffect], forbids: [].}
-
BleNim インスタンスの初期化
- path: btmd が listen している Unix Domain Socket PATH
- port: localhost の TCP 経由で通信する場合の btmd の listen port(0 以外の場合)
- mode: LE Sucurity Mode
- SecurityMode.NoAuth: (No authentication and no encryption)
- SecurityMode.Level2: (LE Security Mode 1 Level 2)
- SecurityMode.Level4: (LE Security Mode 1 Level 4)
- iocap: ローカルデバイスの IO Capabilities
- IoCap.DisplayOnly
- IoCap.DisplayYesNo
- IoCap.KeyboardOnly
- IoCap.NoInputNoOutput: MA-S120/LB では実質的にこれのみ
- IoCap.KeyboardDisplay
- initialize: 初期化処理(BleNim::init() も一緒に実行するかどうか)
proc readGattChar(self: Gatt; handle: uint16): Future[ Result[seq[uint8], ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- キャラクタリスティック値を読み取る (ハンドル指定)
proc readGattChar(self: Gatt; uuid: CharaUuid): Future[ Result[HandleValue, ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc readGattChar(self: Gatt; uuid: string): Future[ Result[HandleValue, ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- キャラクタリスティック値を読み取る (UUID 指定)
proc readGattDescriptor(self: Gatt; handle: uint16): Future[ Result[seq[uint8], ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- ディスクリプタ値を読み取る (ハンドル指定)
proc removeDeviceFromWhiteList(self: BleNim; deviceAddr: string): Future[bool] {. ...stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc removeRemoteCollectionKeys(self: BleNim; peer: PeerAddr): Future[bool] {. ...stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- ペアリング済みデバイスの情報を削除する。
proc restartScan(self: BleNim): Future[bool] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc setAllRemoteCollectionKeys(self: BleNim; allKeys: seq[RemoteCollectionKeys]): Future[ int] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- Central として動作する際の 全 Peripheral の各種暗号化鍵を一括登録する。
proc setAllRemoteCollectionKeys(self: BleNim; allKeysJson: JsonNode): Future[int] {. ...stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- 上の関数と機能は同じだが、seq[RemoteCollectionKeys] を JSON 化した JsonNode 形式を引数にする。
proc setRemoteCollectionKeys(self: BleNim; keys: RemoteCollectionKeys): Future[ bool] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- Central として動作する際の Peripheral の各種暗号化鍵を登録する。
proc setRemoteCollectionKeys(self: BleNim; keysJson: JsonNode): Future[bool] {. ...stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- 上の関数と機能は同じだが、RemoteCollectionKeys を JSON 化した JsonNode 形式を引数にする。
proc startStopScan(self: BleNim; active: bool; enable: bool; scanInterval: uint16 = 0; scanWindow: uint16 = 0; filterDuplicates = true; filterPolicy = ScanFilterPolicy.AcceptAllExceptDirected): Future[ bool] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
-
Scan の有効・無効を設定する。 scanInterval, scanWindow 両方が 0 の場合、以前設定された値を変更しない。
- active: Active Scan/Passive Scan
- enable: Scan 有効/無効
- scanInterval: Scan 間隔: 0x0004〜0x4000, 0.625ms単位、2.5ms〜10240ms
- scanWindow: 1回の Scan あたりの継続時間: 0x0004〜0x4000, 0.625ms単位、2.5ms〜10240ms
- filterDuplicates: Duplicate filtering 有効/無効 切り替え
- filterPolicy: Advertising Packet を受け付ける際のポリシー設定
- ScanFilterPolicy.AcceptAllExceptDirected
- ScanFilterPolicy.WhitelistOnly
- ScanFilterPolicy.AcceptAllExceptNotDirected
- ScanFilterPolicy.AcceptAllExceptWhitelistAndNotDirected
proc waitDevice(self: BleNim; devices: seq[string] = @[]; timeout: int = 0): Future[ Result[BleDevice, ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
-
指定したデバイスのアドバタイジングを受信するまで待機する。
- devices: 対象デバイス指定、空の場合はデバイスを限定しない
- timeout: ms 単位で指定。0 の場合はタイムアウトしない。
proc waitEncryptionComplete(self: Gatt): Future[Result[bool, ErrorCode]] {. ...stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect], forbids: [].}
- GATT 接続後即ペアリング要求を送ってくるペリフェラルとの間での ペアリング処理が完了するまで待機する。
proc waitNotification(self: Gatt; timeout = 0): Future[ Result[HandleValue, ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- Notification/Indication を受信する。
proc writeGattChar(self: Gatt; handle: uint16; value: seq[uint8 | char] | string; withResponse = true): Future[ Result[bool, ErrorCode]] {....stackTrace: false.}
- キャラクタリスティック値を書き込む (ハンドル指定)
proc writeGattChar(self: Gatt; handle: uint16; value: uint16 | uint8; withResponse = true): Future[Result[bool, ErrorCode]] {. ...stackTrace: false.}
proc writeGattDescriptor(self: Gatt; handle: uint16; desc: CCC): Future[ Result[bool, ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
proc writeGattDescriptor(self: Gatt; handle: uint16; desc: uint16): Future[ Result[bool, ErrorCode]] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect, TimeEffect], forbids: [].}
- ディスクリプタ値を書き込む (ハンドル指定)
Iterators
iterator devicesInWhiteList(self: BleNim): PeerAddr {....raises: [], tags: [], forbids: [].}