Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2014-09-30

【勉強会資料】BLEとは何か/BLEの実例

昨日、都内のとある企業のクローズドな勉強会で、Bluetooth Low Energy (以降、BLE) 関連の話をしてきました。


僕に直接声がかかったわけではなく、知り合いのエンジニアが IoT について講義を任され、その方からBLEまわりについて話してくれないか、という間接的な依頼だったのと、僕自身あまり IoT というキーワードをそれほど意識していないこともあり、会の趣旨やニーズに合致していたのか謎ですが、とにかく自分のやってきた BLE 関連の実例紹介と、ざっくりBLEとは何か、というあたりについて話しました。


参加者の層としては管理職、プロデューサー、企画の方が多い印象だったので、GATT等の技術的に踏み込んだ話ではなく、BLEの特徴が把握できるようなポイントだけにとどめています。


会自体はクローズド(社内向け)だったのですが、僕が話した内容はとくに秘密とかはないので、以下に資料を公開します。(一部編集済み)


自己紹介

  • 堤 修一(つつみ しゅういち)
  • フリーランスiOSエンジニア

経歴

  • 京都大学 工学部 電気電子工学科 / 京都大学大学院 情報学研究科(1997〜2003)
  • NTTデータ 音声処理 の研究開発(2003〜2007)
  • キヤノン 複合機の 画像処理 開発(2007〜2009)
  • カヤック iOSアプリ プログラマ(2010〜2012)
  • シリコンバレーのスタートアップに参画(2013)
    • Y combinatorと並ぶシードアクセラレータの名門、500 startups に採択
  • 独立(2014)

実績(IoT関連以外)

iOSアプリ

開発実績30本以上

  • バウンドモンスターズ(200万ダウンロード、売り上げ 数億円)
  • タップ忍者(App Store Best of 2012)
  • Domino's App (Canne Lions 2011)
オープンソース活動

GitHubで世界ランキング1位*1になったリポジトリを3つ保有

  • iOS7-Sampler (2013)・・・iBeacon等
  • iOS8-Sampler (2014)・・・HealthKit, HomeKit等

https://github.com/shu223


執筆

f:id:shu223:20140930104433j:image

  • ブログ「Over&Out その後」
  • gihyo.jpでの連載「iOSアプリと連携させて使えるデバイスたち」
  • iBeaconの講演@ワイヤレスセミナー

IoT関連実績

  • 国内では(おそらく)初の、実店舗へのiBeacon導入
    • iBeaconで入店管理
    • アプリから注文、店員呼び出し
    • 客単価20%アップ
  • BLE(詳細後述)
    • 次世代パーソナルモビリティ「WHILL」
    • ウェアラブルおもちゃ「Moff」
    • 耳の聴こえないダンサーに音楽を感じて踊ってもらうプロジェクト「music for the deaf」

本日の内容

  • BLEとは
  • BLE事例1: Moff
  • BLE事例2: WHILL
  • BLE事例3: music for the deaf
  • BLEとiBeacon

BLEとは

「2.4GHz の無線を使った近距離無線通信規格」

ポイント
  • 無線
  • 超低消費電力
    • ボタン電池1個で数年動作可能
  • 従来のBluetooth(〜3.0)とは別モノ
    • 両対応した4.0は「デュアルモード」と呼ばれる
  • 通信距離はチップごとに違うが、だいたい5〜10mぐらい
  • 通信速度は低い
    • 通信していないときの消費電力を極力下げることで消費電力を抑えることに特化した規格
    • 心拍センサーのように、常時データをやり取りする必要がなく、1回のデータ量も少ない用途に向いている
    • 音楽を流しっぱなしにするような用途にはクラッシックBluetooth
iOS と BLE

フレームワークが開発者に解放 されているため、対応アプリを自由に開発できる。

  • 従来Bluetooth対応デバイス/アプリの開発にはMFi(Made for iPhone)というライセンスプログラムへの加入が必要だった
  • バックグラウンドでの接続も可能
  • iOS7以上をサポートする多くの iOS デバイスで利用可(iPhoneでいうと4s以降)

BLE事例1: ウェアラブルなおもちゃ『Moff』

腕に巻くバンド型ガジェット。腕の動きに合わせてアプリから音がでる



