その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

konashiをSDKなしで使う

konashiは親切にもドキュメントでサービス(Service)やキャラクタリスティック(Characteristic)の仕様を公開してくれているので、


オフィシャルに提供されている iOS SDK を使わなくても、Core Bluetoothから直接接続・通信することが可能です。


konashi
konashi
posted with amazlet at 14.02.04
スイッチサイエンス
売り上げランキング: 17,884


konashi の SDK は Core Bluetooth の薄いラッパーなので、全然SDKを使うことによる不自由は感じないのですが、この方法を試しておくことで、他のBLEデバイスも、必要な情報が公開されてさえいればSDKなしで接続できることがわかるようになるというメリットがあるかと思います。

やり方

すごくシンプルです。まず、普通に2台のiOSデバイス間で接続・通信できるようにCore Bluetoothでつくっておいて、あとは


セントラル(iOSアプリ)からペリフェラル(konashi)を探す際に、ServiceのUUIDとして "0xFF00" を使う


だけ。


ただし、genuuidコマンドから生成したUUIDのように、文字列からのCBUUIDオブジェクト生成

CBUUID *uuid = [CBUUID UUIDWithString:@"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"];

だけですが、

konashiのように16進数のUUIDからCBUUIDオブジェクトを生成する場合は、次のようにします。

UInt16 temp = uuid16 << 8;
temp |= (uuid16 >> 8);

NSData *data = [[NSData alloc] initWithBytes:(char *)&temp length:2];
CBUUID *uuid = [CBUUID UUIDWithData:data];


あとは、 scanForPeripheralsWithServices:options: するときにこのサービスを指定するもよし、centralManager:didDiscoverPeripheral:advertisementData:RSSI: が呼ばれたときにこのサービスを提供しているかどうかを判定するもよし、です。

konashiのcharacteristic

キャラクタリスティックはkonashiとやりとりする情報の種類ごとに定義されています。

// PIO
#define KONASHI_PIO_SETTING_UUID                                0x3000
#define KONASHI_PIO_PULLUP_UUID                                 0x3001
#define KONASHI_PIO_OUTPUT_UUID                                 0x3002
#define KONASHI_PIO_INPUT_NOTIFICATION_UUID                     0x3003
#define KONASHI_PIO_INPUT_NOTIFICATION_READ_LEN                 1

// PWM
#define KONASHI_PWM_CONFIG_UUID                                 0x3004
#define KONASHI_PWM_PARAM_UUID                                  0x3005
#define KONASHI_PWM_DUTY_UUID                                   0x3006

// Analog
#define KONASHI_ANALOG_DRIVE_UUID                               0x3007
#define KONASHI_ANALOG_READ0_UUID                               0x3008
#define KONASHI_ANALOG_READ1_UUID                               0x3009
#define KONASHI_ANALOG_READ2_UUID                               0x300A
#define KONASHI_ANALOG_READ_LEN                                 2

// I2C
#define KONASHI_I2C_CONFIG_UUID                                 0x300B
#define KONASHI_I2C_START_STOP_UUID                             0x300C
#define KONASHI_I2C_WRITE_UUID                                  0x300D
#define KONASHI_I2C_READ_PARAM_UIUD                             0x300E
#define KONASHI_I2C_READ_UUID                                   0x300F

// UART
#define KONASHI_UART_CONFIG_UUID                                0x3010
#define KONASHI_UART_BAUDRATE_UUID                              0x3011
#define KONASHI_UART_TX_UUID                                    0x3012
#define KONASHI_UART_RX_NOTIFICATION_UUID                       0x3013
#define KONASHI_UART_RX_NOTIFICATION_READ_LEN                   1

// Hardware
#define KONASHI_HARDWARE_RESET_UUID                             0x3014
#define KONASHI_HARDWARE_LOW_BAT_NOTIFICATION_UUID              0x3015
#define KONASHI_HARDWARE_LOW_BAT_NOTIFICATION_READ_LEN          1


たとえばiOSアプリとkonashiを接続した状態でkonashiのスイッチを押すと、

KONASHI_PIO_INPUT_NOTIFICATION_UUID	0x3003

と定義されているキャラクタリスティックが peripheral:didUpdateValueForCharacteristic:error: で観測されます。

参考情報

konashi iOS SDKはソースがまるっと公開されているので、直接実装する場合に参考になります。

※iOSと連携するデバイスのSDKは、だいたいビルド済みの静的ライブラリしか提供されてない場合が多い


konashiって何?という方、もしくはkonashiのiOS SDKを使った連携方法を知りたい方は下記記事をご参照ください。


サービスとかキャラクタリスティックって何?という方はこちらを。


konashiは最近はAmazonでも購入できるようです。

konashi
konashi
posted with amazlet at 14.02.04
スイッチサイエンス
売り上げランキング: 17,884