Platiumライブラリを使用したdlnaスクリーン機能の開発
15576 ワード
ここ数日、同社のアプリケーション(iOS端末)に
ここは私が狂捜して、いろいろなブログを見て収集した有用な資料で、リストは以下の通りです.
リンク
説明
Open Connectivity Foundation(OCF)公式サイト
ここにUPnP関連のドキュメントと各社が開発したSDKがあります.例えば、Plutinosoftが開発したPlatinumライブラリもここから順藤摸瓜で見つけることができます.
dlna公式サイト
ここではdlnaプロトコルについて説明したドキュメントのダウンロードがあり、dlnaを全面的に学ぶと言ってもいい.ここのドキュメントは欠かせない.もちろん、実際にはあまり深く学ぶ必要はありませんが、このリソースを知っていれば、学習には底があります.-)
dlanについて紹介したブログ
上の2つのサイトはこのブログ「DLNA&UPnP開発ノート」シリーズの4つの文章を読んで見つけたもので、価値のある読書です.
はい、以上のいくつかの資源があれば、私たちは動くことができます.私の仕事の中でPlatinumライブラリを使ってdlnaのメディアコントローラ(
では、最初のステップは、プロジェクトのコンパイルと実行例を引き下げることです.
Platinumライブラリのコンパイル
まずgitを使用してプロジェクトの最近のコミットを引き下げる
Platinumのコンパイルは
まずPlatinumプロジェクトディレクトリの下で、
以上の手順が完了すると、
XCodeを使用して
ホストとシミュレータを同時にサポートするframeworkダイナミックリンクライブラリを生成
生成された2つの異なるアーキテクチャに対するframeworkが存在するディレクトリは、右クリック
以下のコマンドを使用してframeworkのファイルサポートアーキテクチャを表示できます.
出力:
Architectures in the fat file: Release-iphoneos/Platinum.framework/Platinum are: armv7 arm64
出力:
Architectures in the fat file: Release-iphonesimulator/Platinum.framework/Platinum are: i386 x86_64
次のコマンドで2つのframeworkをマージし、
このとき、
連結後のframeworkでサポートされているアーキテクチャを再度表示します.
出力:Architectures in the fat file:Release-iphoneos/platinum.framework/Platinum are: i386 x86_64 armv7 arm64
Platinum.frameworkとNeptune.frameworkの使用
この2つのframeworkファイルを直接プロジェクトにドラッグ&ドロップし、プロンプトで
次に、プロジェクト対応ターゲットの下の
iOSの新しいバージョンではダイナミックリンクライブラリがサポートされていますが、上記の手順ではデフォルトでダイナミックframeworkが生成されます.また、Targetの
プロジェクトでframeworkのヘッダファイルを使用するには、二重引用符
これにより、自分でコンパイルしたframeworkを使用することができます.
ライブラリの熟知プロセス
まず,インタフェース呼び出し方式を理解するために,サードパーティライブラリの使用である.幸いなことに、ライブラリにはいくつかの例のプログラムが提供されていて、まず3日間ゆっくり見ました.メディアコントローラの一例をプロジェクトに移植し、近隣のデバイスを検索する機能のみを実現した.しかし、これは良い冒頭で、私にとってかなりの励ましの役割を果たしています.開発は主に
私は良質なC++ライブラリの学習に対して、本当に1種の目を楽しませる体験であることを発見して、もちろんC++の細部を理解するのはやはりかなり苦痛です.
このPlatinumライブラリはdlnaプロトコルに従って作成されるべきで、関連するドキュメントは少なく、プロジェクトは自己注釈型に属している.つまり、コードの中の注釈はドキュメントの大部分であるが、このライブラリを学ぶには、dlanプロトコルを詳しく見る必要がある.そうしないと、プログラムを修正しても、最初に設定した機能目標を達成し、いくつかの機能を拡張したいと思っている.これらのパラメータはプロトコルで規定されているため、エッジパラメータは伝達されません.
インタフェースの閉鎖の過程で、他の人の閉鎖方法を参考にして本当に多くのことを学ぶことができることを発見して、割合私はObjective-CでC++インタフェースを密封する過程で、Platinumプロジェクトディレクトリの下で
未完、続き...
#issue1
アワの箱を識別する時、いつも識別できなくて、Platinumの中の部分のコードを修正して、そして再コンパイルした後にプロジェクトを導入して、正常に識別することができます:
変更前
PltCtrlPoint.cpp
変更後
PltCtrlPoint.cpp
修正理由
検索した小米の箱について、コードは次の関数の
PltCtrlPoint.cpp
#issue2
個人的に小米箱はdlanプロトコルの実現部分の静音制御命令に少し出入りしているようだが、サンプルプログラムを使用して小米箱に静音命令を送信したところ、設備を静音させるしかないが、設備を音に戻すことができないことが分かった.この問題はさらに確認する必要がある.
dlna
の機能が追加され、ローカルエリアネットワーク内のデバイスのスクリーン制御の機能であり、モバイル端末制御を提供しています.三方ライブラリPlatinumはC++で書かれているので、ライブラリのObjective-Cパッケージの作業に割り当てられました.初めてこのようなことを引き継ぐのは、コンピューター専攻ではない学生にとって挑戦的だ.グループ長は、カプセル化するインタフェースと呼び出し方法を説明するために、インタフェース設計ドキュメントを先に書くと言いました.ネットでいろいろな資料を見るしかありません.ここは私が狂捜して、いろいろなブログを見て収集した有用な資料で、リストは以下の通りです.
リンク
説明
Open Connectivity Foundation(OCF)公式サイト
ここにUPnP関連のドキュメントと各社が開発したSDKがあります.例えば、Plutinosoftが開発したPlatinumライブラリもここから順藤摸瓜で見つけることができます.
dlna公式サイト
ここではdlnaプロトコルについて説明したドキュメントのダウンロードがあり、dlnaを全面的に学ぶと言ってもいい.ここのドキュメントは欠かせない.もちろん、実際にはあまり深く学ぶ必要はありませんが、このリソースを知っていれば、学習には底があります.-)
dlanについて紹介したブログ
上の2つのサイトはこのブログ「DLNA&UPnP開発ノート」シリーズの4つの文章を読んで見つけたもので、価値のある読書です.
はい、以上のいくつかの資源があれば、私たちは動くことができます.私の仕事の中でPlatinumライブラリを使ってdlnaのメディアコントローラ(
DMC
)の開発を行って、だからdlnaに対してもあまり全面的な理解がなくて、すべてはPlatinumライブラリが提供したサンプルプログラムとプロジェクトREADMEファイルに対してコンパイルライブラリと関連開発の学習を行ったのです.では、最初のステップは、プロジェクトのコンパイルと実行例を引き下げることです.
Platinumライブラリのコンパイル
まずgitを使用してプロジェクトの最近のコミットを引き下げる
git clone --depth=1 https://github.com/plutinosoft/Platinum.git
Platinumのコンパイルは
Neptune
というC++プラットフォーム間で実行する環境に依存する必要があるため、もちろんこのプロジェクトには解決策があり、Neptune
ライブラリを別途ダウンロードしたりコンパイルしたりする必要はありません.Carthage
ツールを通じて、Neptune
のframeworkをPlatinumのプロジェクトディレクトリの下にダウンロードする必要があります.具体的なプロセスは次のとおりです.まずPlatinumプロジェクトディレクトリの下で、
Cartfile
またはCartfile.resolved
というファイルがあります.ファイルにはCarthage
というツールソフトウェアがダウンロードするframeworkの名前とバージョンが示されています.実はcarthage
というツールはCocoaPods
というツールに似ています.しかし、あなたのMacにはcarthage
がインストールされていない可能性が高いので、まずMacにhomebrewというツールをインストールし、homebrew
を使用してcarghage
をインストールすることができます.次のようになります./usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # homebrew
brew install carthage # homebrew , carthage
cd Platinum/ # Platinum
carthage update # carthage Carthfile framework
以上の手順が完了すると、
Platinum/Carthage
というディレクトリの下に、Neptune
というC++プラットフォーム間実行環境のMacとiOSのframeworkが存在していることがわかります.以上のコマンドが正常に実行され、最終的にNeptuneのFrameWorkが得られると、PlatinumのiOSのプロジェクトとサンプルプログラムをコンパイルすることができます.XCodeを使用して
/Platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj
プロジェクトファイルを開き、それぞれTarget
を実行すると、関連するframeworkとサンプル実行プログラムを生成できます.ホストとシミュレータを同時にサポートするframeworkダイナミックリンクライブラリを生成
Platinum-iOS
を選択してスキーマ(Scheme)をコンパイルし、「スキーマ(Edit Scheme...)を編集する」ダイアログ・ボックスで、「(Run)分類の情報(Info)」タブの下で、「コンパイル構成(Build Configuration)」をRelease
に選択します.コンパイルスキームを設定した後、いずれかのシミュレータ(e.g:iphone SE)を選択して1回コンパイルし、汎用iOSデバイス(Generic iOSデバイス)を選択して1回コンパイルし、この2回のコンパイルで、それぞれi386 x86_64
アーキテクチャに対応するシミュレータframeworkと、実機armv7 arm64
アーキテクチャに対応するframeworkを得る.この2つの異なるアーキテクチャに対応するframeworkを1つのframeworkに統合すると、ホストデバッグとシミュレータデバッグを同時に満たすframeworkが完了します.生成された2つの異なるアーキテクチャに対するframeworkが存在するディレクトリは、右クリック
Show in Finder
でそれらの位置を見つけることができます.この2つのディレクトリパスは動的に変化し、完全に私と一致しません.# armv7 arm64
/Users/JokerAtBaoFeng/Library/Developer/Xcode/DerivedData/Platinum-bawuiqxkhqixgybjjufqgvmduavh/Build/Products/Release-iphoneos
# i386 x86_64
/Users/JokerAtBaoFeng/Library/Developer/Xcode/DerivedData/Platinum-bawuiqxkhqixgybjjufqgvmduavh/Build/Products/Release-iphonesimulator
以下のコマンドを使用してframeworkのファイルサポートアーキテクチャを表示できます.
lipo -info Release-iphoneos/Platinum.framework/Platinum
出力:
Architectures in the fat file: Release-iphoneos/Platinum.framework/Platinum are: armv7 arm64
lipo -info Release-iphonesimulator/Platinum.framework/Platinum
出力:
Architectures in the fat file: Release-iphonesimulator/Platinum.framework/Platinum are: i386 x86_64
次のコマンドで2つのframeworkをマージし、
Release-iphoneos/Platinum.framework/Platinum
ファイルを置き換えます.このファイルはマージ後のファイルです.lipo -create Release-iphoneos/Platinum.framework/Platinum Release-iphonesimulator/Platinum.framework/Platinum -output Release-iphoneos/Platinum.framework/Platinum
このとき、
Release-iphoneos/Platinum.framework
を使用して使用するプロジェクトをインポートすることができます.ああ、そうだ.frameworkの実行にはNeptune.framework
に依存する必要があるので、自分のプロジェクトをインポートするときは、carthageでダウンロードしたNeptune.framework
を一括してインポートすることを覚えておいてください.連結後のframeworkでサポートされているアーキテクチャを再度表示します.
lipo -info Release-iphoneos/Platinum.framework/Platinum
出力:Architectures in the fat file:Release-iphoneos/platinum.framework/Platinum are: i386 x86_64 armv7 arm64
i386 x86_64 armv7 arm64
を同時にサポートしていることがわかります.Platinum.frameworkとNeptune.frameworkの使用
この2つのframeworkファイルを直接プロジェクトにドラッグ&ドロップし、プロンプトで
Copy Items if needed
を選択してfinishedをクリックしてインポートを完了できます.次に、プロジェクト対応ターゲットの下の
Build Phases
|Link Binary With Libraries
の下に、Platinum
とNeptune
の両方のframeworkがリストに含まれていることを確認します.iOSの新しいバージョンではダイナミックリンクライブラリがサポートされていますが、上記の手順ではデフォルトでダイナミックframeworkが生成されます.また、Targetの
General
|Embedded Binaries
に上記の2つのframeworkを同様に追加して、アプリケーションをインストールすると同時に、対応するダイナミックライブラリをマシンにコピーする必要があります.そうしないと、マシンに対応するframeworkが欠けているため、エラーが発生します.プロジェクトでframeworkのヘッダファイルを使用するには、二重引用符
ではなく、尖った括弧"header.h"
を使用する必要があります.これにより、自分でコンパイルしたframeworkを使用することができます.
ライブラリの熟知プロセス
まず,インタフェース呼び出し方式を理解するために,サードパーティライブラリの使用である.幸いなことに、ライブラリにはいくつかの例のプログラムが提供されていて、まず3日間ゆっくり見ました.メディアコントローラの一例をプロジェクトに移植し、近隣のデバイスを検索する機能のみを実現した.しかし、これは良い冒頭で、私にとってかなりの励ましの役割を果たしています.開発は主に
MicroMediaController
のコードを参照して行われる.私は良質なC++ライブラリの学習に対して、本当に1種の目を楽しませる体験であることを発見して、もちろんC++の細部を理解するのはやはりかなり苦痛です.
このPlatinumライブラリはdlnaプロトコルに従って作成されるべきで、関連するドキュメントは少なく、プロジェクトは自己注釈型に属している.つまり、コードの中の注釈はドキュメントの大部分であるが、このライブラリを学ぶには、dlanプロトコルを詳しく見る必要がある.そうしないと、プログラムを修正しても、最初に設定した機能目標を達成し、いくつかの機能を拡張したいと思っている.これらのパラメータはプロトコルで規定されているため、エッジパラメータは伝達されません.
インタフェースの閉鎖の過程で、他の人の閉鎖方法を参考にして本当に多くのことを学ぶことができることを発見して、割合私はObjective-CでC++インタフェースを密封する過程で、Platinumプロジェクトディレクトリの下で
Platinum/Source/Extras/ObjectiveC/
対MediaServer
の包装方法を参考にしました.未完、続き...
#issue1
アワの箱を識別する時、いつも識別できなくて、Platinumの中の部分のコードを修正して、そして再コンパイルした後にプロジェクトを導入して、正常に識別することができます:
変更前
PltCtrlPoint.cpp
class PLT_DeviceReadyIterator
{
public:
PLT_DeviceReadyIterator() {}
NPT_Result operator()(PLT_DeviceDataReference& device) const {
NPT_Result res = device->m_Services.ApplyUntil(
PLT_ServiceReadyIterator(),
NPT_UntilResultNotEquals(NPT_SUCCESS));
if (NPT_FAILED(res)) return res;
res = device->m_EmbeddedDevices.ApplyUntil(
PLT_DeviceReadyIterator(),
NPT_UntilResultNotEquals(NPT_SUCCESS));
if (NPT_FAILED(res)) return res;
// a device must have at least one service or embedded device
// otherwise it's not ready
if (device->m_Services.GetItemCount() == 0 &&
device->m_EmbeddedDevices.GetItemCount() == 0) {
return NPT_FAILURE;
}
return NPT_SUCCESS;
}
};
変更後
PltCtrlPoint.cpp
class PLT_DeviceReadyIterator
{
public:
PLT_DeviceReadyIterator() {}
NPT_Result operator()(PLT_DeviceDataReference& device) const {
NPT_Result res = device->m_Services.ApplyUntil(
PLT_ServiceReadyIterator(),
NPT_UntilResultNotEquals(NPT_SUCCESS));
// if (NPT_FAILED(res)) return res;
res = device->m_EmbeddedDevices.ApplyUntil(
PLT_DeviceReadyIterator(),
NPT_UntilResultNotEquals(NPT_SUCCESS));
// if (NPT_FAILED(res)) return res;
if(NPT_FAILED(res) && NPT_FAILED(res)) return res;
// a device must have at least one service or embedded device
// otherwise it's not ready
if (device->m_Services.GetItemCount() == 0 &&
device->m_EmbeddedDevices.GetItemCount() == 0) {
return NPT_FAILURE;
}
return NPT_SUCCESS;
}
};
修正理由
検索した小米の箱について、コードは次の関数の
55
行を通過できないことに気づきました.PltCtrlPoint.cpp
/*----------------------------------------------------------------------
| PLT_CtrlPoint::ProcessGetSCPDResponse
+---------------------------------------------------------------------*/
NPT_Result
PLT_CtrlPoint::ProcessGetSCPDResponse(NPT_Result res,
const NPT_HttpRequest& request,
const NPT_HttpRequestContext& context,
NPT_HttpResponse* response,
PLT_DeviceDataReference& device)
{
NPT_COMPILER_UNUSED(context);
NPT_AutoLock lock(m_Lock);
PLT_DeviceReadyIterator device_tester;
NPT_String scpd;
PLT_DeviceDataReference root_device;
PLT_Service* service;
NPT_String prefix = NPT_String::Format("PLT_CtrlPoint::ProcessGetSCPDResponse for a service of device \"%s\" @ %s (result = %d, status = %d)",
(const char*)device->GetFriendlyName(),
(const char*)request.GetUrl().ToString(),
res,
response?response->GetStatusCode():0);
// verify response was ok
NPT_CHECK_LABEL_FATAL(res, bad_response);
NPT_CHECK_POINTER_LABEL_FATAL(response, bad_response);
PLT_LOG_HTTP_RESPONSE(NPT_LOG_LEVEL_FINER, prefix, response);
// make sure root device hasn't disappeared
NPT_CHECK_LABEL_WARNING(FindDevice(device->GetUUID(), root_device, true),
bad_response);
res = device->FindServiceBySCPDURL(request.GetUrl().ToRequestString(), service);
NPT_CHECK_LABEL_SEVERE(res, bad_response);
// get response body
res = PLT_HttpHelper::GetBody(*response, scpd);
NPT_CHECK_LABEL_FATAL(res, bad_response);
// DIAL support
if (root_device->GetType().Compare("urn:dial-multiscreen-org:device:dial:1") == 0) {
AddDevice(root_device);
return NPT_SUCCESS;
}
// set the service scpd
res = service->SetSCPDXML(scpd);
NPT_CHECK_LABEL_SEVERE(res, bad_response);
// if root device is ready, notify listeners about it and embedded devices
if (NPT_SUCCEEDED(device_tester(root_device))) {
AddDevice(root_device);
}
return NPT_SUCCESS;
bad_response:
NPT_LOG_SEVERE_2("Bad SCPD response for device \"%s\":%s",
(const char*)device->GetFriendlyName(),
(const char*)scpd);
if (!root_device.IsNull()) RemoveDevice(root_device);
return res;
}
#issue2
個人的に小米箱はdlanプロトコルの実現部分の静音制御命令に少し出入りしているようだが、サンプルプログラムを使用して小米箱に静音命令を送信したところ、設備を静音させるしかないが、設備を音に戻すことができないことが分かった.この問題はさらに確認する必要がある.