632 lines
18 KiB
Markdown
632 lines
18 KiB
Markdown
# Tinode IM 功能详解
|
||
|
||
> 本文档全面介绍 Tinode 即时通讯平台的功能特性,帮助理解产品能力和使用场景。
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [产品概述](#产品概述)
|
||
- [核心功能](#核心功能)
|
||
- [消息类型](#消息类型)
|
||
- [会话类型](#会话类型)
|
||
- [用户体系](#用户体系)
|
||
- [群组功能](#群组功能)
|
||
- [文件传输](#文件传输)
|
||
- [推送通知](#推送通知)
|
||
- [视频通话](#视频通话)
|
||
- [安全机制](#安全机制)
|
||
- [扩展能力](#扩展能力)
|
||
- [应用场景](#应用场景)
|
||
|
||
---
|
||
|
||
## 产品概述
|
||
|
||
### 什么是 Tinode
|
||
|
||
Tinode 是一个开源的即时通讯平台,提供完整的 IM 基础设施:
|
||
|
||
| 特性 | 说明 |
|
||
|------|------|
|
||
| **开源免费** | GPL 3.0 许可证,代码完全开源 |
|
||
| **跨平台** | 支持 Android、iOS、Web 三端 |
|
||
| **多协议** | WebSocket、gRPC、长轮询 |
|
||
| **多数据库** | MySQL、PostgreSQL、MongoDB、RethinkDB |
|
||
| **高并发** | 支持数万并发连接 |
|
||
| **可扩展** | 支持集群部署、插件系统 |
|
||
|
||
### 核心架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 客户端层 │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ Android │ │ iOS │ │ Web │ │
|
||
│ │ Tindroid │ │ Tinodious│ │TinodeWeb │ │
|
||
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
|
||
└───────┼─────────────┼─────────────┼─────────────────────────┘
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 协议层 │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │WebSocket │ │ gRPC │ │Long Poll │ │
|
||
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
|
||
└───────┼─────────────┼─────────────┼─────────────────────────┘
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 服务端 │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ Hub │ │ Topic │ │ Session │ │ Auth │ │
|
||
│ │ 连接中心 │ │ 消息路由 │ │ 会话管理 │ │ 认证模块 │ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 存储层 │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ MySQL │ │PostgreSQL│ │ MongoDB │ │ RethinkDB│ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 核心功能
|
||
|
||
### 1. 消息收发
|
||
|
||
#### 基本特性
|
||
|
||
| 功能 | 说明 |
|
||
|------|------|
|
||
| **实时消息** | WebSocket 实时推送,毫秒级延迟 |
|
||
| **离线消息** | 用户上线自动推送离线期间的消息 |
|
||
| **消息回执** | 已发送、已送达、已读取三种状态 |
|
||
| **消息撤回** | 支持撤回已发送的消息 |
|
||
| **消息引用** | 回复特定消息,形成对话链 |
|
||
| **消息转发** | 转发消息到其他会话 |
|
||
|
||
#### 消息状态流转
|
||
|
||
```
|
||
发送 → 已发送(sent) → 已送达(delivered) → 已读取(read)
|
||
│ │ │
|
||
│ │ └── 接收方打开会话
|
||
│ │
|
||
│ └── 接收方客户端收到
|
||
│
|
||
└── 服务器确认接收
|
||
```
|
||
|
||
### 2. 消息类型
|
||
|
||
#### 文本消息
|
||
|
||
- 纯文本消息
|
||
- 富文本消息(Drafty 格式)
|
||
- 支持@提及功能
|
||
- 支持表情符号
|
||
|
||
#### 多媒体消息
|
||
|
||
| 类型 | 格式支持 | 说明 |
|
||
|------|----------|------|
|
||
| **图片** | JPEG, PNG, GIF, WebP | 自动生成缩略图 |
|
||
| **视频** | MP4, MOV, WebM | 支持视频预览 |
|
||
| **音频** | MP3, AAC, OGG | 语音消息支持 |
|
||
| **文件** | 任意格式 | 文档、压缩包等 |
|
||
|
||
#### 特殊消息
|
||
|
||
| 类型 | 说明 |
|
||
|------|------|
|
||
| **位置** | 地理位置分享 |
|
||
| **名片** | 用户名片分享 |
|
||
| **链接预览** | 自动抓取网页标题、描述、图片 |
|
||
|
||
### 3. 输入状态
|
||
|
||
实时显示对方输入状态:
|
||
|
||
| 状态 | 说明 |
|
||
|------|------|
|
||
| `kp` | 正在输入文字 |
|
||
| `kpa` | 正在录制语音 |
|
||
| `kpv` | 正在录制视频 |
|
||
|
||
---
|
||
|
||
## 会话类型
|
||
|
||
### 1. 单聊(P2P)
|
||
|
||
两个用户之间的私密对话:
|
||
|
||
| 特性 | 说明 |
|
||
|------|------|
|
||
| **自动创建** | 首次发消息自动创建会话 |
|
||
| **双向同步** | 双方看到不同的会话名(对方用户ID) |
|
||
| **加密存储** | 消息加密存储在数据库 |
|
||
| **阅后即焚** | 支持(需客户端实现) |
|
||
|
||
### 2. 群聊(Group)
|
||
|
||
多用户之间的群组对话:
|
||
|
||
| 特性 | 说明 |
|
||
|------|------|
|
||
| **创建群组** | 任意用户可创建群组 |
|
||
| **成员上限** | 默认支持数百人(可配置) |
|
||
| **权限管理** | 所有者、管理员、普通成员 |
|
||
| **邀请加入** | 成员可邀请新成员 |
|
||
| **踢出成员** | 管理员可踢出成员 |
|
||
| **退出群组** | 成员可主动退出 |
|
||
|
||
#### 群组角色
|
||
|
||
| 角色 | 权限 |
|
||
|------|------|
|
||
| **所有者(Owner)** | 全部权限,可转让所有者 |
|
||
| **管理员(Admin)** | 管理成员、修改群信息 |
|
||
| **普通成员(Member)** | 发送消息、查看成员 |
|
||
|
||
### 3. 频道(Channel)
|
||
|
||
单向广播式群组:
|
||
|
||
| 特性 | 普通群组 | 频道 |
|
||
|------|----------|------|
|
||
| 订阅者数量 | 有限制 | 无限制(只读) |
|
||
| 消息发送者 | 所有成员 | 仅管理员 |
|
||
| 加入通知 | 有 | 无 |
|
||
| 消息来源 | 显示发送者 | 不显示 |
|
||
| 用途 | 团队协作 | 内容分发 |
|
||
|
||
### 4. 系统消息(sys)
|
||
|
||
与系统管理员通信的通道:
|
||
|
||
- 普通用户可向系统发送消息(如举报)
|
||
- root 用户可订阅并查看所有消息
|
||
- 用于客服、举报等场景
|
||
|
||
---
|
||
|
||
## 用户体系
|
||
|
||
### 1. 用户属性
|
||
|
||
| 属性 | 说明 |
|
||
|------|------|
|
||
| `username` | 登录名(唯一,用于 basic 认证) |
|
||
| `public` | 公开资料(昵称、头像、简介) |
|
||
| `private` | 私有数据(仅自己可见) |
|
||
| `trusted` | 可信标记(由系统设置) |
|
||
| `tags` | 发现标签(用于搜索) |
|
||
|
||
### 2. 用户状态
|
||
|
||
| 状态 | 说明 |
|
||
|------|------|
|
||
| `ok` | 正常状态 |
|
||
| `susp` | 暂停状态(禁止访问,可恢复) |
|
||
| `del` | 已删除状态(软删除) |
|
||
|
||
### 3. 认证方式
|
||
|
||
| 方式 | 说明 |
|
||
|------|------|
|
||
| **Basic** | 用户名 + 密码 |
|
||
| **Token** | 加密令牌(主要方式) |
|
||
| **Anonymous** | 匿名登录(仅创建账户) |
|
||
| **REST** | 外部认证系统集成 |
|
||
|
||
### 4. 多设备登录
|
||
|
||
- 支持同一用户多设备同时在线
|
||
- 每个设备独立会话
|
||
- 消息同步到所有设备
|
||
- 设备标识(User Agent)区分
|
||
|
||
---
|
||
|
||
## 群组功能
|
||
|
||
### 1. 群组管理
|
||
|
||
#### 创建群组
|
||
|
||
```
|
||
{sub topic="new"} → 创建普通群组
|
||
{sub topic="nch"} → 创建频道
|
||
```
|
||
|
||
#### 群组信息
|
||
|
||
| 信息 | 说明 |
|
||
|------|------|
|
||
| 名称 | 群组名称 |
|
||
| 头像 | 群组图标 |
|
||
| 简介 | 群组描述 |
|
||
| 标签 | 发现标签 |
|
||
|
||
### 2. 成员管理
|
||
|
||
#### 邀请加入
|
||
|
||
```
|
||
发送者: {set topic="grpXXX" sub={user="usrYYY", mode="JRWS"}}
|
||
接收者: {pres what="acs"} → 收到邀请通知
|
||
```
|
||
|
||
#### 权限控制
|
||
|
||
| 权限 | 说明 |
|
||
|------|------|
|
||
| `J` | 加入权限(订阅话题) |
|
||
| `R` | 读取权限(接收消息) |
|
||
| `W` | 写入权限(发送消息) |
|
||
| `P` | 在线状态(查看成员状态) |
|
||
| `A` | 管理权限(审批、踢人) |
|
||
| `S` | 分享权限(邀请他人) |
|
||
| `D` | 删除权限(硬删除消息) |
|
||
| `O` | 所有者(完全控制) |
|
||
|
||
### 3. 群组操作
|
||
|
||
| 操作 | 说明 |
|
||
|------|------|
|
||
| 修改群名 | 所有者权限 |
|
||
| 修改群头像 | 所有者权限 |
|
||
| 修改群公告 | 管理员权限 |
|
||
| 设置管理员 | 所有者权限 |
|
||
| 踢出成员 | 管理员权限 |
|
||
| 解散群组 | 所有者权限 |
|
||
|
||
---
|
||
|
||
## 文件传输
|
||
|
||
### 1. 上传方式
|
||
|
||
#### 带外上传(推荐)
|
||
|
||
大文件通过 HTTP POST 单独上传:
|
||
|
||
```
|
||
POST /v0/file/u
|
||
Content-Type: multipart/form-data
|
||
|
||
响应: {ctrl: {params: {url: "/v0/file/s/xxx.jpg"}}}
|
||
```
|
||
|
||
#### 消息引用
|
||
|
||
```json
|
||
{
|
||
"pub": {
|
||
"head": {"mime": "text/x-drafty"},
|
||
"content": {"ent": [{"data": {"ref": "/v0/file/s/xxx.jpg"}}]}
|
||
},
|
||
"extra": {"attachments": ["/v0/file/s/xxx.jpg"]}
|
||
}
|
||
```
|
||
|
||
### 2. 存储方式
|
||
|
||
| 方式 | 说明 |
|
||
|------|------|
|
||
| **本地文件系统** | 适用于单机部署 |
|
||
| **AWS S3** | 适用于云端部署 |
|
||
| **自定义存储** | 实现 media 接口即可 |
|
||
|
||
### 3. 文件限制
|
||
|
||
| 配置项 | 说明 |
|
||
|------|------|
|
||
| `max_file_size` | 最大文件大小 |
|
||
| `allowed_mime_types` | 允许的 MIME 类型 |
|
||
| `upload_timeout` | 上传超时时间 |
|
||
|
||
---
|
||
|
||
## 推送通知
|
||
|
||
### 1. 支持平台
|
||
|
||
| 平台 | 推送服务 |
|
||
|------|----------|
|
||
| Android | Firebase Cloud Messaging (FCM) |
|
||
| iOS | FCM / APNs |
|
||
| Web | Web Push API |
|
||
|
||
### 2. 推送内容
|
||
|
||
```json
|
||
{
|
||
"topic": "grpXXX",
|
||
"xfrom": "usrYYY",
|
||
"ts": "2024-01-01T00:00:00Z",
|
||
"seq": "123",
|
||
"mime": "text/x-drafty",
|
||
"content": "消息内容..."
|
||
}
|
||
```
|
||
|
||
### 3. 推送策略
|
||
|
||
| 状态 | 推送行为 |
|
||
|------|----------|
|
||
| 前台运行 | 不推送,实时接收 |
|
||
| 后台运行 | 推送通知 |
|
||
| 离线 | 推送通知,上线后同步 |
|
||
|
||
### 4. 设备管理
|
||
|
||
- 每个设备注册唯一 `dev_id`
|
||
- 支持多设备推送
|
||
- 支持设备解绑
|
||
|
||
---
|
||
|
||
## 视频通话
|
||
|
||
### 1. 基本流程
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 呼叫建立 │
|
||
│ │
|
||
│ 呼叫方 服务端 被叫方 │
|
||
│ │ │ │ │
|
||
│ │──── {note what="call"} ─┼───── {info what="call"} ────>│
|
||
│ │ │ │ │
|
||
│ │ │<──── {note what="call"} ─────│ 接听
|
||
│ │ │ │ │
|
||
│ │<───── {info what="call"} ──────────────────────────────│
|
||
│ │ │ │ │
|
||
│ │<════════════════════ WebRTC Signaling ════════════════>│
|
||
│ │ │ │ │
|
||
│ │<═══════════════════════ Media Stream ═════════════════>│
|
||
│ │ │ │ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 2. 通话类型
|
||
|
||
| 类型 | 说明 |
|
||
|------|------|
|
||
| **音频通话** | 纯语音通话 |
|
||
| **视频通话** | 音视频通话 |
|
||
| **屏幕共享** | 共享屏幕内容 |
|
||
|
||
### 3. 信令流程
|
||
|
||
1. **发起呼叫**: `{note what="call", seq=...}`
|
||
2. **接听/拒绝**: `{note what="call", seq=...}`
|
||
3. **挂断**: `{note what="call", seq=...}`
|
||
4. **WebRTC 信令**: 通过 `{note what="data", content=...}` 传递
|
||
|
||
---
|
||
|
||
## 安全机制
|
||
|
||
### 1. 传输安全
|
||
|
||
| 层面 | 措施 |
|
||
|------|------|
|
||
| **传输加密** | TLS/HTTPS/WSS |
|
||
| **API 鉴权** | API Key 验证 |
|
||
| **防篡改** | HMAC 签名 |
|
||
|
||
### 2. 认证安全
|
||
|
||
| 措施 | 说明 |
|
||
|------|------|
|
||
| **Token 加密** | 令牌使用 AES 加密 |
|
||
| **Token 过期** | 可配置过期时间 |
|
||
| **密码哈希** | bcrypt 存储密码 |
|
||
|
||
### 3. 访问控制
|
||
|
||
#### 权限矩阵
|
||
|
||
```
|
||
实际权限 = want AND given
|
||
```
|
||
|
||
| 操作 | 权限要求 |
|
||
|------|----------|
|
||
| 发送消息 | W |
|
||
| 接收消息 | R |
|
||
| 查看成员 | P |
|
||
| 邀请成员 | S |
|
||
| 管理成员 | A |
|
||
| 删除消息 | D |
|
||
| 管理群组 | O |
|
||
|
||
### 4. 数据安全
|
||
|
||
| 功能 | 说明 |
|
||
|------|------|
|
||
| **软删除** | 消息标记删除,保留数据 |
|
||
| **硬删除** | 物理删除消息(需 D 权限) |
|
||
| **消息清理** | 自动清理过期消息 |
|
||
|
||
---
|
||
|
||
## 扩展能力
|
||
|
||
### 1. 插件系统
|
||
|
||
通过 gRPC Plugin API 开发插件:
|
||
|
||
```go
|
||
service Plugin {
|
||
rpc Firehose(stream PluginReq) returns (stream PluginResp);
|
||
}
|
||
```
|
||
|
||
#### 插件事件
|
||
|
||
| 事件 | 说明 |
|
||
|------|------|
|
||
| `Account creation` | 账户创建 |
|
||
| `Message publish` | 消息发布 |
|
||
| `Subscription` | 订阅事件 |
|
||
| `Topic creation` | 话题创建 |
|
||
|
||
### 2. 聊天机器人
|
||
|
||
示例:chatbot 插件
|
||
|
||
```python
|
||
# 监听新用户创建
|
||
# 自动发送欢迎消息
|
||
# 回复用户消息
|
||
```
|
||
|
||
### 3. 自定义认证
|
||
|
||
集成外部认证系统:
|
||
|
||
```
|
||
┌─────────────┐ REST API ┌─────────────┐
|
||
│ Tinode │ ───────────────> │ External │
|
||
│ Server │ │ Auth │
|
||
│ │ <─────────────── │ Server │
|
||
└─────────────┘ JSON Resp └─────────────┘
|
||
```
|
||
|
||
### 4. 数据库适配
|
||
|
||
实现 `db.Adapter` 接口即可支持新数据库:
|
||
|
||
```go
|
||
type Adapter interface {
|
||
Open(config string) error
|
||
Close() error
|
||
UserGet(uid string) (*User, error)
|
||
MessageSave(msg *Message) error
|
||
// ...
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 应用场景
|
||
|
||
### 1. 社交应用
|
||
|
||
| 功能 | 实现方式 |
|
||
|------|----------|
|
||
| 私信 | P2P 话题 |
|
||
| 群聊 | 群组话题 |
|
||
| 发现用户 | fnd 话题 + tags |
|
||
| 用户资料 | me 话题 + public |
|
||
|
||
### 2. 企业办公
|
||
|
||
| 功能 | 实现方式 |
|
||
|------|----------|
|
||
| 部门群组 | 群组话题 |
|
||
| 公司公告 | 频道话题 |
|
||
| 文件共享 | 带外文件 + 消息引用 |
|
||
| 视频会议 | WebRTC 视频通话 |
|
||
|
||
### 3. 客服系统
|
||
|
||
| 功能 | 实现方式 |
|
||
|------|----------|
|
||
| 匿名咨询 | anonymous 认证 |
|
||
| 客服工号 | sys 话题 |
|
||
| 消息记录 | 历史消息查询 |
|
||
| 机器人客服 | chatbot 插件 |
|
||
|
||
### 4. IoT 通知
|
||
|
||
| 功能 | 实现方式 |
|
||
|------|----------|
|
||
| 设备告警 | 群组话题 |
|
||
| 远程控制 | 自定义消息格式 |
|
||
| 数据上报 | 消息 content 字段 |
|
||
|
||
---
|
||
|
||
## 功能对比
|
||
|
||
### 与其他 IM 方案对比
|
||
|
||
| 功能 | Tinode | 自建 WebSocket | 第三方 SDK |
|
||
|------|--------|----------------|-----------|
|
||
| 开源免费 | ✅ | ✅ | ❌ |
|
||
| 多端支持 | ✅ | 需自建 | ✅ |
|
||
| 消息存储 | ✅ | 需自建 | ✅ |
|
||
| 离线推送 | ✅ | 需自建 | ✅ |
|
||
| 群组功能 | ✅ | 需自建 | ✅ |
|
||
| 视频通话 | ✅ | 需自建 | ✅ |
|
||
| 自定义认证 | ✅ | 完全自主 | 受限 |
|
||
| 数据私有 | ✅ | ✅ | ❌ |
|
||
| 部署难度 | 中等 | 高 | 低 |
|
||
|
||
---
|
||
|
||
## 快速体验
|
||
|
||
### 1. Docker 部署
|
||
|
||
```bash
|
||
# 启动 MySQL 版本
|
||
docker run -d -p 6060:18080 \
|
||
--name tinode-server \
|
||
tinode/tinode-mysql:latest
|
||
|
||
# 访问 Web 客户端
|
||
open http://localhost:6060
|
||
```
|
||
|
||
### 2. 默认账户
|
||
|
||
使用 `tinode-db` 工具初始化测试数据:
|
||
|
||
| 用户名 | 密码 | 说明 |
|
||
|--------|------|------|
|
||
| alice | alice123 | 测试用户 |
|
||
| bob | bob123 | 测试用户 |
|
||
| carol | carol123 | 测试用户 |
|
||
| dave | dave123 | 测试用户 |
|
||
| tino | tino123 | 聊天机器人 |
|
||
|
||
### 3. API 测试
|
||
|
||
```bash
|
||
# 使用 tn-cli 测试
|
||
cd tn-cli
|
||
pip install -r requirements.txt
|
||
python tn-cli.py --login-basic=alice:alice123
|
||
```
|
||
|
||
---
|
||
|
||
## 客户端下载
|
||
|
||
| 平台 | 仓库 | 说明 |
|
||
|------|------|------|
|
||
| Web | github.com/tinode/webapp | React SPA |
|
||
| Android | github.com/tinode/tindroid | 原生应用 |
|
||
| iOS | github.com/tinode/tinodious | Swift 原生 |
|
||
|
||
---
|
||
|
||
## 更多文档
|
||
|
||
- [项目结构详解](./PROJECT-STRUCTURE.md)
|
||
- [代码通读指南](./CODE-WALKTHROUGH.md)
|
||
- [消息存储机制](./MESSAGE-STORAGE.md)
|
||
- [API 文档](./API-CN.md)
|
||
- [Drafty 富文本格式](./drafty.md)
|
||
- [视频通话建立](./call-establishment.md) |