关于fdbus:一个更完整的实例

[复制链接]
 楼主| keer_zu 发表于 2022-9-16 18:18 | 显示全部楼层 |阅读模式
fdbus普通client-server示例及接口说明

一、server
1.FDServer.h

  1. #pragma once
  2. #include<fdbus/fdbus.h>
  3. #include<fdbus/CBaseServer.h>
  4. using namespace ipc::fdbus;

  5. class FDServer : public CBaseServer
  6. {
  7. public:
  8.         enum EGroupId
  9.         {
  10.                 GROUP_MASTER,
  11.                 GROUP_1
  12.         };
  13.         enum EMessageId
  14.         {
  15.                 NTF_CJSON_TEST = 128,
  16.                 NTF_GROUP_TEST1 = fdbMakeEventCode(GROUP_1, 0),
  17.                 NTF_GROUP_TEST2 = fdbMakeEventCode(GROUP_1, 1),
  18.                 NTF_GROUP_TEST3 = fdbMakeEventCode(GROUP_1, 2)
  19.         };
  20.         static CBaseWorker main_worker;
  21.         FDServer(const char* name, CBaseWorker *worker = 0);
  22.         ~FDServer();

  23.         void broadcastElapseTime(CMethodLoopTimer<FDServer> *timer);

  24. protected:
  25.         virtual void onOnline(const CFdbOnlineInfo &info);
  26.         virtual void onOffline(const CFdbOnlineInfo &info);
  27.         virtual void onInvoke(CBaseJob::Ptr &msg_ref);
  28.         virtual void onSubscribe(CBaseJob::Ptr &msg_ref);

  29. private:
  30.         CMethodLoopTimer<FDServer>* mTimer;
  31. };

  32. class CBroadcastTimer : public CMethodLoopTimer<FDServer>
  33. {
  34. public:
  35.         CBroadcastTimer(FDServer *server);
  36. };
 楼主| keer_zu 发表于 2022-9-16 18:22 | 显示全部楼层
