В этом примере показано, как написать MATLAB® Production Server™ клиента с помощью API клиента C. Клиентское приложение вызывает addmatrix
функция, которую вы скомпилировали в пакетном развертываемом архиве с помощью приложения Production Server Compiler и развернули в совместном развертываемом архиве (MATLAB Production Server).
Создайте клиентское приложение MATLAB Production Server на C++:
Создайте файл с именем addmatrix_client.cpp
.
Используя текстовый редактор, откройте addmatrix_client.cpp
.
Добавьте в файл следующие операторы включения:
#include <iostream> #include <mps/client.h>
Примечание
Файлы заголовков для клиентского API MATLAB Production Server C расположены в
папка. папка.matlabroot
/ toolbox/compiler_sdk/mps_client/c/include/mps
Добавьте main()
способ приложения.
int main ( void ) { }
Инициализируйте среду выполнения клиента.
mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1);
Создайте строение клиента.
mpsClientConfig* config; mpsStatus status = mpsruntime->createConfig(&config);
Создайте контекст клиента.
mpsClientContext* context; status = mpsruntime->createContext(&context, config);
Создайте данные MATLAB для ввода в функцию.
double a1[2][3] = {{1,2,3},{3,2,1}}; double a2[2][3] = {{4,5,6},{6,5,4}}; int numIn=2; mpsArray** inVal = new mpsArray* [numIn]; inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL); inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL); double* data1 = (double *)( mpsGetData(inVal[0]) ); double* data2 = (double *)( mpsGetData(inVal[1]) ); for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { mpsIndex subs[] = { i, j }; mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs); data1[id] = a1[i][j]; data2[id] = a2[i][j]; } }
Создайте данные MATLAB, чтобы сохранить выход.
int numOut = 1; mpsArray **outVal = new mpsArray* [numOut];
Вызовите развернутую функцию MATLAB.
Задайте в качестве аргументов следующее:
контекст клиента
URL функции
Количество ожидаемых выходов
Указатель на mpsArray
удержание выходов
Количество входов
Указатель на mpsArray
удержание входов
mpsStatus status = mpsruntime->feval(context, "http://localhost:9910/addmatrix/addmatrix", numOut, outVal, numIn, (const mpsArray**)inVal);
Для получения дополнительной информации о feval
функция, см. ссылочный материал, включенный в
папка.matlabroot
/ toolbox/compiler_sdk/mps_client
Проверьте, что вызов функции был успешным с помощью if
оператор.
if (status==MPS_OK) { }
Внутри if
оператор, добавить код для обработки выхода.
double* out = mpsGetPr(outVal[0]); for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { mpsIndex subs[] = {i, j}; mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs); std::cout << out[id] << "\t"; } std::cout << std::endl; }
Добавление else
предложение к if
оператор для обработки любых ошибок.
else { mpsErrorInfo error; mpsruntime->getLastErrorInfo(context, &error); std::cout << "Error: " << error.message << std::endl; switch(error.type) { case MPS_HTTP_ERROR_INFO: std::cout << "HTTP: " << error.details.http.responseCode << ": " << error.details.http.responseMessage << std::endl; case MPS_MATLAB_ERROR_INFO: std::cout << "MATLAB: " << error.details.matlab.identifier << std::endl; std::cout << error.details.matlab.message << std::endl; case MPS_GENERIC_ERROR_INFO: std::cout << "Generic: " << error.details.general.genericErrorMsg << std::endl; } mpsruntime->destroyLastErrorInfo(&error); }
Освободите память, используемую входами.
for (int i=0; i<numIn; i++) mpsDestroyArray(inVal[i]); delete[] inVal;
Освободите память, используемую выходами.
for (int i=0; i<numOut; i++) mpsDestroyArray(outVal[i]); delete[] outVal;
Освободите память, используемую клиентом во время выполнения.
mpsruntime->destroyConfig(config); mpsruntime->destroyContext(context); mpsTerminate();
Сохраните файл.
Завершенная программа должна напоминать следующее:
#include <iostream> #include <mps/client.h> int main ( void ) { mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1); mpsClientConfig* config; mpsStatus status = mpsruntime->createConfig(&config); mpsClientContext* context; status = mpsruntime->createContext(&context, config); double a1[2][3] = {{1,2,3},{3,2,1}}; double a2[2][3] = {{4,5,6},{6,5,4}}; int numIn=2; mpsArray** inVal = new mpsArray* [numIn]; inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL); inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL); double* data1 = (double *)( mpsGetData(inVal[0]) ); double* data2 = (double *)( mpsGetData(inVal[1]) ); for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { mpsIndex subs[] = { i, j }; mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs); data1[id] = a1[i][j]; data2[id] = a2[i][j]; } } int numOut = 1; mpsArray **outVal = new mpsArray* [numOut]; status = mpsruntime->feval(context, "http://localhost:9910/addmatrix/addmatrix", numOut, outVal, numIn, (const mpsArray **)inVal); if (status==MPS_OK) { double* out = mpsGetPr(outVal[0]); for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { mpsIndex subs[] = {i, j}; mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs); std::cout << out[id] << "\t"; } std::cout << std::endl; } } else { mpsErrorInfo error; mpsruntime->getLastErrorInfo(context, &error); std::cout << "Error: " << error.message << std::endl; switch(error.type) { case MPS_HTTP_ERROR_INFO: std::cout << "HTTP: " << error.details.http.responseCode << ": " << error.details.http.responseMessage << std::endl; case MPS_MATLAB_ERROR_INFO: std::cout << "MATLAB: " << error.details.matlab.identifier << std::endl; std::cout << error.details.matlab.message << std::endl; case MPS_GENERIC_ERROR_INFO: std::cout << "Generic: " << error.details.general.genericErrorMsg << std::endl; } mpsruntime->destroyLastErrorInfo(&error); } for (int i=0; i<numIn; i++) mpsDestroyArray(inVal[i]); delete[] inVal; for (int i=0; i<numOut; i++) mpsDestroyArray(outVal[i]); delete[] outVal; mpsruntime->destroyConfig(config); mpsruntime->destroyContext(context); mpsTerminate(); }
Скомпилируйте приложение.
Чтобы скомпилировать код клиента, компилятору нужен доступ к client.h
. Этот файл заголовка хранится в
.matlabroot
/ toolbox/compiler_sdk/mps_client/c/include/mps/
Чтобы связать ваше приложение, linker нужен доступ к следующим файлам, хранящимся в
: matlabroot
/ toolbox/compiler_sdk/mps_client/c/
Файлы, необходимые для связывания
Windows® | UNIX®/ Linux | Mac OS X |
---|---|---|
$arch\lib\mpsclient.lib | $arch/lib/libprotobuf.so | $arch/lib/libprotobuf.dylib |
$arch/lib/libcurl.so | $arch/lib/libcurl.dylib | |
$arch/lib/libmwmpsclient.so | $arch/lib/libmwmpsclient.dylib | |
$arch/lib/libmwcpp11compat.so |
Запустите приложение.
Чтобы запустить приложение, добавьте следующие файлы, хранящиеся в
к пути приложения: matlabroot
/ toolbox/compiler_sdk/mps_client/c/
Файлы, необходимые для выполнения
Windows | UNIX/Linux | Mac OS X |
---|---|---|
$arch\lib\mpsclient.dll | $arch/lib/libprotobuf.so | $arch/lib/libprotobuf.dylib |
$arch\lib\libprotobuf.dll | $arch/lib/libcurl.so | $arch/lib/libcurl.dylib |
$arch\lib\libcurl.dll | $arch/lib/libmwmpsclient.so | $arch/lib/libmwmpsclient.dylib |
$arch/lib/libmwcpp11compat.so |
Клиент вызывает addmatrix
функция на образце сервера и возвращает следующую матрицу на консоли:
5.0 7.0 9.0 9.0 7.0 5.0