2015年12月4日金曜日

AllJoyn 触ってみた

概要

Alljoyn はスマホやデバイス間同士の近傍 P2P を実現するための規格です
元は Qualcomm がオープンソースとして公開した規格で現在は Linux Foundation の AllSeen Alliance という会社が仕切っているようです
今回は導入として iPhone 上で動作する AllJoyn のサンプルアプリを動作させるところまでやってみました

環境

  • Mac OS X 10.10.5
  • Xcode 7.1.1
  • OpenSSL 1_0_2d
  • Alljoyn 14.12.00
  • iPhone 5 ( iOS 7.0.2 )

SDK をビルドする

SDK はサイトからほいとダウンロードしていきなり使える感じではありません
自分でビルドして、できたスタティックライブラリを使っていきます

サイトから SDK をダウンロードする

まずはビルド元になる SDK をダウンロードします
https://allseenalliance.org/framework/download

ここから以下 5 つの iOS 用の zip をダウンロードしてください

  • Core SDK (alljoyn-14.12.00b-osx_ios-sdk.zip)
  • Onboarding SDK (alljoyn-onboarding-service-framework-14.12.00-ios-sdk-rel.zip)
  • Configuration SDK (alljoyn-config-service-framework-14.12.00-ios-sdk-rel.zip)
  • Notification SDK (alljoyn-notification-service-framework-14.12.00-ios-sdk-rel.zip)
  • Control Panel SDK (alljoyn-controlpanel-service-framework-14.12.00-ios-sdk-rel.zip)

ダウンロードが完了したら解凍して適切なパスに配置していきます

  • mkdir -p ~/work_alljoyn
  • cd ~/work_alljoyn
  • mkdir -p alljoyn-ios/core
  • unzip alljoyn-14.12.00b-osx_ios-sdk.zip
  • mv alljoyn-14.12.00b-osx_ios-sdk alljoyn-ios/core/alljoyn
  • unzip alljoyn-config-service-framework-14.12.00-ios-sdk-rel.zip
  • unzip alljoyn-controlpanel-service-framework-14.12.00-ios-sdk-rel.zip
  • unzip alljoyn-notification-service-framework-14.12.00-ios-sdk-rel.zip
  • unzip alljoyn-onboarding-service-framework-14.12.00-ios-sdk-rel.zip
  • pushd alljoyn-ios/

とりあえず問題なく解凍できればここは OK です
初めの work_alljoyn はお好きな名前で大丈夫です

openssl を使って SDK をビルドする

次に解凍した SDK を openssl を使ってビルドします
作業パスは前のコマンドのパスを引き継いでいる想定なので cd とかで移動しないでください

  • git clone git://git.openssl.org/openssl.git
  • git clone https://github.com/sqlcipher/openssl-xcode.git
  • cp -r openssl-xcode/openssl.xcodeproj openssl
  • pushd openssl
  • git checkout tags/OpenSSL_1_0_2d
  • sed -ie 's/\(ONLY_ACTIVE_ARCH.*\)YES/\1NO/' * openssl.xcodeproj/project.pbxproj
  • xcodebuild -configuration Release -sdk iphonesimulator
  • xcodebuild -configuration Release -sdk iphoneos
  • xcodebuild -configuration Release
  • xcodebuild -configuration Debug -sdk iphonesimulator
  • xcodebuild -configuration Debug -sdk iphoneos
  • xcodebuild -configuration Debug

ビルド時間は全部で 20 分くらいかかると思います
すべてビルドが問題なく完了すれば OK です

ビルドおよび Xcode で開発するための環境変数を設定します

ビルドが完了したら環境変数を設定します
ここで設定した環境変数は再起動するとなくなるので、必要な場合は Mac 自体に環境変数を設定してください
ここも作業パスは引き継いでいる想定なので移動せずそのまま作業してください

  • sudo launchctl setenv OPENSSL_ROOT `pwd`
  • export OPENSSL_ROOT=`launchctl getenv OPENSSL_ROOT`
  • popd
  • popd
  • cd alljoyn-ios
  • sudo launchctl setenv ALLJOYN_SDK_ROOT `pwd`
  • export ALLJOYN_SDK_ROOT=`launchctl getenv ALLJOYN_SDK_ROOT`
  • cd services
  • sudo launchctl setenv ALLSEEN_BASE_SERVICES_ROOT `pwd`
  • export ALLSEEN_BASE_SERVICES_ROOT=`launchctl getenv ALLSEEN_BASE_SERVICES_ROOT`

必要なスタティックライブラリを一箇所にコピーする