2.FDServer.cpp
  1. #include "FDServer.h"
  2. #include<fdbus/CFdbProtoMsgBuilder.h>
  3. #include<fdbus/CFdbCJsonMsgBuilder.h>
  4. #include<iostream>
  5. #include<fdbus/cJSON/cJSON.h>
  6. #include"TempleMsg.pb.h"
  7. #include"CFdbIfPerson.h"
  8. CBaseWorker FDServer::main_worker;
  9. FDServer::FDServer(const char * name, CBaseWorker * worker)
  10.         : CBaseServer(name, worker)
  11. {
  12.         mTimer = new CBroadcastTimer(this);
  13.         mTimer->attach(&main_worker, false);
  14. }

  15. FDServer::~FDServer()
  16. {
  17. }

  18. /**server主动推送消息给订阅过该消息的客户端**/
  19. void FDServer::broadcastElapseTime(CMethodLoopTimer<FDServer>* timer)
  20. {
  21.         std::cout << __FUNCTION__ << std::endl;
  22.         NFdbTemple::ElapseTime eTime;
  23.         eTime.set_hour(1);
  24.         eTime.set_minute(20);
  25.         eTime.set_second(45);

  26.         CFdbProtoMsgBuilder builder(eTime);
  27.         /*当消息ID和字符串都匹配时,客户端才对其做出响应,客户端接收消息无先后顺序*/
  28.         broadcast(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, builder, "my_filter");

  29.         char raw_data[256];
  30.         memset(raw_data, '=', sizeof(raw_data));
  31.         /*向客户端主动推送广播消息*/
  32.         broadcast(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, raw_data, 256, "raw_buffer");

  33.         cJSON *f = cJSON_CreateObject();
  34.         cJSON_AddNumberToObject(f, "birthday", 199900101);
  35.         cJSON_AddNumberToObject(f, "id", 1);
  36.         cJSON_AddStringToObject(f, "name", "sofia");
  37.         CFdbCJsonMsgBuilder builder1(f);
  38.         broadcast(NTF_CJSON_TEST, builder1);
  39.         cJSON_Delete(f);

  40.         broadcast(NTF_GROUP_TEST1);
  41.         broadcast(NTF_GROUP_TEST2);
  42.         broadcast(NTF_GROUP_TEST3);
  43. }

  44. /*客户端连接服务器时,响应该函数*/
  45. void FDServer::onOnline(const CFdbOnlineInfo & info)
  46. {
  47.         FDB_LOG_I("server session: %d, secure: %d\n", info.mSid, info.mQOS);
  48.         if (info.mFirstOrLast)
  49.         {
  50.                 FDB_LOG_I("time enabled\n");
  51.                 mTimer->enable();
  52.         }
  53.         std::cout << __FUNCTION__ << std::endl;
  54. }

  55. /*客户端关闭时,响应该函数*/
  56. void FDServer::onOffline(const CFdbOnlineInfo & info)
  57. {
  58.         FDB_LOG_I("server session off: %d, secure: %d\n", info.mSid, info.mQOS);
  59.         if (info.mFirstOrLast)
  60.         {
  61.                 mTimer->disable();
  62.         }
  63.         std::cout << "server session off: " << info.mSid << ",secure: " << info.mQOS << std::endl;
  64.         std::cout << __FUNCTION__ << std::endl;
  65. }

  66. /*接收并处理客户端invoke请求*/
  67. void FDServer::onInvoke(CBaseJob::Ptr & msg_ref)
  68. {
  69.         auto msg = castToMessage<CBaseMessage *>(msg_ref);

  70.         static int32_t elapse_time = 0;
  71.         std::cout << "msg->code():" << msg->code() << std::endl;

  72.         switch (msg->code())
  73.         {
  74.         case NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA:
  75.         {
  76.                 NFdbTemple::SongId song_id;
  77.                 CFdbProtoMsgParser parser(song_id);
  78.                 if (!msg->deserialize(parser))
  79.                 {
  80.                         msg->status(msg_ref, FDB_ST_MSG_DECODE_FAIL, "fail to decode");
  81.                         std::cout << "REQ_METADATA song_id fail to decode\n" << std::endl;
  82.                         return;
  83.                 }

  84.                 std::cout << "request song id:" << song_id.id() << ",sender: " << msg->senderName().c_str() << std::endl;
  85.                
  86.                 NFdbTemple::NowPlayingDetails req_msg;
  87.                 req_msg.set_artist("Liu Dehua");
  88.                 req_msg.set_album("Ten Year's Golden Song");
  89.                 req_msg.set_genre("County");
  90.                 req_msg.set_title("Wang Qing Shui");
  91.                 req_msg.set_file_name("Lau Dewa");
  92.                 req_msg.set_elapse_time(elapse_time++);
  93.                 CFdbProtoMsgBuilder builder(req_msg);
  94.                 msg->reply(msg_ref, builder);
  95.         }
  96.         break;
  97.         case NFdbTemple::FdbMediaSvcMsgId::REQ_RAWDATA:
  98.         {
  99.                 int32_t size = msg->getPayloadSize();
  100.                 std::cout << "size:" << size << " sender:" << msg->senderName().c_str();
  101.                 CFdbParcelableArray<CPerson> persions;
  102.                 CPerson *p = persions.Add();
  103.                 p->mAddress = "Shanghai";
  104.                 p->mAge = 22;
  105.                 p->mName = "Zhang San";
  106.                 CCar *c = p->mCars.Add();
  107.                 c->mBrand = "Hongqi";
  108.                 c->mModel = "H5";
  109.                 c->mPrice = 400000;

  110.                 c = p->mCars.Add();
  111.                 c->mBrand = "POWER";
  112.                 c->mModel = "X5";
  113.                 c->mPrice = 200000;

  114.                 for (int32_t i = 0; i < 5; ++i)
  115.                 {
  116.                         CFdbByteArray<20> *arr = p->mPrivateInfo.Add();
  117.                         for (int32_t j = 0; i < arr->size(); ++j)
  118.                         {
  119.                                 arr->vbuffer()[j] = j;
  120.                         }
  121.                 }

  122.                 p = persions.Add();
  123.                 p->mAddress = "Guangzhou";
  124.                 p->mAge = 32;
  125.                 p->mName = "Li si";
  126.                 c = p->mCars.Add();
  127.                 c->mBrand = "Chuanqi";
  128.                 c->mModel = "H5";
  129.                 c->mPrice = 400000;

  130.                 c = p->mCars.Add();
  131.                 c->mBrand = "Toyoto";
  132.                 c->mModel = "X5";
  133.                 c->mPrice = 200000;

  134.                 for (int32_t i = 0; i < 8; ++i)
  135.                 {
  136.                         CFdbByteArray<20> *arr = p->mPrivateInfo.Add();
  137.                         for (int32_t j = 0; j < arr->size(); ++j)
  138.                         {
  139.                                 arr->vbuffer()[j] = j + 10;
  140.                         }
  141.                 }

  142.                 CFdbParcelableBuilder builder(persions);
  143.                 msg->reply(msg_ref, builder);
  144.         }
  145.         break;
  146.         default:
  147.                 break;
  148.         }
  149. }

  150. /*当client注册消息时,server通过该回调函数获知,将初始值返回给客户端*/
  151. void FDServer::onSubscribe(CBaseJob::Ptr & msg_ref)
  152. {
  153.         auto msg = castToMessage<CBaseMessage *>(msg_ref);
  154.         const CFdbMsgSubscribeItem *sub_item;
  155.         FDB_BEGIN_FOREACH_SIGNAL(msg, sub_item)
  156.         {
  157.                 FdbMsgCode_t msg_code = sub_item->msg_code();
  158.                 const char* filter = "";
  159.                 if (sub_item->has_filter())
  160.                 {
  161.                         filter = sub_item->filter().c_str();
  162.                         std::cout << filter << std::endl;
  163.                 }

  164.                 FdbSessionId_t sid = msg->session();

  165.                 if (fdbIsGroup(msg_code))
  166.                 {
  167.                         FDB_LOG_I("group message: %d, filter: %s of session %d is registered! sender: %s\n\n",
  168.                                 msg_code, filter, sid, msg->senderName().c_str());
  169.                         /*广播消息给客户端*/
  170.                         msg->broadcast(NTF_GROUP_TEST1);
  171.                         msg->broadcast(NTF_GROUP_TEST2);
  172.                         msg->broadcast(NTF_GROUP_TEST3);
  173.                         return;
  174.                 }

  175.                 FDB_LOG_I("single message:%d, filter %s of session %d is registered! sender: %s\n\n",
  176.                         msg_code, filter, sid, msg->senderName().c_str());

  177.                 switch (msg_code)
  178.                 {
  179.                 case NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME:
  180.                 {
  181.                         std::string str_filter(filter);
  182.                         if (!str_filter.compare("my_filter"))
  183.                         {
  184.                                 NFdbTemple::ElapseTime eTime;
  185.                                 eTime.set_hour(1);
  186.                                 eTime.set_hour(20);
  187.                                 eTime.set_hour(30);
  188.                                 CFdbProtoMsgBuilder builder(eTime);
  189.                                 /*广播消息给客户端*/
  190.                                 msg->broadcast(msg_code, builder, filter);
  191.                         }
  192.                         else
  193.                         {
  194.                                 std::cout << "it's not the elapse time!" << std::endl;
  195.                         }
  196.                 }
  197.                 default:
  198.                         break;
  199.                 }
  200.         }
  201.         FDB_END_FOREACH_SIGNAL()
  202. }

  203. /*周期性地广播消息给客户端,周期为1500ms*/
  204. CBroadcastTimer::CBroadcastTimer(FDServer *server)
  205.         :CMethodLoopTimer<FDServer>(1500, true, server, &FDServer::broadcastElapseTime)
  206. {}
 楼主| keer_zu 发表于 2022-9-16 18:22 | 显示全部楼层
