では、クライアント側にはどのような記述がされているのでしょうか。基本的な流れは前回と大きく変わりませんが、若干異なる部分もあります。
if (!g_msgBus) { status = ER_OUT_OF_MEMORY; } if (ER_OK == status) { status = CreateInterface(); } if (ER_OK == status) { status = StartMessageBus(); } if (ER_OK == status) { status = ConnectToBus(); } if (ER_OK == status) { RegisterBusListener(); status = FindAdvertisedName(); /サーバがバス上に公開した名称を探すサブルーティン/ } if (ER_OK == status) { status = WaitForJoinSessionCompletion(); } if (ER_OK == status) { status = MakeMethodCall(); /サーバに文字列をメッセージとして渡すサブルーティン/ } /* Deallocate bus */ delete g_msgBus; g_msgBus = NULL; printf("Basic client exiting with status 0x%04x (%s).\n", status, QCC_StatusText(status));
文字列をメッセージとして渡すサブルーティンも見てみましょう。
QStatus MakeMethodCall(void) { ProxyBusObject remoteObj(*g_msgBus, SERVICE_NAME, SERVICE_PATH, s_sessionId); const InterfaceDescription* alljoynTestIntf = g_msgBus->GetInterface(INTERFACE_NAME); assert(alljoynTestIntf); remoteObj.AddInterface(*alljoynTestIntf); Message reply(*g_msgBus); MsgArg inputs[2]; inputs[0].Set("s", "Hello "); 文字列1を設定 inputs[1].Set("s", "World!"); 文字列2を設定 QStatus status = remoteObj.MethodCall(INTERFACE_NAME, "cat", inputs, 2, reply, 5000); /サーバを呼び出します/ if (ER_OK == status) { printf("'%s.%s' (path='%s') returned '%s'.\n", SERVICE_NAME, "cat", SERVICE_PATH, reply->GetArg(0)->v_string.str); } else { printf("MethodCall on '%s.%s' failed.", SERVICE_NAME, "cat"); } return status; }
サーバ側の呼ばれる関数とクライアント側の呼び出す関数を見ると、次のことが分かります。
サーバ/クライアント | 関数 |
---|---|
Server側 | void Cat(const InterfaceDescription::Member* member, Message& msg) |
Client側 | QStatus status = remoteObj.MethodCall(INTERFACE_NAME, "cat", inputs, 2, reply, 5000) |
バスを通した関数呼び出しの形になっていることが分かります。複雑な前処理がありますが、基本部分はこの考え方に沿って進みます。APIの詳しい説明は、以下のURLにあります。また、今回のサンプル以外にも、同じディレクトリに幾つかのサンプルプログラムがあるので参照してください。
・Running Sample Applications(サンプルプログラムの解説とビルド)
・AllJoyn Java API Reference Manual
・AllJoyn C API Reference Manual
・AllJoyn C++ API Reference Manual
Copyright © ITmedia, Inc. All Rights Reserved.