1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          erpc入門筆記

          來源:互聯網轉載 時間:2024-01-29 07:39:23

          RPC

          最近在忙一個IOT設備的項目,想設計一個通信系統通過串口控制設備(freertos)的運行。按照傳統的設計思路,先要定義一套串口通信協議,在這套協議中傳輸層協議、應用層協議一個都不能少。每一層協議都要自己實現。數據編碼/解碼,數據校驗,容錯,這些非?;A的東西都要自己實現。 等這些協議都實現了,才是能開始設計真正的業務邏輯。 和同事商議后,一致認為要是照這么干,黃花菜都涼了。我們的生命不能浪費在這些無意義的勞動上! 我想到了RPC概念是適用于我們的應用場景的。實際我們就是在串口上實現一個客戶端請求->服務端響應的模型。除了傳輸層是串行通信,這與我們一般在tcp/ip網絡上常見的client/server模型沒啥區別,就是1對1簡化版的client/server模型。比如也許google的基于protocol bufffers的grpc就能滿足要求。如果能利用現成的開發框架,可以大大減化開發流程,減少開發時間。

          定義下了RPC這個開發方向后我和同事分頭去網上找相關資料,進行開發框架的選型調研。最終同事找到了恩智浦(NXP)的開源項目erpc(EmbeddedRPC)??吹竭@個項目說明,我感覺它就是為我們量身定做的。

          https://github.com/EmbeddedRPC/erpc

          eRPC (Embedded RPC) is an open source Remote Procedure Call (RPC) system for multichip embedded systems and heterogeneous multicore SoCs. eRPC (embeddedreprocedure-Call)是一個面向多芯片嵌入式系統和異構多核soc的開源RPC框架。

          哇哦,與grpc面向通用tcp網絡不同,erpc就是面向嵌入式系統設計的。體積還很小(根據官方介紹可以小到5KB)。完美,下面的事情就是入門學習了。

          erpc目前支持的傳輸層如下,除了我不認識的協議外,主要就是串口通信和TCP/IP了,TCP/IP主要用于測試:

          Supported transports: CMSIS UART NXP Kinetis SPI and DSPI POSIX and Windows serial port TCP/IP (mostly for testing) NXP RPMsg-Lite

          也就是說我們可以在不依賴具體設備的情況通過使用TCP/IP傳輸層模擬串口,就可以x86平臺的電腦上實現RPC調用的兩端(client/server)的模擬通信了。采用這方式無疑可以大大提高開發效率–不需要所有的測試都在具備硬件設備上運行,PC模擬可以快捷方便的完成很多事件。

          于是我們重新開始在ubuntu 16.04下開始了erpc搭建通信框架的過程

          編譯準備

          安裝依賴庫

          # install flex & bisonsudo apt-get install flex bison# install boostsudo apt-get install libboost-dev libboost-system-dev libboost-filesystem-dev

          下載erpc

          克隆erpc 項目到本地(erpc文件夾)

          git clone https://github.com/EmbeddedRPC/erpc.git

          erpcgen : IDL編譯器

          erpcgen是IDL編譯器,用于將.erpc后綴的接口定義(IDL)文件生成對應的client/server代碼。 進入erpc/erpcgen子項目編譯erpcgen并安裝到/usr/local/bin下:

          cd erpc/erpcgenmake -j8sudo make install 

          NOTE: -j8 為并行編譯選項,指定使用8個線程同時編譯,以加快編譯速度

          eprc : erpc核心庫

          erpc/erpc_c下是erpc的核心庫,需要編譯供后續項目使用

          cd erpc/erpcgenmake -j8# 默認安裝到 /usr/local/include/erpc /usr/local/libsudo make install 

          定義IDL

          上面的一切都準備就緒了,接口定義就是我們最關注的業務邏輯了,如下定義一個簡單的IDL,這個接口中只有一個函數: erpcdemo.erpc

          /*! 定義項目名稱,也是所有生成的源碼文件名前綴 */program erpcdemo/*! 定義返回狀態枚舉類型 */enum lockErrors_t{  lErrorOk_c = 0,  lErrorOutofMemory_c,  // ......定義狀態碼  // 最大枚舉類型值  lErrorMaxError_c}/*! 定義服務接口函數 */interface DEMO {    RD_demoHello(binary txInput) -> binary}

          IDL語法參見erpc官方文檔:

          《IDL Reference(https://github.com/EmbeddedRPC/erpc/wiki/IDL-Reference)》

          生成代碼

          根據接口定義文件erpcdemo.erpc生成對應的client/server代碼

          erpcgen erpcdemo.erpc

          NOTE: 事前必須先執行erpcgen編譯安裝。

          生成的文件列表:

          erpcdemo.herpcdemo_client.cpperpcdemo_server.cpperpcdemo_server.h

          Client測試程序

          基于上述生成的代碼可以很簡單的寫出client端測試程序

          /* * test_erpcdemo_client.c * *  Created on: Apr 14, 2020 *      Author: guyadong */#include <string.h>#include <iostream>#include <erpc_client_setup.h>#include <erpc_port.h>#include "erpcdemo.h"#include "erpc_setup_tcp.h"using namespace std;// 釋放binary占用的空間static void free_binary_t_struct(binary_t * data){    if (data->data)    {        erpc_free(data->data);    }}int main(int argc, char *argv[]){/* 創建client端傳輸層對象(TCP),127.0.0.1:5407 */auto transport = erpc_transport_tcp_init("127.0.0.1",5407, false);auto message_buffer_factory = erpc_mbf_dynamic_init();/* 初始化客戶端 */erpc_client_init(transport,message_buffer_factory);auto msg = "hello!!!!!";binary_t b = {(uint8_t*)msg,(uint32_t)strlen(msg)};{/* RPC 調用 */auto resp = RD_demoHello(&b);/* 輸出返回值 */cout << "RD_demoHello response:" << resp->data << endl;/* 對于返回指針類型的數據,用完后需要釋放RD_demoHello中分配的內存 */free_binary_t_struct(resp);}/* 關閉socket */erpc_transport_tcp_deinit();}

          Server端測試程序

          基于上述生成的代碼可以很簡單的寫出server端測試程序,與client測試程序不同的是,server端要提供接口函數的具體實現

          /* * test_erpcdemo_server.cpp * *  Created on: Apr 15, 2020 *      Author: guyadong */#include <iostream>#include <time.h>#include <chrono>#include <iomanip>#include <sstream>#include <string.h>#include <erpc_server_setup.h>#include "erpcdemo_server.h"#include "erpc_setup_tcp.h"using namespace std;/** 返回當前時間字符串 */static std::string now_str() {time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());std::stringstream ss;ss << std::put_time(std::localtime(&t), "%F %T");return ss.str();}/** servicer端實現接口方法 */binary_t * RD_demoHello(const binary_t * txInput){cout << "RD_demoHello called" << endl;string o ((char*)txInput->data);o.append("@").append(now_str());auto ol = strlen(o.c_str());char* buf = (char*)malloc(ol + 1);strncpy(buf,o.c_str(),ol);return new binary_t{(uint8_t*)buf,(uint32_t)ol};}int main(int argc, char *argv[]){// 創建client端傳輸層對象(TCP),127.0.0.1:5407auto transport = erpc_transport_tcp_init("127.0.0.1",5407, true);/* MessageBufferFactory initialization */erpc_mbf_t message_buffer_factory = erpc_mbf_dynamic_init();/* eRPC 服務端初始化 */erpc_server_init(transport, message_buffer_factory);/** 將生成的接口服務DEMO添加到server, 參見生成的源文件 erpcdemo_server.h */erpc_add_service_to_server(create_DEMO_service());cout << "start erpcdemo server" << endl;/* 啟動服務器 */erpc_server_run(); /* or erpc_server_poll(); *//* 關閉socket */erpc_transport_tcp_deinit();return 0;}

          分別編譯 test_erpcdemo_server.cpp,test_erpcdemo_client.cpp,我們就有了在linux下運行的一個最簡單的基于erpc的RPC演示系統。

          NOTE: 如果你會用cygwin,就不必要在ubuntu下執行,可以在windows平臺 cygwin terminal下執行上述所有過程。上面的截圖就是windows下的cygwin 終端執行的效果

          總結

          在上面的過程中,涉及數據傳輸,序列化,反序列,校驗等等底層的細節都由erpc完成了。我們只是關注于定義業務接口本身,確實方便了好多啊。

          完整代碼

          本文所涉及的所有源碼的完整代碼及詳細說明參見碼云倉庫:

          https://gitee.com/l0km/erpcdemo.git

          標簽:erpc-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          十大冰淇淋加盟品牌哪個最好?比如雪樂威,伊莎,哈根達斯,泰九號線,可愛的雪,這些都挺好的。冰淇淋加盟費用最低得多少錢?冰淇淋的加盟費包括品牌使用費、保證金、品牌管理費等。但是冰淇淋一般加盟費都不高,2-3萬不等,實際需要根據市場來預算。冰淇淋是一種體積膨脹的冷凍食品,由飲用水、牛奶、奶粉、奶油(或植物油)、糖等制成。為主要原料,并添加適當的食品添加劑,通過混合,殺菌,均質,老化,冷凍,硬化等過程。...

          900泰銖和1億日元是人民幣要多少錢?1泰銖=0.1761人民幣,900泰銖=158.49人民幣.1日元=0.0529人民幣,100000000日元=5290000人民幣世界各國金錢的匯率是多少?1美金=6.8345元人民幣1元=12.457元人民幣1瑞士法郎=6.206元人民幣1加元=6.435元人民幣1新加坡幣=4.823元人民幣1澳幣=5.867元人民幣1元人民幣=4.616臺幣1元人民幣=...

          北華大學北校區怎么樣?北校區是北華三個校區中最老的,但北校區的宿舍條件是三個校區中最好的。今年9月,學校只剩下少量的六人宿舍,大部分都是四人宿舍。學校周邊屬于吉林偏遠地區,環境比較混亂,但是北校區還是可以滿足你正常的學習和生活的??傊?,北華完全有資格為你的成功。北華大學北校區多少人?北校區有16300多名學生。北華大學,簡稱北華,位于吉林省吉林市。是吉林省規模最大的綜合性重點大學,“卓越博士教育培...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>