3.main.cpp
  1. #include"FDServer.h"
  2. #include<iostream>
  3. int main(int argc, char** argv)
  4. {
  5.         FDB_CONTEXT->start();
  6.         FDServer::main_worker.start();
  7.         //for (int i = 1; i < argc; ++i)
  8.         //{
  9.         /*在Name Server中存在一个名为server_name的服务器,客户端通过server_name连接服务器*/
  10.                 std::string server_name = "myService";
  11.                 std::string url(FDB_URL_SVC);
  12.                 url += server_name;
  13.                 server_name += "_server";
  14.                 auto server = new FDServer(server_name.c_str(), &FDServer::main_worker);
  15.                 server->enableWatchdog(true);
  16.                 server->enableUDP(true);
  17.                 server->setExportableLevel(FDB_EXPORTABLE_SITE);
  18.                 server->bind(url.c_str());
  19.         //}
  20.                 std::cout << url << std::endl;
  21.                 std::cout << server_name << std::endl;
  22.         CBaseWorker background_worker;
  23.         background_worker.start(FDB_WORKER_EXE_IN_PLACE);
  24.         return 0;
  25. }
 楼主| keer_zu 发表于 2022-9-16 18:23 | 显示全部楼层
二、客户端
1.FDClient.h
  1. #pragma once
  2. #include<fdbus/fdbus.h>
  3. #include<fdbus/CFdbProtoMsgBuilder.h>
  4. #include<fdbus/cJSON/cJSON.h>
  5. #include<fdbus/CFdbCJsonMsgBuilder.h>

  6. using namespace ipc::fdbus;
  7. class FDClient;
  8. class CInvokeTimer : public CMethodLoopTimer<FDClient>
  9. {
  10. public:
  11.         CInvokeTimer(FDClient *client);
  12. };

  13. class FDClient : public CBaseClient
  14. {
  15. public:
  16.         enum EGroupId
  17.         {
  18.                 GROUP_MASTER,
  19.                 GROUP_1
  20.         };
  21.         enum EMessageId
  22.         {
  23.                 NTF_CJSON_TEST = 128,
  24.                 NTF_GROUP_TEST1 = fdbMakeEventCode(GROUP_1, 0),
  25.                 NTF_GROUP_TEST2 = fdbMakeEventCode(GROUP_1, 1),
  26.                 NTF_GROUP_TEST3 = fdbMakeEventCode(GROUP_1, 2)
  27.         };
  28.         static CBaseWorker main_worker;
  29.         FDClient(const char *name, CBaseWorker *worker = 0);
  30.         void callServer(CMethodLoopTimer<FDClient> *timer);
  31.         ~FDClient();

  32. protected:
  33.         void onOnline(const CFdbOnlineInfo &info);
  34.         void onOffline(const CFdbOnlineInfo &info);
  35.         void onBroadcast(CBaseJob::Ptr &msg_ref);
  36.         void onKickDog(CBaseJob::Ptr &msg_ref);
  37.         void onReply(CBaseJob::Ptr &msg_ref);
  38.         void onStatus(CBaseJob::Ptr &msg_ref, int32_t error_code, const char *description);
  39.         void printMetadata(FdbObjectId_t obj_id, const CFdbMsgMetadata *metadata);

  40. private:
  41.         CInvokeTimer *mTimer;
  42. };
 楼主| keer_zu 发表于 2022-9-16 18:23 | 显示全部楼层
