Skip to content

如何写一个IM

导言

本文将介绍如何在 TOX 内核上编写一个可以进行文本交流的 IM (Instant Messaging) 软体。

TOX

TOX 是什么?它是一个分布式的 p2p 网络协议。准确来说,它提供了这样的一个网络协议的各种接口,包含安全加密、DHT 网络、洋葱路由等核心部件的实现,以及朋友请求与连接对话、群聊等模块的实现,它还包含了音视频库以供用户实现音视频交流的功能。我们要做的是调用它封装好的这些接口,来实现自己的 IM 软体。整个 TOX 采用 C 语言实现。从我这周的使用测试情况来看,TOX 内核极其稳定。这样一个优秀的去中心化内核软体,值得所有在这方面感兴趣的应用开发者在其基础上开发一个自由的 IM 软体。本文也会在最后一节列出基于此开发出来的 IM 软体。

Tox Core

首先获取 tox 核心代码:

git clone https://github.com/TokTok/c-toxcore

按照 c-toxcore 里面的指导编译,安装 c-toxcore,例如:

cd c-toxcore
git checkout v0.2.2
cmake .
make
sudo checkinstall

如果你使用的是 Debian 系统,并且采用了 checkinstall 的安装方式,那么在执行 sudo checkinstall 命令时需要在安装提示的时候设置好软件的版本,比如我们这里的 0.2.2 版本。

libsodium

在我们这个 IM 软体里面使用到了 sodium 的一些接口:

git clone git://github.com/jedisct1/libsodium.git

参考里面的安装指导进行安装。

怎么写

https://wiki.tox.chat/developers/client_examples/echo_bot

里面有比较详细的步骤,可以实现一个 echo 功能的 IM 软体。你可以在此基础上进行开发。不再赘述。

DHT Bootstrap daemon

如果你有一个自己的 VPS,那么可以在上面运行一个 DHT 节点,在前面的描述里我们知道,TOX IM 软体在启动的时候会通过 tox_bootstrap 接口接入 DHT 网络,前提是我们需要一些已知的 DHT 节点,可想而知,这样的已知节点越多,分布式的效果越好。所以我们来自己运行一个 DHT 节点:

参考 bootstrap_daemon 进行安装,针对 systemd,systeminit 等不同 init 进程的发行版本均有说明。我使用的是 systemd Debian GNU/Linux。

这里主要对配置文件做一个小小的说明,在 /etc/tox-bootstrapd.conf 的 bootstrap_nodes 配置里:

bootstrap_nodes = (
  { // Example Node 1 (IPv4)
    address = "127.0.0.1"
    port = 33445
    public_key = "728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854"
  },
  { // Example Node 2 (IPv6)
    address = "::1/128"
    port = 33445
    public_key = "3E78BACF0F84235B30054B54898F56793E1DEF8BD46B1038B9D822E8460FAB67"
  },
  { // Example Node 3 (US-ASCII domain name)
    address = "example.org"
    port = 33445
    public_key = "8CD5A9BF0A6CE358BA36F7A653F99FA6B258FF756E490F52C1F98CC420F78858"
  }
)

默认的配置是以上这样的,我们需要修改成可以用的节点配置,你可以参考 tox user nodes 进行修改,如:

bootstrap_nodes = (
  { // Example Node 3 (US-ASCII domain name)
    address = "node.tox.biribiri.org"
    port = 33445
    public_key = "F404ABAA1C99A9D37D61AB54898F56793E1DEF8BD46B1038B9D822E8460FAB67"
  }
)

也就是对 address, port, public_key 三个字段进行设置,完毕之后重启这个服务(上述链接会有相应的重启方法)。当然,你也可以配置成我自己配置的节点信息:

bootstrap_nodes = (
  {
    address = "io-lab.net"
    port = 33445
    public_key = "99A6903D1B1BC59C81CAF9A330301627EAB88E39376363160FF5316910E0BB3D"
  }
)

IM Clients

TOX IM 软体在各大系统平台上均有广泛应用的客户端,有基于 ncurse 界面的 toxic,基于 qt 的 qTox,安卓上的 Antox,iOS 上的 Antidote 等等。你可以从以下链接里下载到适合自己的客户端:TOX Clients

PS: 当然,客户端这个词,对于 TOX 分布式软体来说,是不准确的,在真正的去中心化分布式网络里,大家都是对等的网络,既可以是服务者,又是使用者。

感悟

让我感到不安,愤懑,无奈的是,可能在我的朋友圈里,不会有一个人在用 TOX 即时聊天软体。是不是已经习惯了一种无所谓的生活态度,思想会飞已是一种病。现在,即使是我自己也没办法完全摆脱对微信,QQ 等垃圾 IM 软体的使用。但我相信有一天,有自由意识的人都会慢慢意识到自己的现状,我相信像 TOX 这样的自由软体才是美好世界的未来,即使等到那天,可能我们都很老了,但受益的可能会是我们自己的孩子。

参考

1,https://wiki.tox.chat/developers/client_examples/echo_bot

2,https://wiki.tox.chat/users/nodes

Post a Comment

Your email is never published nor shared. Required fields are marked *