konashiをSDKなしで使う

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

- [konashi - Documents](http://konashi.ux-xu.com/documents/)


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


<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00FQAGWAG/22301-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51g1aeRp89L._SL160_.jpg" alt="konashi" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00FQAGWAG/22301-22/ref=nosim/" name="amazletlink" target="_blank">konashi</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 14.02.04</div></div><div class="amazlet-detail">スイッチサイエンス <br />売り上げランキング: 17,884<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00FQAGWAG/22301-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>


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


#やり方

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


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


だけ。


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

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

だけですが、

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

````
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はソースがまるっと公開されているので、直接実装する場合に参考になります。

- [YUKAI/konashi-ios-sdk](https://github.com/YUKAI/konashi-ios-sdk)

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


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

- [第1回　「konashi」とiOSアプリを連携させる：iOSアプリと連携させて使えるデバイスたち｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/futuredevice/0001)


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

- [Core Bluetoothのプロファイルについて調べたことのまとめ](http://d.hatena.ne.jp/shu223/20140109/1389216052)


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

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00FQAGWAG/22301-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51g1aeRp89L._SL160_.jpg" alt="konashi" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00FQAGWAG/22301-22/ref=nosim/" name="amazletlink" target="_blank">konashi</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 14.02.04</div></div><div class="amazlet-detail">スイッチサイエンス <br />売り上げランキング: 17,884<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00FQAGWAG/22301-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>


#その他、BLE関連記事

- [iOSのCore Bluetooth / BLEの通信速度](http://d.hatena.ne.jp/shu223/20140110/1389292125)
- [Bluetooth 4.0 および Bluetooth Low Energy (BLE) に関する技術情報のまとめ](http://d.hatena.ne.jp/shu223/20140128/1391063947)
- [Bluetooth Low Energy (BLE) のサービス／キャラクタリクスの構成例一覧](http://d.hatena.ne.jp/shu223/20140129/1391035286)
- [Core Bluetooth / BLEで音声データをやりとりする](http://d.hatena.ne.jp/shu223/20140130/1391033579)