2.FDClient.cpp
  1. #include "FDClient.h"
  2. #include"TempleMsg.pb.h"
  3. #include"CFdbIfPerson.h"

  4. CBaseWorker FDClient::main_worker;
  5. FDClient::FDClient(const char * name, CBaseWorker * worker)
  6.         : CBaseClient(name, worker)
  7. {
  8.         mTimer = new CInvokeTimer(this);
  9.         mTimer->attach(&main_worker, false);
  10. }

  11. /*向服务器发送请求*/
  12. void FDClient::callServer(CMethodLoopTimer<FDClient>* timer)
  13. {
  14.         FDB_LOG_I("****this is client : %s\n", __FUNCTION__);
  15.         NFdbTemple::SongId song_id;
  16.         song_id.set_id(1234);
  17.         CFdbProtoMsgBuilder builder(song_id);

  18.         CBaseJob::Ptr ref(new CBaseMessage(NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA));
  19.         invoke(ref, builder);/*发送至服务器*/

  20.         auto msg = castToMessage<CBaseMessage*>(ref);
  21.         printMetadata(objId(), msg->metadata());

  22.         if (msg->isStatus())
  23.         {
  24.                 int32_t id;
  25.                 std::string reason;
  26.                 if (!msg->decodeStatus(id, reason))
  27.                 {
  28.                         FDB_LOG_E("onReply:fail to decode status\n");
  29.                         return;
  30.                 }
  31.                 FDB_LOG_I("sync reply: status is received: msg code: %d, id: %d, reason: %s\n",
  32.                         msg->code(), id, reason.c_str());
  33.                 return;
  34.         }

  35.         NFdbTemple::NowPlayingDetails now_playing;
  36.         CFdbProtoMsgParser parser(now_playing);
  37.         if (msg->deserialize(parser))
  38.         {
  39.                 auto artist = now_playing.artist().c_str();
  40.                 auto album = now_playing.album().c_str();
  41.                 auto genre = now_playing.genre().c_str();
  42.                 auto title = now_playing.title().c_str();
  43.                 auto file_name = "";
  44.                 if (now_playing.has_file_name())
  45.                 {
  46.                         file_name = now_playing.file_name().c_str();
  47.                 }
  48.                 auto folder_name = "";
  49.                 if (now_playing.has_folder_name())
  50.                 {
  51.                         folder_name = now_playing.folder_name().c_str();
  52.                 }
  53.                 int32_t elapse_time = now_playing.elapse_time();
  54.                 std::cout << artist << album << genre << title << file_name << folder_name << elapse_time << std::endl;
  55.         }
  56.         else
  57.         {
  58.                 FDB_LOG_I("Error! Unable to decode message!!!\n");
  59.         }
  60.         invoke(NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA);
  61. }

  62. FDClient::~FDClient()
  63. {
  64. }

  65. /*客户端连接服务器时响应*/
  66. void FDClient::onOnline(const CFdbOnlineInfo & info)
  67. {
  68.         FDB_LOG_I("client session online: %d, secure: %d\n", info.mSid, info.mQOS);
  69.         mTimer->enable();

  70.         CFdbMsgSubscribeList subscribe_list;
  71.         /*订阅服务器主动推送的广播消息,消息ID与字符串要求和服务器的广播消息保持一致*/
  72.         subscribe_list.addNotifyItem(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, "my_filter");
  73.         subscribe_list.addNotifyItem(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, "raw_buffer");
  74.         subscribe_list.addNotifyItem(NTF_CJSON_TEST);
  75.         subscribe_list.addNotifyGroup(GROUP_1);
  76.         subscribe(subscribe_list, 0, info.mQOS);/*注册广播消息,注册完成系统自动回复*/
  77. }

  78. /*客户端断开时响应*/
  79. void FDClient::onOffline(const CFdbOnlineInfo & info)
  80. {
  81.         FDB_LOG_I("client session off:%d, secure:%d\n", info.mSid, info.mQOS);
  82.         if (info.mFirstOrLast)
  83.         {
  84.                 mTimer->disable();
  85.         }
  86. }
  87. /*收到服务器主动推送的广播消息*/
  88. void FDClient::onBroadcast(CBaseJob::Ptr & msg_ref)
  89. {
  90.         auto msg = castToMessage<CBaseMessage*>(msg_ref);
  91.         FDB_LOG_I("Broadcast is received:%d, filter: %s, qos:%d\n", msg->code(), msg->topic().c_str(), msg->qos());

  92.         switch (msg->code())
  93.         {
  94. /*广播消息有消息ID和消息字符串作为标识*/
  95.         case NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME:
  96.         {
  97.                 std::string filter(msg->topic());
  98.                 if (!filter.compare("my_filter"))
  99.                 {
  100.                         NFdbTemple::ElapseTime eTime;
  101.                         CFdbProtoMsgParser parser(eTime);
  102.                         if (msg->deserialize(parser))
  103.                         {
  104.                                 FDB_LOG_I("elapse time is received: hour: %d, minute: %d, second: %d", eTime.hour(), eTime.minute(), eTime.second());
  105.                                 std::cout << "Broadcast hour: " << eTime.hour() << ", minute: " << eTime.minute() << ", second: " << eTime.second() << std::endl;
  106.                         }
  107.                         else
  108.                         {
  109.                                 FDB_LOG_E("Unable to decode Elapsetime\n");
  110.                         }
  111.                 }
  112.                 else if (!filter.compare("raw_buffer"))
  113.                 {
  114.                         int32_t size = msg->getPayloadSize();
  115.                         std::cout << "Broadcast size: " << size << std::endl;
  116.                         FDB_LOG_I("Broadcast of raw buffer is received: size: %d\n", size);
  117.                 }
  118.         }
  119.         break;
  120.         case NTF_CJSON_TEST:
  121.         {
  122.                 CFdbCJsonMsgParser parser;
  123.                 if (msg->deserialize(parser))
  124.                 {
  125.                         cJSON *f = parser.retrieve();
  126.                         int birthday = 0;
  127.                         int id = 0;
  128.                         const char* name = 0;
  129.                         if (cJSON_IsObject(f))
  130.                         {
  131.                                 cJSON *item = cJSON_GetObjectItem(f, "birthday");
  132.                                 if (item && cJSON_IsNumber(item))
  133.                                 {
  134.                                         birthday = item->valueint;
  135.                                 }
  136.                                 item = cJSON_GetObjectItem(f, "id");
  137.                                 if (item && cJSON_IsNumber(item))
  138.                                 {
  139.                                         id = item->valueint;
  140.                                 }

  141.                                 item = cJSON_GetObjectItem(f, "name");
  142.                                 if (item && cJSON_IsString(item))
  143.                                 {
  144.                                         name = item->valuestring;
  145.                                 }
  146.                                 std::cout << "Broadcast json: birthday: " << birthday << ", id: " << id << ", name: " << name << std::endl;
  147.                                 FDB_LOG_I("Broadcast of JSON is: birthday: %d, id: %d, name: %s\n", birthday, id, name);
  148.                         }
  149.                 }
  150.                 else
  151.                 {
  152.                         FDB_LOG_E("Broadcast of JSON is: with error!\n");
  153.                 }
  154.                 break;
  155.         }
  156.         case NTF_GROUP_TEST1:
  157.         case NTF_GROUP_TEST2:
  158.         case NTF_GROUP_TEST3:
  159.                 FDB_LOG_I("Broadcast of group message %d is received, Init:%d\n", fdbMakeEventCode(msg->code()), msg->isInitialResponse());
  160.                 std::cout << "Broadcast of group message: " << msg->code() << ", init: " << msg->isInitialResponse() << std::endl;
  161.                 break;
  162.         default:
  163.                 break;
  164.         }
  165. }

  166. void FDClient::onKickDog(CBaseJob::Ptr & msg_ref)
  167. {
  168.         CFdbMessage::kickDog(msg_ref, worker(), [](CBaseJob::Ptr &msg_ref) {
  169.                 CFdbMessage::feedDog(msg_ref);
  170.         });
  171. }
  172. /*异步请求时,通过该回调函数获得server回复*/
  173. void FDClient::onReply(CBaseJob::Ptr & msg_ref)
  174. {
  175.         auto msg = castToMessage<CBaseMessage*>(msg_ref);
  176.         FDB_LOG_I("response is received. sn: %d\n", msg->sn());

  177.         printMetadata(objId(), msg->metadata());

  178.         switch (msg->code())
  179.         {
  180.         case NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA:
  181.         {
  182.                 if (msg->isStatus())
  183.                 {
  184.                         if (msg->isError())
  185.                         {
  186.                                 int32_t error_code;
  187.                                 std::string reason;
  188.                                 if (!msg->decodeStatus(error_code, reason))
  189.                                 {
  190.                                         FDB_LOG_E("onReply:fail to decode status\n");
  191.                                         return;
  192.                                 }
  193.                                 FDB_LOG_I("onReply: status is received. msg code: %d, error code: %d, reason: %s\n",
  194.                                         msg->code(), error_code, reason.c_str());
  195.                         }
  196.                         return;
  197.                 }
  198.                 NFdbTemple::NowPlayingDetails now_playing;
  199.                 CFdbProtoMsgParser parser(now_playing);
  200.                 if (msg->deserialize(parser))
  201.                 {
  202.                         auto artist = now_playing.artist().c_str();
  203.                         auto album = now_playing.album().c_str();
  204.                         auto genre = now_playing.genre().c_str();
  205.                         auto title = now_playing.title().c_str();
  206.                         auto file_name = "";
  207.                         if (now_playing.has_file_name())
  208.                         {
  209.                                 file_name = now_playing.file_name().c_str();
  210.                         }
  211.                         auto folder_name = "";
  212.                         if (now_playing.has_folder_name())
  213.                         {
  214.                                 folder_name = now_playing.folder_name().c_str();
  215.                         }
  216.                         int32_t elapse_time = now_playing.elapse_time();
  217.                         FDB_LOG_I("async reply: artist: %s, album: %s, genre: %s, title: %s, file name: %s, folder name: %s",
  218.                                 artist, album, genre, title, file_name, folder_name);
  219.                         std::cout << "async from server: artist: " << artist << ", album: " << album << ", genre: " << genre << ", title:" << title << ", file name: " << file_name
  220.                                 << ", folder name: " << folder_name << std::endl;
  221.                 }
  222.                 else
  223.                 {
  224.                         FDB_LOG_I("Error, unable to decode message\n");
  225.                 }
  226.         }
  227.         break;
  228.         case NFdbTemple::FdbMediaSvcMsgId::REQ_RAWDATA:
  229.         {
  230.                 if (msg->isStatus())
  231.                 {
  232.                         int32_t error_code;
  233.                         std::string reason;
  234.                         if (!msg->decodeStatus(error_code, reason))
  235.                         {
  236.                                 FDB_LOG_E("onReply: fail to decode status\n");
  237.                                 return;
  238.                         }
  239.                         FDB_LOG_I("onReply: msg code: %d, error code: %d, reason: %s\n", msg->code(), error_code, reason);
  240.                         return;
  241.                 }

  242.                 CFdbParcelableArray<CPerson> persions;
  243.                 CFdbParcelableParser parser(persions);
  244.                 if (!msg->deserialize(parser))
  245.                 {
  246.                         FDB_LOG_E("onReply: fail to decode from simple parser\n");
  247.                         return;
  248.                 }
  249.                 std::ostringstream stream;
  250.                 (void)persions.format(stream);
  251.                 FDB_LOG_I("onReply:%s\n", stream.str().c_str());
  252.                 std::cout << "reply from server:" << stream.str().c_str() << std::endl;
  253.         }
  254.         break;
  255.         default:
  256.                 break;
  257.         }
  258. }
  259. /*注册服务器广播消息后的回复*/
  260. void FDClient::onStatus(CBaseJob::Ptr & msg_ref, int32_t error_code, const char * description)
  261. {
  262.         auto msg = castToMessage<CBaseMessage*>(msg_ref);
  263.         if (msg->isSubscribe())
  264.         {
  265.                 if (!msg->isError())
  266.                 {
  267.                         FDB_LOG_I("subscribe is ok, sn:%d\n", msg->sn());
  268.                 }
  269.         }
  270.         FDB_LOG_I("reason: %s\n", description);
  271. }

  272. void FDClient::printMetadata(FdbObjectId_t obj_id, const CFdbMsgMetadata * metadata)
  273. {
  274.         uint64_t time_c2s;
  275.         uint64_t time_s2r;
  276.         uint64_t time_r2c;
  277.         uint64_t time_total;
  278.         CFdbMessage::parseTimestamp(metadata, time_c2s, time_s2r, time_r2c, time_total);
  279.         FDB_LOG_I("obj:%d, server:%llu, reply:%llu, receive:%llu, total:%llu\n",
  280.                 obj_id, time_c2s, time_s2r, time_r2c, time_total);
  281. }

  282. /*周期性地向服务器发送请求*/
  283. CInvokeTimer::CInvokeTimer(FDClient *client)
  284.         :CMethodLoopTimer<FDClient>(1000, true, client, &FDClient::callServer)
  285. {}
 楼主| keer_zu 发表于 2022-9-16 18:24 | 显示全部楼层
