首页 > C/C++ > openfetion cli功能开发手记

openfetion cli功能开发手记

2010年12月19日 发表评论 阅读评论 18,741 人阅读过  

之前一直有用户提出的命令行短信功能终于被我落实了下来,不过却让很多网友失望,因为所谓的命令行并非是纯命令行,而是需要先有openfetion GUI版本登录以作为server,cli程序通过IPC将数据交由server转发,自己并不进行与sipc server的直接数据通信,也就是必须有X图形界面的支持,当然如果要把现在的openfetion server做成不需要图形界面支持的deamon server还存在很多问题,如deamon在收到短信时该怎么处理等,另外deamon server的开发应该也需要花些时间,这个暂时未做考虑,而基于目前的飞信协议如果要发送短信则必须进行身份验证,也就是纯命令行不需要deamon server支持的飞信必须在每次发短信之前都需要登录一次,考虑到这个问题就迟迟没有开发纯命令行的版本,主要是觉得这种形式的短信发送方式存在的意义不大,不仅速度慢而且需要经过复杂的身份验证,但很多用户想用它管理server的话那也就只能这样来实现了,技术上其实问题不大,调用libofetion的api很简单就能实现,过几天抽点时间写一个看看,今天先把已经实现的CLI功能的开发过程总结一下。

首先,先看一下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

分类: C/C++ 标签: , , ,
  1. 2010年12月19日14:04 | #1

    “没有超过1K行代码,也复杂不到哪里去”
    原来不到1K行代码叫不复杂。。。
    话说你的验证码为什么要收缩?之前看不到然后提交说要填验证码,返回来打开收缩的input框,再填再提交。

    • 2010年12月19日14:05 | #2

      验证码我不知道啊,一直没有动过,是不是浏览器的问题

  2. arch
    2010年12月27日10:03 | #3

    cli版本也要依赖networkmanager?

  3. moneymagician
    2011年1月30日21:50 | #4

    兄台用的是什么字体啊?系统是debian吗?谢谢!

  4. moneymagician
    2011年1月31日16:48 | #6

    汗一个,slackware系统起个“debian”名,感谢回复。

  5. 2013年5月28日16:09 | #8

    好多年前的东西了呢,刚使用上,居然还能搞。。

    不过还是期待命令行

  6. lihuaiyuan
    2013年6月6日12:59 | #9

    灰常好 :lol: :mrgreen: :o :oops:

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。