# 音视频通话测试指南
## 问题说明
当前错误的根本原因:
```
目标用户 patient_1 没有在腾讯云 TRTC 中登录/初始化
```
### 为什么会出现这个错误?
1. **医生端**(当前系统)已经初始化:`doctor_1`
2. **患者端**需要呼叫:`patient_1`
3. **问题**:`patient_1` 没有登录 TRTC,无法接听
这就像打电话:
- 你(医生)的手机已经开机 ✅
- 对方(患者)的手机没开机 ❌
- 所以无法接通
## 解决方案
### 方案 1: 双浏览器测试(推荐)
使用两个浏览器窗口模拟医生和患者:
#### 步骤 1: 创建测试页面
创建一个简单的患者端测试页面:
```html
患者端测试
患者端 - 等待来电
初始化中...
```
#### 步骤 2: 后端添加获取患者签名的接口
```php
// server/app/adminapi/controller/tcm/DiagnosisController.php
/**
* @notes 获取患者通话签名(用于测试)
* @return \think\response\Json
*/
public function getPatientSignature()
{
$params = $this->request->get();
if (empty($params['patient_id'])) {
return $this->fail('患者ID不能为空');
}
$result = DiagnosisLogic::getPatientSignature($params);
if ($result) {
return $this->data($result);
}
return $this->fail(DiagnosisLogic::getError());
}
```
```php
// server/app/adminapi/logic/tcm/DiagnosisLogic.php
/**
* @notes 获取患者通话签名
* @param array $params
* @return array|bool
*/
public static function getPatientSignature(array $params)
{
try {
$config = self::getTrtcConfig();
if (!$config) {
self::setError('请先配置腾讯云TRTC参数');
return false;
}
// 患者的 userId
$userId = 'patient_' . $params['patient_id'];
// 生成 UserSig
$userSig = self::generateUserSig($config['sdkAppId'], $config['secretKey'], $userId);
if (!$userSig) {
self::setError('生成签名失败');
return false;
}
return [
'sdkAppId' => $config['sdkAppId'],
'userId' => $userId,
'userSig' => $userSig,
'expireTime' => 86400
];
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
```
#### 步骤 3: 测试流程
1. **打开患者端**
- 浏览器 1:访问 `http://localhost/patient-test.html?patient_id=1`
- 获取签名并初始化
- 等待来电
2. **打开医生端**
- 浏览器 2:登录后台管理系统
- 进入诊断列表
- 点击"视频通话"
- 发起通话
3. **验证**
- 患者端应该收到来电提示
- 点击接听
- 双方可以进行视频通话
### 方案 2: 使用腾讯云 Demo(快速测试)
1. 访问腾讯云官方 Demo:
```
https://web.sdk.qcloud.com/trtc/webrtc/demo/latest/official-demo/index.html
```
2. 输入你的配置:
- SDKAppID
- SecretKey
- UserID: `patient_1`
3. 点击"进入房间"
4. 在你的系统中发起通话
### 方案 3: 自测试(单用户测试)
如果只是想测试初始化是否成功,可以呼叫自己:
```typescript
// 修改前端代码,呼叫自己
await TUICallKitServer.call({
userID: res.userId, // 呼叫自己
type: TUICallType.VIDEO_CALL
})
```
这样可以验证:
- ✅ 初始化是否成功
- ✅ 签名是否正确
- ✅ 配置是否正确
- ❌ 但无法测试真实的通话流程
## 完整的测试方案
### 创建患者端测试组件
```vue
患者端测试 - 接听来电
初始化患者端
患者端已初始化,等待来电...
患者ID: {{ currentUserId }}
```
### 添加路由
```typescript
// admin/src/router/index.ts
{
path: '/test/patient-call',
name: 'PatientCallTest',
component: () => import('@/views/test/patient-call.vue'),
meta: { title: '患者端测试' }
}
```
## 测试步骤
### 完整测试流程
1. **准备两个浏览器窗口**
- 窗口 1:Chrome(医生端)
- 窗口 2:Chrome 无痕模式(患者端)
2. **初始化患者端**
- 在窗口 2 中访问:`http://localhost:5173/#/test/patient-call`
- 输入患者ID:1
- 点击"初始化患者端"
- 等待提示"患者端初始化成功"
3. **发起通话**
- 在窗口 1 中进入诊断列表
- 找到患者ID为1的诊单
- 点击"视频通话"
- 点击"开始通话"
4. **接听通话**
- 窗口 2 应该收到来电提示
- 点击"接听"
- 开始视频通话
5. **验证功能**
- ✅ 视频画面正常
- ✅ 音频正常
- ✅ 可以挂断
- ✅ 通话记录保存
## 常见问题
### Q1: 患者端没有收到来电
**可能原因**:
1. 患者端没有初始化
2. 患者ID不匹配
3. 网络问题
**解决方案**:
```javascript
// 在患者端控制台检查
console.log('当前用户ID:', TUICallKitServer.userID)
// 应该显示: patient_1
```
### Q2: 提示用户不存在
**原因**: UserSig 生成的 userId 和呼叫的 userId 不一致
**解决方案**: 确保:
```typescript
// 医生端
const doctorUserId = 'doctor_1' // 医生登录时使用
// 患者端
const patientUserId = 'patient_1' // 患者登录时使用
// 呼叫时
await TUICallKitServer.call({
userID: 'patient_1' // 必须和患者登录的 userId 一致
})
```
### Q3: 两个窗口都是同一个用户
**原因**: 使用了相同的浏览器和相同的 localStorage
**解决方案**: 使用无痕模式或不同的浏览器
## 生产环境部署
在生产环境中,需要:
1. **患者端应用**
- 开发患者端 H5/小程序/App
- 集成 TUICallKit
- 实现登录和来电监听
2. **推送通知**
- 当医生发起通话时,推送通知给患者
- 患者点击通知进入通话界面
3. **在线状态管理**
- 检查患者是否在线
- 如果不在线,提示医生
4. **通话记录**
- 保存通话记录
- 统计通话时长
- 生成通话报表
## 参考资料
- [TUICallKit 快速集成](https://cloud.tencent.com/document/product/647/78742)
- [多端互通](https://cloud.tencent.com/document/product/647/78769)
- [常见问题](https://cloud.tencent.com/document/product/647/78769#3a61f42b-e06f-49af-88bf-362d40025887)