3.main.cpp  (客户端)
  1. #include "FDClient.h"

  2. int main(int argc, char **argv)
  3. {
  4.         FDB_CONTEXT->start();
  5.         fdbLogAppendLineEnd(true);
  6.         FDB_CONTEXT->registerNsWatchdogListener([](const tNsWatchdogList &dropped_list)
  7.         {
  8.                 for (auto it = dropped_list.begin(); it != dropped_list.end(); ++it)
  9.                 {
  10.                         FDB_LOG_F("Error!!! name: %s, pid: %d\n", it->mClientName.c_str(), it->mPid);
  11.                 }
  12.         });
  13.         FDClient::main_worker.start();

  14.         //for (int i = 1; i < argc; ++i)
  15.         //{
  16.         /*客户端向server_name服务器发起连接请求*/
  17.                 std::string server_name = "myService";
  18.                 std::string url(FDB_URL_SVC);
  19.                 url += server_name;
  20.                 server_name += "_client";
  21.                 auto client = new FDClient(server_name.c_str(), &FDClient::main_worker);

  22.                 client->enableReconnect(true);
  23.                 client->enableUDP(true);
  24.                 client->enableTimeStamp(true);
  25.                 client->connect(url.c_str());
  26.         //}
  27.                 std::cout << url.c_str() << std::endl;
  28.                 std::cout << server_name << std::endl;
  29.         CBaseWorker background_worker;
  30.         background_worker.start(FDB_WORKER_EXE_IN_PLACE);
  31.         return 0;
  32. }
 楼主| keer_zu 发表于 2022-9-16 18:24 | 显示全部楼层
三、接口说明
1. CBaseLoopTimer(int32_t interval, bool repeat = false)

注: Interval代表Timer的时间间隔;

repeat表示创建的是cyclic Timer还是one-shot Timer;一旦使能后,cyclic Timer会以interval毫秒为周期反复执行;one-shot Timer在interval毫秒超时后不再执行。

2. attach(CBaseWorker *worker, bool enb = true)

注: 指定运行Timer的Worker。只有指定了Worker后Timer才能开始工作。超时后,Timer的run()函数将在该Worker上执行。 如果enb为true,Timer立刻开始在指定的Worker上执行;否则可以将来用enable()启动。

3.enable(int32_t interval = -1)

注:使能Timer。使能后的Timer将在指定的Worker上工作。如果调用该函数时Timer正在运行,那么超时时间将被重置为interval毫秒之后。

备注:代码中关于protobuf部分是与通信相关的,可以不用过多关注,当用于实际项目时,根据实际情况定义响应的protobuf数据就可以。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1477

主题

12909

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部