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

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...