jsonrpc-c交叉编译测试
创始人
2024-06-02 18:25:00
0

文章目录

  • 一、环境搭建
    • 1.编译libev,jsonrpc
    • 2.交叉编译
  • 二、编译并运行代码
    • 1.makefile
    • 2.server.c
    • 3.编译测试
        • 测试结果如下
  • 三、jsonrpc相关概念
      • 请求对象
        • 注意:
      • 响应对象
        • 注意:
      • 错误对象

一、环境搭建

需要的资源如下:

libev,jsonrpc-c

https://codeload.github.com/enki/libev/zip/refs/heads/master

https://codeload.github.com/hmng/jsonrpc-c/zip/refs/heads/master

1.编译libev,jsonrpc

参考:编译jsonrpc

lib_make.sh

#!/bin/sh
# @Author: yyh
# @Date:   2023-03-13 12:55:16
# @Last Modified by:   yyh
# @Last Modified time: 2023-03-13 14:22:45sudo mkdir ~/lib_srouce_code/
case $1 in"libev")  cp libev-master.zip ~/lib_srouce_code/cd ~/lib_srouce_code/unzip -x libev-master.zip -d ~/lib_srouce_code/cd ~/lib_srouce_code/libev-masterif [ $2 = "ubuntu" ] ; then#ubuntu16.04sudo mkdir compile_result_ubuntu16/./configure  --prefix=$(pwd)/compile_result_ubuntu16elif [ $2 = "mipsel" ]; then#mipselsudo mkdir compile_result_mipsel/./configure --prefix=$(pwd)/compile_result_mipsel --host=mipsel-openwrt-linux CC=/opt/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-gcc CXX=/opt/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-musl-g++`STAGING_DIR=/opt/toolchain-mipsel_24kc_gcc-8.4.0_musl/`fisudo make cleansudo make sudo make install;;"jsonrpc")cp jsonrpc-c-arma_stable.tar.gz ~/lib_srouce_code/tar -xzvf jsonrpc-c-arma_stable.tar.gz -C ~/lib_srouce_code/cd ~/lib_srouce_code/jsonrpc-c-arma_stableautoreconf -iif [[ $2 = "ubuntu" ]]; then#ubuntu16.04sudo mkdir compile_result_ubuntu16/./configure --prefix=$(pwd)/compile_result_ubuntu16 --enable-shared# elif [[ $2 = "mipsel" ]]; then#     #mipsel#     sudo mkdir compile_result_mipsel/#     ./configure --prefix=$(pwd)/compile_result_mipsel --host=mipsel-openwrt-linux CC=/opt/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-gcc CXX=/opt/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-musl-g++#     `STAGING_DIR=/opt/toolchain-mipsel_24kc_gcc-8.4.0_musl/`fisudo make cleansudo makesudo make install;;"install")   #先编译libev和jsonrpc-c,后install,编译目标环境需一致if [ $2 = "ubuntu" ]; thensudo mkdir ubuntu_test_code/sudo cp ~/lib_srouce_code/libev-master/compile_result_ubuntu16/* ./ubuntu_test_code -rf -p         #-p 保留源文件或目录的属性sudo cp ~/lib_srouce_code/jsonrpc-c-arma_stable/compile_result_ubuntu16/* ./ubuntu_test_code -rf -pelif [ $2 = "mipsel" ]; thensudo mkdir mipsel_test_code/sudo cp ~/lib_srouce_code/jsonrpc-c-arma_stable/src/*.c         ./mipsel_test_code -rf -psudo cp ~/lib_srouce_code/jsonrpc-c-arma_stable/include/*.h     ./mipsel_test_code -rf -psudo cp ~/lib_srouce_code/libev-master/compile_result_mipsel/*     ./mipsel_test_code -rf -p         #-p 保留源文件或目录的属性sudo cp ./mipsel_test_code/lib/libev.so.4.0.0  ./mipsel_test_code/lib/libev.sosudo cp ./mipsel_test_code/lib/libev.so.4.0.0  ./mipsel_test_code/lib/libev.so.4 sudo cp ./mipsel_test_code/*.h   ./mipsel_test_code/include/# sudo cp ~/lib_srouce_code/jsonrpc-c-arma_stable/compile_result_mipsel/* ./mipsel_test_code -rf -pfi;;# *)  echo '你没有输入 1 到 4 之间的数字'# ;;
esac##./lib_make.sh libev mipsel
##./lib_make.sh install mipsel##./lib_make.sh libev ubuntu
##./lib_make.sh jsonrpc ubuntu
##./lib_make.sh install ubuntu

2.交叉编译

./lib_make.sh libev mipsel
./lib_make.sh install mipsel

进入mipsel_test_code目录相关文件如下

在这里插入图片描述

二、编译并运行代码

在这里插入图片描述

1.makefile

CC=/opt/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-gcc# LIBEV_DIR=/home/yyh/lib_srouce_code/libev-master/compile_result_mipsel
LIBEV_DIR=.
LIBEV_DIR=.
CFLAGS =  -I${LIBEV_DIR}/include -L${LIBEV_DIR}/lib 
LDAGS = -levTARGET = testall:$(CC) -o $(TARGET) *.c $(CFLAGS)  $(LDAGS).PHONY:clean
clean:rm -rf *.o $(TARGET)

