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

相关内容

热门资讯

“倾听您的心声,服务您的需求”... 中国人民人寿保险股份有限公司(以下简称“人保寿险”)“倾听您的心声 服务您的需求”第十七届客户节于2...
佩斯科夫:俄不会对媒体有关俄乌... 转自:财联社【佩斯科夫:俄不会对媒体有关俄乌谈判报道发表评论】财联社5月18日电,据塔斯社当地时间1...
穆杰,调任新职 编辑 | 余晖山东省人民政府近日发布任免通知,山东省人民政府决定,任命穆杰为山东省煤田地质局副局长。...
融合文化、体育与生态,房山举办... 新京报讯(记者陈璐)5月18日,“登峰揽胜在房山”山地绿道徒步活动在房山区周口店镇永寿禅寺广场启幕。...
5月19日,“同”赴一场有“法... 【5月19日,“同”赴一场有“法”的旅行】锦绣河山,美好旅程。在第15个中国旅游日,人民法院新闻传媒...
探索电影+旅游的创新合作,盐城... 转自:上观新闻当120年胶片齿轮撞上Z世代的赛博心跳,一座城正用“轻舟计划”重构青年与电影的时空契约...
十位艺术大师联袂,绘就江南诗意... 转自:上观新闻艺术的笔触邂逅江南的灵韵,共赏“吴越江南”的水墨诗意。近日,位于闵行区万源路2800号...
痛惜!突发呼吸心跳骤停,他于深... 南京艺术学院5月17日发布讣告:南京艺术学院教授、博士生导师尹悟铭同志,因突发呼吸心跳骤停,经抢救无...
2024年我国卫星导航产业产值... 原标题:2024年我国卫星导航产业产值达5758亿元来源:人民日报客户端5月18日,中国卫星导航定位...
龙牙刀、结界兽、天元鼎……《哪... 新京报记者 展圣洁 编辑 白爽 校对 赵琳5月19日,年度重磅特展——“看·见殷商”展览将在北京大运...
中国铁建相关公司中标一项349... (转自:快查一企业中标了)快查APP显示,中国铁建相关公司中铁十八局集团有限公司于2025年5月15...
上海家庭医生签约数超1100万... 转自:中工网中新网上海5月18日电 (记者 陈静)家庭医生是居民健康的“第一道防线”。世界家庭医生日...
50多岁2女子无视预警爬野山被... 转自:京报网_北京日报官方网站 【#50多岁2女子无视预...
广东建工全资子公司中标一项31... (转自:快查一企业中标了)快查APP显示,广东建工相关公司广东省基础工程集团有限公司于2025年5月...
从工具到生态:金融科技的角色升... 转自:企业观察网数字金融,作为传统金融与现代信息技术深度融合的产物,正在重塑金融业务模式的底层逻辑。...
义乌至迪拜“铁海快线+中东快航... 5月18日,澎湃新闻(www.thepaper.cn)记者从中国铁路上海局集团有限公司(以下简称“上...
文化中国行|探寻国宝里的中国智... 03:12今年5月18日是第49个国际博物馆日。山西历史悠久,素有“地上文物看山西”的美誉。山西博物...
祝姜同学前程似锦!救人小伙姜昭... 来源:人民日报 【祝姜同学前程似锦!#救人小伙姜昭鹏完成...
印度南部一建筑起火,至少17人... 转自:上观新闻当地时间5月18日,印度南部特伦甘纳邦海得拉巴市一栋建筑发生火灾,目前已造成至少17人...
墨西哥海军船只撞上布鲁克林大桥... 转自:央视新闻  当地时间17日晚,一艘载有277人的墨西哥海军大型帆船在穿越美国纽约布鲁克林大桥时...