MoffにおけるBLE
  • バンド内のセンサから得られる情報を、スマホアプリにBLE経由で送信 → スマホ側で処理してジェスチャ認識
  • コアの処理機能やコンテンツはアプリ側に持たせているため、コンテンツの拡充が容易
    • 刀、銃、ボクシング、ドラム演奏など、コンテンツは現段階で10種類以上
    • 追加コンテンツは ダウンロード配信 される
  • おもちゃに特化しているため、他のBLEガジェットと比較して安い(5000円強)

BLE事例2: 次世代パーソナルモビリティ『WHILL』

f:id:shu223:20140930104709j:image:w500


WHILLアプリのユースケース
  • リモートコントロール
    • ベッドサイドにWHILLを呼び寄せる
    • 介助者が操作する
  • シートのスライドをコントロールできる
    • 乗り降りする際に、シートスライドが必要になる
  • WHILLの内部パラメータを設定できる
    • 前進速度の最大値、最小値、前進加速度の最大値、最小値、前進減速度の最大値、最小値、後進速度の・・・等々、パラメータは18種類に及ぶ
    • デフォルトプロファイルを3種類用意しているが、ユーザーごとに好みのチューニングにしたいというニーズが強い
    • サービスマンが全米を飛び回ってチューニングするとコストが莫大になってしまう
BLE112 Development Kit

f:id:shu223:20140930104801j:image:w400


  • WHILLで使用しているBLE112のチップが載った開発用キット
  • ディスプレイ・USBインターフェース・バッテリーボックス・デバッガ・確認用のセンサ等々、BLEモジュールの開発・検証に必要な諸々がボードにビルトインされている
    • 部品を集めて回路を組んだりしなくても、買ってすぐに BLE モジュールのファームウェア開発を始められる
  • BGScriptという平易なスクリプトでBLEのファームウェア開発ができる
  • GATTプロファイルもxmlで定義できる

関連記事: 【改訂版】BLE112 / 113 の開発環境を Mac に構築する - Over&Out その後


BLE事例3: music for the deaf

耳の聴こえないダンサーに、電気刺激で「音を感じる」ことで踊ってもらう試み


f:id:shu223:20140930104853j:image:w500


  • 真鍋大度氏・石橋素氏・照岡正樹氏との共同プロジェクト
    • ヨコハマ・パラトリエンナーレにて展示/パフォーマンス
    • 「情熱大陸」真鍋大度氏の回で、エンディングで紹介されたプロジェクト
  • 音楽に合わせて電気を流すアプリ・デバイス
    • 従来品は有線
    • →「ポータブル化」するため、BLE & スマホを用いることになった
(パラトリでの実演動画)
konashi

BLEのファームウェアの知識なしでBLEデバイスをプロトタイピング するためのツールキット

f:id:shu223:20140930104952p:image:w200


電気刺激デバイス ⇔ (シリアル通信) ⇔ konashi ⇔ (BLE) ⇔ iPhone


BLEとiBeacon

  • iBeaconは、BLEの仕様を縮退させたもの
    • アドバタイジングだけを行なうのが「ビーコン」
    • アドバタイジングだけしか行なわないので 安価、長寿命
  • Core Bluetoothではなく、Core Location フレームワークに統合されている
    • 地図や位置情報系の処理と統合しやすい
    • BLE/CoreBluetoothの知識がない開発者にもとっつきやすい
    • iOS 8 ではホームスクリーンに対応アプリが表示されるように

f:id:shu223:20140930105015j:image:w280

(Core Location で領域検出(iBeaconとは限らない)されると、対応アプリが表示される)


質疑応答

このあと質疑応答があったのですが、いくつかFAQなものもあったので、また後ほど追記します。


関連記事


*1:GitHub Trendingにて

2014-09-18

iOS 8 の新機能のサンプルコード集『iOS8-Sampler』を公開しました

WWDCでのアップルの発表によると、iOS 8 では4000以上もの API が追加されたとのことですが、新しいAPIはどう使うのか、実際に何がどこまでできるのか、といった具体的なところが、英語のドキュメントや動画をながめているだけだと正直あまりよくわかりません。やはり実際にコード書いて動かしてみるのが一番わかりやすい、ということで今年もつくりました、