2.server.c

/*
* @Author: yyh
* @Date:   2023-03-11 16:00:39
* @Last Modified by:   yyh
* @Last Modified time: 2023-03-13 12:49:36
*/
#include   
#include   
#include   
#include   
#include   
#include   
#include  
#include  
#include  
#include  
#include  
#include   
#include  "jsonrpc-c.h"#define  PORT 1234   // the port users will be connecting to
#define  GET_KEY_SIZE 10    //键值对  键参数个数
#define  STRKEY_SIZE 20     //键的大小
#define  STRVAL_SIZE 20     //值的大小struct  jrpc_server my_server;
cJSON *my_root;
cJSON * say_hello(  jrpc_context  * ctx, cJSON * params, cJSON *id) {return  cJSON_CreateString(  "Hello!"  );
}cJSON * exit_server(  jrpc_context  * ctx, cJSON * params, cJSON *id) {jrpc_server_stop(&my_server);return  cJSON_CreateString(  "Bye!"  );
}static char *get_key(char *s)//从一个json object对象中获取key
{char key[STRKEY_SIZE];char *pf,*pb;int len;pf=strchr(s, '\"');pb=strchr(pf+1, '\"');len = pb - pf - 1;memcpy(key, pf + 1, len);key[len]='\0';return strdup(key);
}//echo "{\"method\":\"state_set\",\"params\":[{\"hello\":\"world\"}],\"id\":\"2\"}" | nc localhost 1234
cJSON * mystate_set(jrpc_context * ctx, cJSON * params, cJSON *id) { //设置键值对if(params == NULL){//获取参数失败ctx->error_code = 1;ctx->error_message=strdup("err_key)");ctx->data = strdup("err_value");return NULL;}int arrSize=cJSON_GetArraySize(params);//设置的获取参数个数int i,j;cJSON *vals,*dst_val;if(params->type == cJSON_Array){        for(i=0;i           //获取每个参数对象vals = cJSON_GetArrayItem(params,i);if(vals->type == cJSON_Object){char *s = cJSON_PrintUnformatted(vals); //将一个jison object对象转为字符串char *key = get_key(s);                 //获取json object对象中的keycJSON *value = cJSON_GetObjectItem(vals,key);//通过key获取值if(value == NULL){                      return cJSON_CreateString("bad key! bad value!");//格式错误}cJSON *item = cJSON_GetObjectItem(my_root,key);if(item != NULL)                         //如果原来json数据中存在该键值则删除cJSON_DeleteItemFromObject(my_root,key);cJSON_AddItemToObject(my_root,key,cJSON_CreateString(value->valuestring));//添加新的键值对 free(s);free(key);}} }return  cJSON_CreateString("set success!");
}//echo "{\"method\":\"state_get\",\"params\":[\"hello\"],\"id\":\"1\"}" | nc localhost 1234
cJSON * mystate_get(  jrpc_context  * ctx, cJSON * params, cJSON *id) { //通过键获取值if(params == NULL){ctx->error_code = 1;ctx->error_message=strdup("err_key)");ctx->data = strdup("err_value");return NULL;}int arrSize=cJSON_GetArraySize(params);char *get_key[GET_KEY_SIZE];char *res_val[GET_KEY_SIZE];int i,j;cJSON *vals,*dst_val;if(params->type == cJSON_Array){for(i=0;ivals = cJSON_GetArrayItem(params,i);if(vals->type == cJSON_String){get_key[i]=vals->valuestring;}} }int count=0;for(j=0;jdst_val=cJSON_GetObjectItem(my_root,get_key[j]);if(dst_val != NULL){if(dst_val->type = cJSON_String){res_val[count++]=dst_val->valuestring;}}}cJSON *res;res = cJSON_CreateArray();      //创建result参数返回对应值for(j=0;jcJSON_AddItemToArray(res,cJSON_CreateString(res_val[j]));}if(cJSON_GetArraySize(res) == 0)    //没有找到对应的value{ctx->error_code = 1;ctx->error_message=strdup("no such value!");return NULL;}return  res;
}int  main(  void  ) {jrpc_server_init(&my_server, PORT);//创建原始数据 json格式my_root = cJSON_CreateObject();cJSON_AddItemToObject(my_root,"jsonrpc",cJSON_CreateString("2.0"));cJSON_AddItemToObject(my_root,"method",cJSON_CreateString("DeviceUpLoadInfo"));cJSON_AddItemToObject(my_root,"id",cJSON_CreateString("76BFCDDE4D2C"));cJSON_AddItemToObject(my_root,"params",cJSON_CreateString("src"));cJSON_AddItemToObject(my_root,"ip",cJSON_CreateString("192.168.5.148"));cJSON_AddItemToObject(my_root,"time",cJSON_CreateString("2023-3-1 18:02:41"));cJSON_AddItemToObject(my_root,"rfidinfo",cJSON_CreateString("075583849888190308020911_e280110c20007781e8440985_000000000000000000000000"));cJSON_AddItemToObject(my_root,"picType",cJSON_CreateString("src"));cJSON_AddItemToObject(my_root,"picdata",cJSON_CreateString("person123"));cJSON_AddItemToObject(my_root,"hello",cJSON_CreateString("world"));//注冊俩方法jrpc_register_procedure(&my_server, say_hello,  "sayHello"  , NULL );jrpc_register_procedure(&my_server, mystate_set,"state_set",NULL);jrpc_register_procedure(&my_server, mystate_get,"state_get",NULL);jrpc_register_procedure(&my_server, exit_server,  "exit"  , NULL );jrpc_server_run(&my_server);jrpc_server_destroy(&my_server);return  0;
}

