上一篇文章中我使用了幾個基本的例子來解釋了AllJoyn框架中各個模塊的功能。本文我將從代碼層面解釋如何從零開始搭建一個AllJoyn核心應用
本文中所有的代碼都可以從Git中自行下載:代碼鏈接
AllJoyn應用的整體框架
本文所使用的應用可以被切分成三個模塊, 從而更好地幫助我們理解AllJoyn框架:
主程式應用代碼 - Main主要功能:
處理命令列輸入并輸出
在代碼中創建并放置呼叫函式, 管理AllJoyn中API的互相通訊
AllJoyn API代碼 - MyAllJoynCode主要功能:
表示如何啟動AllJoyn框架
為服務層的廣播與發現服務使用About Feature屬性
為應用系結一個Session并追蹤主機的SessionId值
使用Session的Id來跟蹤使用者
通過MyFirstBusObject與其他AllJoyn物體進行互相溝通
總線物件的實作 - MyFirstBusObject主要功能:
創建并實作一個AllJoyn介面
表示如何發送一個總線方法并獲得反饋
表示如何發送一個信號以及無會話的信號
表示如何獲取信號
如上所示代碼不能單獨運行,必須與其他兩個模塊共同啟動才能確保應用的正常。 上面的分類只是用于更好的理解使用AllJoyn的API使用方式,從而為開發者提供便利。
模塊分析
每個AllJoyn應用都應該創建一個總線附屬(BusAttachment), 啟動后連接到AllJoyn的路由上(AllJoyn Router)。 總線附屬物件可以讓應用呼叫AllJoyn的API, 創建方式如下所示:
mBusAttachment = new BusAttachment("MyFirstApplication", true);
/* Start the msg bus */
if (ER_OK == status) {
status = mBusAttachment->Start();
} else {
printf("BusAttachment::Start failed\n");
}
/* Connect to the daemon */
if (ER_OK == status) {
status = mBusAttachment->Connect();
if (ER_OK != status) {
printf("BusAttachment Connect failed.\n");
}
}
創建好了總線附屬后,下一步需要確定應用的基本功能。 這一章所介紹的應用不但是客戶端,同時也是服務器端,也就是說,應用是一個P2P結點。 因此為了實作連接功能,我們需要加入BindSession。
/* 將會話系結到埠,從而接收所有的加入請求 */
SessionOpts opts(SessionOpts::TRAFFIC_MESSAGES, true, SessionOpts::PROXIMITY_ANY, TRANSPORT_ANY);
SessionPort sp = SESSION_PORT_ANY;
status = mBusAttachment->BindSessionPort(sp, opts, *this);
if (ER_OK != status) {
printf("無法系結會話埠\n");
}
由于應用中使用的埠可以為任何埠,因此我們使用SESSION_PORT_ANY。 我們希望AllJoyn框架能夠為應用分配埠并傳遞到About資料中。 與此同時, 為了能夠通知其他應用我們的存在, 我們需要設定About特性
/* 設定About資料, 使應用能夠廣而告知 */
mAboutData = new AboutPropertyStoreImpl();
// 設定一個獨一無人的ID, 比如說設備的Mac地址
// 為應用設定一個隨機值, 這種方法在商業應用中也很常見
mAboutData->setDeviceId(getDeviceId());
mAboutData->setDeviceName("MyDeviceName");
// AllJoyn應用的全域辨識符 - recommend to use an online GUID generator to create
// use a random value for this application, this should persist in a comercial application
mAboutData->setAppId(getAppId());
std::vector<qcc::String> languages(1);
languages[0] = "en";
mAboutData->setSupportedLangs(languages);
mAboutData->setDefaultLang("en");
mAboutData->setAppName(appName);
mAboutData->setModelNumber("Tutorial5000");
mAboutData->setDateOfManufacture("8/15/2014");
mAboutData->setSoftwareVersion("1.0 build 1");
mAboutData->setAjSoftwareVersion(ajn::GetVersion());
mAboutData->setHardwareVersion("N/A");
mAboutData->setDescription("This is the my first AllJoyn Application!", "en");
mAboutData->setManufacturer("Company", "Me");
mAboutData->setSupportUrl("http://www.allseenalliance.org");
/* Initialize the About feature Service side */
AboutServiceApi::Init(*mBusAttachment, *mAboutData);
/* Register the port with About feature that was set when BindSession called */
status = AboutServiceApi::getInstance()->Register(sp);
/* Register the About feature with AllJoyn */
status = mBusAttachment->RegisterBusObject(*AboutServiceApi::getInstance());
接下來,應用就可以開始集合了。我們已經為其他應用的尋找與互聯撰寫好了平臺
/*設定并注冊開發者的總線應用*/
/**
* Here is where we add the objects we wish to expose.
* A developer would modify this section to add different BusObjects.
*/
mMyFirstBusObject = new MyFirstBusObject(*mBusAttachment);
/* Now register the object with AllJoyn and About */
QStatus status;
status = mBusAttachment->RegisterBusObject(*mMyFirstBusObject);
if (ER_OK != status) {
printf("Could not register the BusObject with the BusAttachment\n");
}
std::vector<qcc::String> interfaces;
for( int i = 0; i < mMyFirstBusObject->getNumberOfInterfaces(); i++) {
interfaces.push_back(mMyFirstBusObject->getInterfaceName(i));
}
status = AboutServiceApi::getInstance()->AddObjectDescription(mMyFirstBusObject->GetPath(), interfaces);
if (ER_OK != status) {
printf("Error returned by AddObjectDescription (%s).\n", QCC_StatusText(status));
}
BusObject與MyFirstBusObject包含了我們互相進行通訊的所有資訊,并且將我們事先的所有的API集進行了開放,允許其他應用進行呼叫
BusAttachment在創建、啟動并連接后, 連接的設定就弄好了, 設備的細節也自動設定好, 而且物件也被注冊好了。 下一章我們就可以制作注冊呼叫,從而讓應用能夠找到我們的first_app應用。
uj5u.com熱心網友回復:
可以參考此鏈接,總共有5個部分:https://bbs.csdn.net/topics/391957303轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/60754.html
標籤:Qualcomm開發