iOS 8 新機能のサンプルコード寄せ集めアプリ『iOS8-Sampler』




ソースコードは GitHub に置いてあります。


https://github.com/shu223/iOS8-Sampler


※使い方は Xcode 6 でビルドするだけ なので、デザイナーさんやディレクターさんもぜひ最寄りのエンジニアにビルドしてもらってください。


中身について

今回はデザイナー okazu 氏の協力により立派なアイコンやスプラッシュ画像が最初から用意されていますが、中身は何のことはない、iOS 7 のときと同様のテーブルビューです。(※ここで凝るとサンプル追加が大変になる)



今のところ24個のサンプルが入っています。何か調べた折に随時追加していきます。機能追加プルリク大歓迎です!


以下サンプルのリストです。


Audio Effects

iOS の Core Audio においてもっとも低レイヤに位置し、リアルタイムで高度なオーディオ波形処理や、複雑なルーティングによるオーディオ処理を実現することができる Audio Unit というのが従来からあったのですが、これらは AVFoundation 等に比べると少々複雑で、しかもAPIがC言語タイプなので、自分のようなゆとりiOSエンジニアには少しハードルが高い部分がありました。

iOS 8 で追加された AVAudioEngine は、Audio Unit の Objective-C ラッパー的な存在で、上記のAudio Unitのハードルの高さを解消してくれています。


ギターのエフェクターのようにユニットを繋げる楽しさも健在で、本サンプルでは、ディストーションとか、ディレイといったエフェクトを音にかける実装方法を提示しています。使用している新クラスは AVAudioEngine, AVAudioUnitDistortion, AVAudioUnitDelay, AVAudioPlayerNode, AVAudioFile 等々。


New Image Filters

Core Image の CIFilter に追加された新しいフィルタ集。iOS 8 の Built-in フィルタは127種類あるのですが、新たに追加されたのは13種類 *1 で、本サンプルでは以下の6種類が試せるようになっています。

  • CIGlassDistortion
  • CIDivideBlendMode
  • CILinearBurnBlendMode
  • CILinearDodgeBlendMode
  • CIPinLightBlendMode
  • CISubtractBlendMode


関連記事:


Custom Filters

iOS 8 では CIKernel というクラスが追加され、Core Image のフィルタ(CIFilter)を自作できるようになりました。


これを用いたシンプルなフィルタの作成手順を以前記事に書きましたが、


本サンプルでは、この CIKernel を用いたサンプルを4種類、実装してあります *2



Metal Basic

Metal を使ったシンプルな描画サンプルです。Apple公式サンプルの "MetalBasic3D" をベースに作成。



Metal Uniform Streaming

Metal のサンプルその2。同名のApple公式サンプルをベースに作成。



SceneKit

Mac には以前からあり、iOS には 8 で初めて追加された SceneKit のサンプル。Appleのサンプルがどれも最初の一歩目にはややこしいと感じたので、アイコン画像を3D空間に置いてライティングするだけのシンプルなサンプルです。



HealthKit

iOS 8 の注目の新機能の1つ、HealthKit のサンプル。HealthKitで利用可能なデータ全種類を読み出すことができます。



が、データがないと始まらないので、まずはオフィシャルの Health アプリをいろいろ使ってみてデータを作成してください。


あと、プロビジョニングプロファイルの件も忘れずに。。


TouchID

指紋認証のデモ。iPhone5sなど、対応デバイスでお試しください。 LocalAuthentication フレームワークを使用。



Touch Radius

UITouch の新プロパティ `majorRadius` を使用し、タッチの強さ(半径)を可視化するサンプル。



参考記事:


Visual Effects

UIView にブラーエフェクトをかけられる、すなわちあの「磨りガラス効果」を実現するための新クラス、UIBlurEffect と UIVibrancyEffect のサンプルです。



Table Separator Effect

UITableView に追加された `separatorEffect` プロパティのサンプル。セパレータにエフェクト (UIVisualEffect)をかけられます。



Ruby Annotation

Core Text に追加された CTRubyAnnotationRef を用いて、文字列にルビ(ふりがな)を付けて描画するサンプル。