3.编译测试

在这里插入图片描述

在这里插入图片描述

#!/bin/sh
# @Author: yyh
# @Date:   2023-03-13 14:42:11
# @Last Modified by:   yyh
# @Last Modified time: 2023-03-13 14:53:56PC_IP=192.168.5.148
MYLIBDIR=/tmp/lib 
MYINCDIR=/tmp/include 
my_eth=eth0.1# string=`ifconfig $my_eth`
# string=${string#*inet addr:}
# string=${string%%  Bcast*}
# echo $string
# string=192.168.5.241cd /tmp
chmod 0777 /tmp/*
mkdir $MYLIBDIR -p
mkdir $MYINCDIR -p
if [ $1 = "get_lib" ]cd $MYLIBDIRtftp -g -r libev.a             $PC_IPtftp -g -r libev.la         $PC_IPtftp -g -r libev.so         $PC_IPtftp -g -r libev.so.4       $PC_IPtftp -g -r libev.so.4.0.0   $PC_IP
elif [ $1 = "get_inc" ]
thencd $MYINCDIRtftp -g -r cJSON.h             $PC_IPtftp -g -r jsonrpc-c.h         $PC_IPtftp -g -r event.h             $PC_IPtftp -g -r ev++.h             $PC_IPtftp -g -r ev.h             $PC_IPelif [ $1 = "get_test" ]
thentftp -g -r test     $PC_IPchmod 0777 ./*
elif [ $1 = "path_set" ]
thenexport C_INCLUDE_PATH=$C_INCLUDE_PATH:/tmp/includeexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/libecho $C_INCLUDE_PATH  echo $LD_LIBRARY_PATH
fi
chmod 0777 /tmp/*

测试结果如下

运行./test

PC运行测试脚本

在这里插入图片描述

三、jsonrpc相关概念

JSON-RPC,是一个无状态且轻量级的远程过程调用(RPC)传送协议,其传递内容透过 JSON 为主

请求对象

一个请求对象包含下列成员:
jsonrpc
method
params
id

注意:

params参数结构必须是数组,或者数组对象
例如:

"params":["hello","world"]
"params":[{"hello":"world"},{"key":"value"}]

响应对象

jsonrpc
result
error
id

注意:

响应对象必须包含 result 或 error 字段,但两个字段不能同时存在。

错误对象

code
message
data

相关内容

热门资讯

实验室里“加速跑” 这里用创新... 来源:人民网 国产HPV疫苗、鼻喷新冠疫苗、氢能电解装置、Micro LED中试平台……在厦门,科技...
注意防范!台风“丹娜丝”或于7... 新京报讯 据中央气象台官微消息,南海热带低压已于5日2时在南海东北部海面上加强为今年第4号台风“丹娜...
宜昌通报6起失实检举控告澄清正... 转自:北京日报客户端湖北宜昌7月4日通报6起失实检举控告澄清正名和查处诬告陷害典型案例。一、对枝江市...
江苏一网友称收到超速罚单显示速... 据杭州日报消息,江苏一网友称,自己于7月1日收到一张超速罚单,显示其于无锡凤翔快速路上超速,平均速度...
中国中铁全资子公司新增一项34... (转自:快查一企业中标了)快查APP显示,中国中铁相关公司中铁建工集团有限公司于2025年7月3日发...
上海乐高乐园开园,游客提前两小... 转自:上观新闻“5、4、3、2、1,上海乐高乐园正式向全球宾客敞开大门,属于上海的奇幻之旅即刻启程!...
美军方暂停一个关联马斯克企业的... 转自:新华网  新华社北京7月5日电 美国媒体最近报道,美国空军已暂停一个货运火箭试飞项目,缘由关联...
甘肃省公航旅陇南分公司44小时...   经过44个小时的昼夜奋战,省公航旅集团高速公路运营管理陇南分公司管理运营的武罐高速两处水毁路基悬...
*ST四通:预计上半年营收超1... 7月4日晚间,*ST四通(603838)发布公告,预计2025年半年度实现营业收入1.65亿元到1....
亮马河畔来了“国际小河长”,首... 转自:北京日报客户端7月5日,由朝阳区麦子店街道主办的“国际小河长·与世界同航·共绘幸福河湖”主题活...