openfetion cli功能开发手记
之前一直有用户提出的命令行短信功能终于被我落实了下来,不过却让很多网友失望,因为所谓的命令行并非是纯命令行,而是需要先有openfetion GUI版本登录以作为server,cli程序通过IPC将数据交由server转发,自己并不进行与sipc server的直接数据通信,也就是必须有X图形界面的支持,当然如果要把现在的openfetion server做成不需要图形界面支持的deamon server还存在很多问题,如deamon在收到短信时该怎么处理等,另外deamon server的开发应该也需要花些时间,这个暂时未做考虑,而基于目前的飞信协议如果要发送短信则必须进行身份验证,也就是纯命令行不需要deamon server支持的飞信必须在每次发短信之前都需要登录一次,考虑到这个问题就迟迟没有开发纯命令行的版本,主要是觉得这种形式的短信发送方式存在的意义不大,不仅速度慢而且需要经过复杂的身份验证,但很多用户想用它管理server的话那也就只能这样来实现了,技术上其实问题不大,调用libofetion的api很简单就能实现,过几天抽点时间写一个看看,今天先把已经实现的CLI功能的开发过程总结一下。
程序很简单,只加了三个个文件,分别是src/fx_server.c,src/fx_cli.c和include/fx_server.h
服务器端初始化init_server函数来初始化server,函数如下:
int init_server(FxMain *fxmain) { int fifo; User *user = fxmain->user; char server_fifo[128]; snprintf(server_fifo, sizeof(server_fifo) - 1, OPENFETION_FIFO_FILE, user->mobileno); if(mkfifo(server_fifo, FIFO_FILE_MODE) == -1 && errno != EEXIST) { debug_error("create fifo %s:%s\n", server_fifo, strerror(errno)); return -1; } if((fifo = open(server_fifo, O_RDONLY, 0)) == -1) { debug_error("open fifo %s:%s\n", server_fifo, strerror(errno)); return -1; } if((idlefifo = open(server_fifo, O_WRONLY, 0)) == -1) { debug_error("open fifo %s:%s\n", server_fifo, strerror(errno)); close(fifo); return -1; } return fifo; }
这个函数对IPC进行了一些初始化,首先创建以“openfetion_fifo_登录手机号 ”命名的命名管道文件,分别打开两次,一次为只读,用于监听client发来的IPC请求,另一个为只写,这个描述符打开之后从来没有使用过,这也是UNP第二卷里面提到的小技巧,当client关闭时会关闭打开的命名管道描述符,这里server中的read函数便会返回0,从而标识client关闭,这时server便需要关闭描述符重新打开关监听,为了避免这样一种情况,server自己以只写的方式打开这个通用描述符而不写入任何数据,这样server在收不到数据时read函数便会一直阻塞。
FIFO也是基于流的通信方式,所以需要自定义消息,没有什么复杂的数据需要传输,我就简单定义了两种消息,请求消息和应答消息:
struct fifo_mesg { unsigned short type; unsigned short length; unsigned int pid; }; struct fifo_resp { unsigned short code; unsigned short length; };
请求消息中的pid字段为client进程的pid,client在向server发起请求之后会打开openfetion_fifo_pid命名的FIFO等待server返回响应,而server在收到请求之后可以提取出请求消息中的pid,从来找到client用于监听的命名管道文件,将返回消息通过命名管道再反馈给client。
目前请求信令的类型只有两种:
/* 发送短信 */ #define CLI_SEND_MESSAGE 1 /* 获取用户信息 */ #define CLI_GET_INFORMATION 2
应答信令的应答码也只有两种:
/* 操作已成功 */ #define CLI_EXEC_OK 200 /* 操作失败 */ #define CLI_EXEC_FAIL 400
请求消息体中为XML格式,应答消息体中为纯文本提示消息。请求信令消息体如下:
<r><m no="15200000000" bd="hello world" p="1" /></r>其中no表示要发送的好友手机号码,注意该好友必须在好友列表中,并且必须对你已设置公开手机号,bd为要发送的短信,p为是否用直接发送到用户手机。该消息发送到server后,server发现请求的号码与自己的号码相同时,会将消息发送至用户自己的手机中。
OK,过程就这么多吧,没有超过1K行代码,也复杂不到哪里去,接下来看看时间来不来得及写一个纯命令行的版本,有需要的同学请关注。
原创文章,转载请注明: 转载自basic coder
本文链接地址: http://basiccoder.com/openfetion-cli-func-dev-note.html

“没有超过1K行代码,也复杂不到哪里去”
原来不到1K行代码叫不复杂。。。
话说你的验证码为什么要收缩?之前看不到然后提交说要填验证码,返回来打开收缩的input框,再填再提交。
验证码我不知道啊,一直没有动过,是不是浏览器的问题
cli版本也要依赖networkmanager?
兄台用的是什么字体啊?系统是debian吗?谢谢!
字体是微软雅黑,系统是slackware
汗一个,slackware系统起个“debian”名,感谢回复。
名字的问题原因比较复杂。。。
好多年前的东西了呢,刚使用上,居然还能搞。。
不过还是期待命令行
灰常好
很 NB
我用的linux下的fetion机器人,第一天安装后命令行测试
fetion –mobile=13511111111 –pwd=11111111 –to=13511111111 –msg-utf8=”abc”
手机可以正常的收到来自1252013511111111的消息abc,可第二天再次测试收到的内容却是13511111111,测试了好多次内容都是手机号,并不是abc,哪位大神知道的帮帮我,我的邮箱是727517900@qq.com,不胜感激!