このあと Xcode でスタティックライブラリ (xxx.a のファイル) を参照するライブラリとして使うのですが、いろいろな場所にあり追加が面倒なので、一箇所にコピーします

結構あるのでコマンド長いです

  • DIST_PATH=”core/alljoyn/build/darwin/armv7/iphoneos/debug/dist/cpp”
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-config-14.12.00-rel/cpp/lib/liballjoyn_services_common_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_config_services_common_cpp.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-controlpanel-14.12.00-rel/cpp/lib/liballjoyn_services_common_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_controlpanel_services_common_cpp.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-notification-14.12.00-rel/cpp/lib/liballjoyn_services_common_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_notification_services_common_cpp.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-onboarding-14.12.00-rel/cpp/lib/liballjoyn_services_common_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_onboarding_services_common_cpp.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-config-14.12.00-rel/objc/lib/liballjoyn_services_common_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_config_services_common_objc.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-controlpanel-14.12.00-rel/objc/lib/liballjoyn_services_common_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_controlpanel_services_common_objc.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-notification-14.12.00-rel/objc/lib/liballjoyn_services_common_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_notification_services_common_objc.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-onboarding-14.12.00-rel/objc/lib/liballjoyn_services_common_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_onboarding_services_common_objc.a
  • cp $ALLJOYN_SDK_ROOT/core/alljoyn/build/darwin/arm/iphoneos/debug/dist/about/lib/liballjoyn_about_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_debug_about_cpp.a
  • cp $ALLJOYN_SDK_ROOT/core/alljoyn/build/darwin/arm/iphoneos/release/dist/about/lib/liballjoyn_about_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_release_about_cpp.a
  • cp $ALLJOYN_SDK_ROOT/core/alljoyn/build/darwin/arm/iphoneos/debug/dist/about/lib/liballjoyn_about_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_debug_about_objc.a
  • cp $ALLJOYN_SDK_ROOT/core/alljoyn/build/darwin/arm/iphoneos/release/dist/about/lib/liballjoyn_about_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/liballjoyn_release_about_objc.a
  • cp $ALLJOYN_SDK_ROOT/core/alljoyn/build/darwin/arm/iphoneos/debug/dist/about/lib/libAllJoynFramework_iOS.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/libAllJoynFramework_iOS_debug.a
  • cp $ALLJOYN_SDK_ROOT/core/alljoyn/build/darwin/arm/iphoneos/release/dist/about/lib/libAllJoynFramework_iOS.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/libAllJoynFramework_iOS_release.a
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-config-14.12.00-rel/cpp/lib/liballjoyn_config_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-config-14.12.00-rel/objc/lib/liballjoyn_config_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-controlpanel-14.12.00-rel/cpp/lib/liballjoyn_controlpanel_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-controlpanel-14.12.00-rel/objc/lib/liballjoyn_controlpanel_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-notification-14.12.00-rel/cpp/lib/liballjoyn_notification_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-notification-14.12.00-rel/objc/lib/liballjoyn_notification_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-onboarding-14.12.00-rel/cpp/lib/liballjoyn_onboarding_cpp.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/
  • cp $ALLJOYN_SDK_ROOT/services/alljoyn-onboarding-14.12.00-rel/objc/lib/liballjoyn_onboarding_objc.a $ALLJOYN_SDK_ROOT/$DIST_PATH/lib/

これをやることで Xcode 上で Search Paths を設定するのも少し楽になります
この DIST_PATH はサンプルアプリを開いた時にデフォルトで Search Paths の対象になっています

Xcode の起動

今回 Xcode の起動方法も少しポイントです
環境変数をターミナルで設定している関係で Xcode の起動は環境変数を設定したターミナル上から起動してください

  • open -a xcode

でないと環境変数が xcode にわたらずビルドでエラーになります

Xcode でサンプルアプリを開く

今回開くサンプルアプリはチャットアプリを開きます

$ALLJOYN_SDK_ROOT/core/alljoyn/alljoyn_objc/samples/iOS/AllJoynChat/AllJoynChat.xcodeproj

上記を開きましょう

プロジェクトの設定をする

開いたらプロジェクトの設定を変更します
プロジェクトを選択し

Targets -> AlljoynChat -> Building Settings -> All

