(二)whatsapp 语音通话基本实现

Whatsapp VoiceCall

客户端通过websocket连接到服务器,客户端发起语音通话请求,并且完成必要的协商之后,就可以直接将语音数据发送给服务器,服务器接收到对方的语音数据之后也会通过websocket将语音数据转发给客户端。

websocket连接并不是和whatsapp 服务器连接

获取协商秘钥

XMPP 在发起语音通话请求的时候,需要带上一个秘钥,这个秘钥长32字节,通过特殊算法生成。whatsapp 服务器接收到秘钥之后会解密,然后校验时间戳。这个算法需要三个参数:

  1. 自身jid
  2. 对方jid
  3. 时间戳
//发送json 格式命令,获取秘钥
{"otherjid": "otherjid@whatsapp.com","command": "GetSecret","selfjid": "121312312@whatsapp.com"
}
//服务器回复秘钥, 注意秘钥是经过base64编码, 接收方需要解码,解码之后是32字节的二进制数据
{"secret": "DTGFOJCrTK+o6GhWfAeUkrq5VN9eHkwfkiDHKOkKRhY=","command": "ResponseSecret"
}

发起XMPP 语音通话请求

当获取到加密秘钥之后,就可以构造xmpp的语音通话请求包,然后将这个包发送给whatsapp 服务器,这样对方手机就会响铃。

1 构造语音通过请求

下面是一个xmpp 语音请求包

    
<call to='xxx@s.whatsapp.net' id='xxx'><offer call-creator='xxx:0@s.whatsapp.net' call-id='xxxx'device_class='2015'><audio rate='16000' enc='opus' /><net medium='3' /><capability ver='1'>AQT3C84a</capability><enc v='2' type='pkmsg'>MwiFBhIhBRE+8IYJ4rTvOJV4VfxcXvcTontZBz0bx7bxUpfOFQ5HGiEFYl47S8HlKrOoMqMxT8oxn4HuBal5baxV+fvQD58Hmw8icjMKIQVZ6HEY7yA5wTA2AJPYNSPy/iEcVCqTQG0TADBl/pB1AxACGAAiQKLYdXauXiPQPUeo+eQzDPkxH8cuBDXvPxuw/hfFkP1rlmTiP5sF5XLAV8iI+dZUOG3uUgwUzzP3ZIDhyRfa23Wodd1H/R+mHiif2YvCAjDQ9ekH</enc><encopt keygen='2' /></offer>
</call>

call-id: 32 字节长度的字符串,用来唯一标识通话请求,如果需要挂断就需要使用 这个call-id。
enc: 这个字段是一个加密的字段,和普通的 文本消息加密方式一样。 只是内容不同。构造一个Message 对象,将第一步获取到的秘钥 设置到callKey 字段,然后加密。
在这里插入图片描述

在这里插入图片描述

2 发送/确认 语音通话请求

转发语音数据

当发送XMPP 的确认包之后,就需要将语音数据尽快发给whatsapp 的服务器,否则超时会自动断开,此时需要将语音数据编码成opus格式,然后 通过websocket 发送到中转服务器, 中转服务器会负责语音数据的加密以及转发。并且中转服务器也会通过websocket 将接收到的数据转发给客户端,流程图如下

webosocket
udp
udp
websocket
客户端
中转服务器
whatsapp 服务器
A麦克风采集PCM
opus编码数据
whatsapp服务器
opus解码数据
B扬声器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/594041.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析面试】6.计算对话总数(SQL)

题目&#xff1a;计算对话总数 给定了名为 messenger_sends 的消息发送表格&#xff0c;找出总共有多少个唯一的对话。 注&#xff1a;在某些记录中&#xff0c;receiver_id 和 sender_id 从初始消息中互换了。这些记录应视为同一个对话。 示例&#xff1a; 输入&#xff1…

训练营十六天(二叉树part03)

104.二叉树的最大深度 力扣题目链接(opens new window) 题目 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&…

挑选人力资源管理系统,专家推荐的6款必看!

在当今数字化时代&#xff0c;人力资源管理系统已成为企业高效运营和持续发展的重要工具。本文为您介绍的6款好用的人力资源管理系统有Zoho People、金蝶人力云、Workday、北森eHR、用友人力云、易路&#xff0c;帮助您找到最适合自己企业的解决方案。 一、Zoho People Zoho P…

构建开源可观测平台

企业始终面临着确保 IT 基础设施和应用程序全年可用的压力。现代架构&#xff08;容器、混合云、SOA、微服务等&#xff09;的复杂性不断增长&#xff0c;产生大量难以管理的日志。我们需要智能应用程序性能管理 (APM) 和可观察性工具来实现卓越生产并满足可用性和正常运行时间…

《搜广推算法指南》(2024版) 重磅发布!

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 结合…

从头开发一个RISC-V的操作系统(五)汇编语言编程

文章目录 前提RISC-V汇编语言入门RISC-V汇编指令总览汇编指令操作对象汇编指令编码格式add指令介绍无符号数 练习参考链接 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文章和知识来自于…

【C++】模拟实现红黑树(插入)

目录 红黑树的概念 红黑树的性质 红黑树的调整情况 红黑树的模拟实现 枚举类型的定义 红黑树节点的定义 插入函数的实现 旋转函数的实现 左旋 右旋 自检函数的实现 红黑树类 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储…

【剑指offr--C/C++】JZ7 重建二叉树

一、题目 二、思路及代码 前序遍历&#xff1a;中、左、右。所以前序遍历的第一个节点是树的根节点&#xff0c;第二个节点是左子树的根节点。。。。 中序遍历&#xff1a;左、中、右。树的根节点在中间某处 我们可以根据二者的特点结合一下&#xff1a;对于前序遍历序列{1,2,4…

查看MySQL版本的方式

文章目录 一、使用cmd输入命令行查看二、在mysql客户端服务器里查询 一、使用cmd输入命令行查看 1、打开 cmd &#xff0c;输入命令行&#xff1a; mysql --version 2、还是打开cmd&#xff0c;输入命令行&#xff1a;mysql -V (注意了&#xff0c;此时的V是个大写的V) 二、…

海外问卷调查项目拆解(操作全流程演示)保姆级攻略具体操作

海外问卷调查是怎么做的&#xff1f;好做吗&#xff1f; 关于这个问题&#xff0c;不管我说好做、或者不好做&#xff0c;都并不能解决问题&#xff1b; 所以&#xff0c;这篇文章直接把做题的全过程展现给你看&#xff0c;你自己去真实地感受一下&#xff0c;这个玩意儿到底…

华媒舍:3个科学指导,协助油管大V写下爆款文章

油管&#xff08;YouTube&#xff09;作为一个重要的视频分享平台&#xff0c;吸引了很多的观众和原创者。作为一位油管大V&#xff0c;你可能会一直在努力提升自己的文章质量以吸引更多的观众和订阅者。下面我们就为您提供三个科学指导&#xff0c;帮助自己写下更具有爆品发展…

浅析JavaWeb内存马基础原理与查杀思路

文章目录 前言Java内存马内存马分类&原理JavaWeb三大组件注入Servlet内存马注入Filter型内存马JAVA Agent内存马 哥斯拉木马0x01 WebShell0x02 MemShell0x03 FilterShell0x04 Arthas排查0x05 scanner查杀 总结 前言 几年前写过《Web安全-一句话木马》&#xff0c;主要介绍…