需要的资源如下:
libev,jsonrpc-c
https://codeload.github.com/enki/libev/zip/refs/heads/master
https://codeload.github.com/hmng/jsonrpc-c/zip/refs/heads/master
参考:编译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
./lib_make.sh libev mipsel
./lib_make.sh install mipsel
进入mipsel_test_code目录相关文件如下
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)
/*
* @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;
}
#!/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运行测试脚本
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
下一篇:防火墙基本信息和规则设置