と選択して以下を設定していきます

  • Architectures -> Architectures -> Standard architectures (armv7, armv7s) を選択
  • Architectures -> Build Active Architecture only -> Yes を選択
  • Linking -> Other Linker Flags -> -lalljoyn -lajrouter -lBundledRouter.o -lssl -lcrypto を選択
  • Search Paths -> Header Search Paths -> + -> "$(ALLJOYN_SDK_ROOT)/core/alljoyn/build/darwin/arm/$(PLATFORM_NAME)/$(CONFIGURATION)/dist/cpp/inc""$(ALLJOYN_SDK_ROOT)/core/alljoyn/alljoyn_objc/AllJoynFramework/AllJoynFramework/" を追加
  • Search Paths -> Library Search Paths -> + -> "$(ALLJOYN_SDK_ROOT)/core/alljoyn/build/darwin/$(CURRENT_ARCH)/$(PLATFORM_NAME)/$(CONFIGURATION)/dist/cpp/lib""$(OPENSSL_ROOT)/build/$(CONFIGURATION)-$(PLATFORM_NAME)" を追加
  • Apple LLVM 7.0 - Language - C++ -> Enable C++ Exceptions -> No
  • Apple LLVM 7.0 - Language - C++ -> Enable C++ Runtime Types -> No
  • Apple LLVM 7.0 - Language - C++ -> C++ Language Dialect -> Compiler Default
  • Apple LLVM 7.0 - Custom Compiler Flags -> Other C Flags -> Debug -> -DQCC_OS_GROUP_POSIX -DQCC_OS_DARWIN を入力
  • Apple LLVM 7.0 - Custom Compiler Flags -> Other C Flags -> Release -> -DNS_BLOCK_ASSERTIONS=1 -DQCC_OS_GROUP_POSIX -DQCC_OS_DARWIN
  • Apple LLVM 7.0 - Language -> C Language Dialect -> Compiler Default
  • Apple LLVM 7.0 - Language -> Compile Sources As -> Objective-C++

次に

Targets -> AlljoynChat -> Building Phases

と選択して以下を設定していきます

  • Link Binary With Libraries -> + -> で以下のライブラリを追加

    • SystemConfiguration.framework
    • libstdc++.6.0.9.tdb
    • libstdc++.6.tdb
    • libstdc++.tdb
  • Link Binary With Libraries -> + -> Add Other で先ほどコピーしたスタティックライブラリを全部追加

で Xcode 上での設定は完了です
設定から完了したら iPhone 5 を USB で接続して Xcode で実機ビルドをする準備をしましょう

サンプルアプリを動作させる

では実機を接続してビルドしましょう
おそらく特に問題なくビルドできてアプリが起動すると思います
起動するとチャットアプリが立ち上がります
※起動するチャットアプリのイメージはこちら

このチャットアプリは join モードと host モードがあり、join モードの場合は同一ネットワーク上に存在する host モードのデバイスを自動で検索してチャットに参加します
host モードの場合は自分がホストになるので、join モードのデバイスが来るまで待ちます

なのでチャット実際に試したい場合は 2 台のデバイスが必要になります

最後に

感想としては「便利だけど、開発が大変そう」というイメージです
サービスへの応用としてはいろいろ考えられて 3DS みたいなすれちがい通信や HEMS に応用して家に帰った ( 家のネットワークに入った ) ら勝手に電気をつけるなんかもできると思います

ただ、今回触ってみて気づいた点ですが、最新バージョンのデバイスや OS に追従ができていなかったので、その辺の対応速度が遅いとなるとちょっと実用面では厳しいような気もします

あとは今回は実際に SDK を使って AllJoyn アプリを開発していないので開発の難易度や他の SDK とのシナジーなんかもどれくらいあるのかわかっていません

トラブルシューティング

  • iOS9 には対応していません

  • iPhone 6 以上のデバイスにも対応していません
    正確に言うと arm64 のアーキテクチャに対応していません

  • 今回の手順の場合は実機の iPhone 5 ( iOS7 ) でしかおそらく動作しません
    上記のアーキテクチャ問題にも絡んでくるのですが、この AllJoyn のサンプルは環境変数で読み込むライブラリが変わってくるためシミュレータや armv7 以外のアーキテクチャの iPhone だと動作しません
    もう少し話をすると、Xcode 上で設定した Search Paths 上で PLATFORM_NAME や CURRENT_ARCH などの環境変数を使っており、これがデバイスやシミュレータごとに異なるためライブラリを見つけれれずビルドを実行すると
    ld: library not found for -lalljoyn_config_cpp
    みたいな感じでエラーになります

  • コピーするスタティックライブラリや Search Paths を変えればシミュレータでも動作すると思います
    上記の問題を逆に考えるとシミュレータで動作する場合の環境変数がわかり、それを Search Paths と Link Binary With Libraries に追加すれば、シミュレータでも動作すると思います

  • Xcode7 で bit code のエラーが出た場合
    http://qiita.com/satoshi_imanishi/items/8b64af8262d7fe2eb2ba で対応してください

参考サイト

0 件のコメント:

コメントを投稿