クラスメソッドさんの記事を参考にさせていただきました!


WebKit

WKWebView のサンプル。ロード中のプログレスがとれるようになったので、それを SVProgressHUD に反映して表示しています。



UIAlertController

UIAlertController を用いた Alert と ActionSheet のサンプル。



User Notification

Schedule a local notification which has custom actions using UIUserNotificationSettings.



Altimeter

新たに追加された CMAltimeter クラスを使って相対的な高度と気圧を取得するサンプル。要 M8 コプロセッサ、ということで2014年9月現在、iPhone 6 または iPhone 6 Plus でのみ動作します。



参考記事:


Pedometer

新たに追加された CMPedometer クラスを使って歩数情報を取得するサンプル。



AVKit

新たに追加された AVKit framework の AVPlayerViewController を使って動画をストリーミング再生するサンプル。


Histogram

Core Image の CIFilter に新たに追加された CIAreaHistogram と CIHistogramDisplayFilter を使用して画像のヒストグラムを計算、表示するサンプル。



Code Generator

2次元コード(AztecCode)と 128規格のバーコードを生成するサンプル。Core Image の CIFilter に新たに追加された CIAztecCodeGenerator と CICode128BarcodeGenerator を使用。



New Fonts

iOS 8 で追加された 7 種類のフォントのサンプル。

  • AppleSDGothicNeo-UltraLight
  • KohinoorDevanagari-Light
  • KohinoorDevanagari-Medium
  • KohinoorDevanagari-Book
  • DamascusLight
  • LaoSangamMN
  • KhmerSangamMN


ちなみに iOS 7 で追加されたフォント 37 種類のリストはこちら:


Popover

UIPopoverPresentationController のサンプル。



Table Row Action

UITableViewRowAction のサンプル。UITableViewのセルをスワイプして出るメニューのふるまいや見た目をカスタマイズできます。(見た目が地味なのでスクショは省略しました。)


Accordion Fold Transition

CIFilter の CIAccordionFoldTransition を用いたアコーディオンのように折り畳まれるような遷移エフェクト・・・のはずなのですが現状そのように動作していません。GitHub や Google で検索してもまったく先行例がないので、どなたか成功した方、プルリクお待ちしております。。


おわりに

新機能の実装記事もこれからどんどん書いていきます!


以下これまでに書いたもの。


*1:調べたのベータ版の頃なので、ひょっとしたら増えてるかも。。

*2:WWDC2014のスライドを参考に実装

2014-09-17

【Xcode 6】delegateをセットするところで「incompatible type 'id<NSFileManagerDelegate>'」なるwarningが出る件

たとえば下記のように、delegate プロトコルと、それをプロパティに持つクラスを定義し、

@protocol HogeManagerDelegate <NSObject>
@end

@interface HogeManager : NSObject
@property (nonatomic, weak) id<HogeManagerDelegate> delegate;
@end

HogeViewController で下記のように `setDelegate:` するとします。

[[HogeManager sharedManager] setDelegate:self];

で、これを Xcode 6 でビルドすると、

warning: sending 'HogeViewController *const __strong' to parameter of incompatible type 'id<NSFileManagerDelegate>'
    [[HogeManager sharedManager] setDelegate:self];

こんな warning が出てきます。


全然 NSFileManagerDelegate とか関係ない(プロパティにも親クラスにもない、プロジェクトで全く明示的には使ってない)し、Xcode 5 では warning 出てなかったし・・・ということで、当初はスルーしてたのですが、やはり気になるので対処方法を検討してみました。


対処法

+ (id)sharedManager;

となっていたのを、


+ (instancetype)sharedManager;

とすればOKでした。


instancetypeについて

instancetype というのは、

instancetype型は、上で述べたような「レシーバのクラス==返り値オブジェクトのクラス」となることを明示的に示すための、メソッドの返り値にのみ使える型です。

Objective-Cにおけるinstancetype型について | Takebayashi.Asia


ということで、問題のwarningは、明示的に戻り値のオブジェクトのクラスが指定できてないよ、ということを知らせてくれていたわけです。


そういえば、今回の iOS 8 の API diff も、この戻り値 id > instancetypes への変更が盛りだくさんでしたね。。


2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |