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

相关内容

热门资讯

甘肃文县强降雨致两条国道交通中... 转自:千龙网7月4日至5日,受持续强降雨影响,甘肃省陇南市文县境内国道212线K593+900天阴桥...
锤炼“空中飞人” 硬实力 转自:衢州日报  近日,衢州市龙游县消防救援大队联合县应急管理局、蓝天救援队、民安救援队、山野救援队...
今夜!史诗级,外卖大战!   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 【导读】7月5日晚间...
科技赋能,让文化产业迸发新活力 转自:衢州日报  张方  近日,第二十一届中国(深圳)国际文化产业博览交易会落下帷幕。这是我国文化产...
品质优才能品牌强 转自:衢州日报  乔金亮  品牌是农业竞争力的体现。从国际看,农业强国无不是农业品牌强国。当前全球农...
均价0.83元/吨!山西3宗储... (转自:砂石骨料网)砂石骨料网消息,近日,山西省自然资源网上交易平台发布3宗超亿吨砂石大矿成交公告。...
爱情像把扇子的原文是 爱情像把扇子的原文是爱就像个疯子  我眼中的爱情像一把扇子一样经历挫折, 像扇子一样长久, 像扇子一...
如果你选择离开我,请记得有个傻... 如果你选择离开我,请记得有个傻瓜曾经爱过你,我把难过留给自己,不做恋人我也心存感激。挽留女朋友行么不...
求魔幻小说的名字 求魔幻小说的名字要求:魔幻,原创郭敬明的《幻城》《七色绯夏:魔法学院录》华胥引、三生三世十里桃花、花...
贝利亚变成邪恶奥特曼的片名叫什... 贝利亚变成邪恶奥特曼的片名叫什么贝利亚变成邪恶奥特曼的片名叫什么雷欧尼克斯宇宙雷欧尼斯、叫大怪兽大战...