Mars 自定义扩展

优质
小牛编辑
123浏览
2023-12-01

目前 Mars 支持自定义 xlog 的加密部分和长短连协议加解包部分。需要强调的是想要自定义这些扩展,需要在本地编译 Mars 才可以,编译方法见 Mars Android 接入指南Mars iOS/OS X 接入指南 中的编译部分。切记,在自定义实现时,可以增加函数,但是不能删除头文件中已有的函数,也不能修改头文件中的函数原型。

自定义 xlog 加密

xlog 的具体实现可以参考微信终端跨平台组件 Mars 系列(一) - 高性能日志模块 xlog

在自定义日志加密算法前,先来了解一下日志的结构:

|magic start(char)|seq(uint16_t)|begin hour(char)|end hour(char)|length(uint32_t)|crypt key(uint32_t)|log|magic end(char)|

以上结构为一个日志结构体,在 Xlog.AppednerModeSync (同步模式)下,每写一行日志都会组装成一个日志结构体写入到日志文件中。在 Xlog.AppednerModeAsync (异步模式)下,mmap 中的数据是是一个日志结构体,每当往 mmap 中写入一行日志数据时,同时会修改结构体中的 length 的值。

所以结构体中有四部分是不能去除的:magic start、length、log、magic end。其他部分可以根据需要增减。

日志默认是提供 ecdh +tea的混合加密算法,具体使用方法见 Xlog 加密指引。如果你只是想更改加密算法的话,只需要修改两个函数(注意,老版本是需要单独把log_crypt.h和log_crypt.cc文件单独复制到上层代码里实现。最新版本已经不需要这么做):

void CryptSyncLog(const char* const _log_data, size_t _input_len, char* _output, size_t& _output_len);
void CryptAsyncLog(const char* const _log_data, size_t _input_len, char* _output, size_t& _output_len);

自定义加密算法后,一定要修改解密 xlog 的 python 脚本。修改python的解压逻辑需要注意:因为日志是先压缩后再让你重定义加密的,所以解密脚本中需要先解密再解压,而且需要注意解密脚本中有两种类型:同步日志和异步日志,注意和你的加密算法对应上。

自定义长连加解包

长连的加包是在 Req2Buf 之后进行的,也即长连的 body 是 Req2Buf 得到的数据,长连的头部是加包上去的。加解包自定义实现可以在这两个函数中进行实现:

void (*longlink_pack)(uint32_t _cmdid, uint32_t _seq, const AutoBuffer& _body, const AutoBuffer& _extension, AutoBuffer& _packed, longlink_tracker* _tracker);
int  (*longlink_unpack)(const AutoBuffer& _packed, uint32_t& _cmdid, uint32_t& _seq, size_t& _package_len, AutoBuffer& _body, AutoBuffer& _extension, longlink_tracker* _tracker);

同时这里还可以针对心跳包(noop)进行自定义,默认的心跳包是只有一个长连接头部,没有 body 部分。

uint32_t (*longlink_noop_cmdid)();
bool  (*longlink_noop_isresp)(uint32_t _taskid, uint32_t _cmdid, uint32_t _recv_seq, const AutoBuffer& _body, const AutoBuffer& _extend);
void (*longlink_noop_req_body)(AutoBuffer& _body, AutoBuffer& _extend);
void (*longlink_noop_resp_body)(const AutoBuffer& _body, const AutoBuffer& _extend);

自定义长连复合连接连接阶段是否需要心跳包验证

bool (*longlink_complexconnect_need_verify)();

自定义短连加解包

和长连一样,短连的加包也是在 Req2Buf 之后进行的,也即短连的 body 是 Req2Buf 得到的数据,短连的头部是加包上去的。即使修改短连的加包逻辑也请只在 HTTP 协议基础上增减字段,建议不要改为其他协议,因为本身短连就是为了弥补长连私有协议的请求可能被中间设备丢掉而做的。

void (*shortlink_pack)(const std::string& _url, const std::map<std::string, std::string>& _headers, const AutoBuffer& _body, const AutoBuffer& _extension, AutoBuffer& _out_buff, shortlink_tracker* _tracker);

自定义心跳包的间隔

uint32_t (*longlink_noop_interval)();

默认为 0,会走 Mars 自带的逻辑。若想自定义,该值给大于 0 的值即可,单位为 ms ,例如你想自定义 1min 的心跳间隔,需返回值 1*60*1000。

已经固定的几种协议

目前Mars中已经固定了几种协议:

  1. 心跳包 cmdid = 6 可在 longlink_packer.cc 自定义
  2. signalling cmdid = 243。 cmdid 的值可在 longlink_packer.cc 自定义。该功能不主动调用不会触发。
  3. push 数据包。默认 seq = 0 会被认为是 push 数据包,可在 longlink_packer.cc 自定义。

注意自定义时不要与以上三种有冲突。