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扬声器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RuoYi-Vue若依框架-在框架内用颜色选择器,页面显示色块

在用若依框架进行二次开发的时候写到自己的一个模块&#xff0c;其中涉及到颜色&#xff0c;我就想着是手动输入还是采用颜色选择器呢&#xff0c;考虑到后续涉及到另一个字段编码于时就采用了颜色选择器&#xff0c;选择完的颜色显示的是十六进制的颜色选择器&#xff0c;这时…

Transformers in Vision:A Survey 阅读笔记

ACM上的一篇综述&#xff0c;讨论Transformer在CV上的应用。 摘要&#xff1a; Among their salient benefits,Transformers enable modeling long dependencies between inputsequence elements and support parallel processing of sequence as compared to recurrent networ…

深度剖析:网络安全中的红蓝对抗策略

红蓝对抗 红蓝对抗服务方案 在蓝队服务中&#xff0c;作为攻击方将开展对目标资产的模拟入侵&#xff0c;寻找攻击路径&#xff0c;发现安全漏洞和隐患。除获取目标系统的关键信息&#xff08;包括但不限于资产信息、重要业务数据、代码或管理员账号等&#xff09;外&#x…

【移动安全】对webview漏洞的一些分析

这次分析的app如下&#xff1a; 打开发现该app发现需要登录界面&#xff1a; 拖进jadx看一下&#xff0c;先来看一下AndroidManifest.xml文件 发现有两个类是导出&#xff0c;再来分析这两个类 这个RegistrationWebView类利用webview.loadUrl进行加载网页 java public class…

Vue基础知识:声明式导航——跳转传参,声明式导航有哪几种路由传值方式,查询参数传参语法,动态路由传参语法,两者的区别

在跳转路由时&#xff0c;进行传值 1.查询参数传参 1.语法格式如下&#xff1a; to"/path?参数名值" 2.对应页面组件接收传递过来的值 $route.query.参数名 案例演示&#xff1a; 此时点击“跳转并携带参数”这个链接&#xff0c;就会跳转到search这个页面并携带参…

SpringCloud学习(10)-SpringCloudAlibaba-Nacos服务注册、配置中心

Spring Cloud Alibaba 参考文档 Spring Cloud Alibaba 参考文档 nacos下载Nacos 快速开始 直接进入bin包 运行cmd命令&#xff1a;startup.cmd -m standalone 运行成功后通过http://localhost:8848/nacos进入nacos可视化页面&#xff0c;账号密码默认都是nacos Nacos服务注…

断网了,还能 ping 通 127.0.0.1 吗?

什么是127.0.0.1 什么是 ping TCP发数据和ping的区别 为什么断网了还能 ping 通 127.0.0.1 ping回环地址和ping本机地址有什么区别 127.0.0.1 和 localhost 以及 0.0.0.0 有区别吗 总结 你女神爱不爱你 &#xff0c;你问她&#xff0c;她可能不会告诉你。 但网通不通 &#xf…

CLCD 流水线发布SpringBoot项目

目录 一、流水线 1.1 点击进入流水线 1.2 新建流水线 二、添加流水线 三、构建上传和构建镜像 ​编辑 四、Docker部署 一、流水线 1.1 点击进入流水线 1.2 新建流水线 二、添加流水线 三、构建上传和构建镜像 在构建上传里添加一个步骤&#xff1a;构建镜像&#xff0c;这…

房企如何驱动新“三驾马车”,穿越地产周期?

今年以来&#xff0c;房地产行业在不确定性的周期中&#xff0c;逐渐显露出部分确定性。 今年两会期间&#xff0c;住建部明确指出&#xff0c;构建发展新模式是破解房地产发展难题的治本之策&#xff0c;在新模式下今后拼的是高质量、新科技、好服务。可以说&#xff0c;国家…

Android与RN远程过程调用的原理

Android与RN远程过程调用的原理是通过通信协议进行远程过程调用。RPC(Remote Procedure Call)是分布式系统常见的一种通信方式&#xff0c;从跨进程到跨物理机已经有几十年历史。 在React Native中&#xff0c;通信机制是一个C实现的桥&#xff0c;打通了Java和JS,实现了两者的…

C++初阶---vector(STL)

1、vector的介绍和使用 1.1、vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是…

Spring——框架介绍

每一个Java技术中都会存在一个“核心对象”&#xff0c;这个核心对象来完成主要任务为了得到核心对象&#xff0c;需要创建若干个辅助对象&#xff0c;从而导致开发步骤增加JDBC中 JDBC 核心对象——PreparedStatement 通过DriverManager得到数据库厂商提供的Driver对象DriverM…

27.WEB渗透测试-数据传输与加解密(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;26.WEB渗透测试-BurpSuite&#xff08;五&#xff09; BP抓包网站网址&#xff1a;http:…

网络基础知识入门

目录 一、局域网与广域网 1、局域网 2、广域网 二、协议 1、概念 2、协议的理解 3、协议的分层 1、分层 2、OSI七层模型 三、网络传输基本流程 1、报头 2、局域网通信原理 3、跨网络传输流程 四、IP地址和MAC地址 1、IP地址 2、MAC地址 3、两者的区别 一、局域…

define的多种用法

一.宏的用法 当我们在计算一个数据的时候&#xff0c;这些数据里面有一些常量&#xff0c;比如说&#xff0c;圆周率&#xff0c;自然对出e&#xff0c;普朗克常量&#xff0c;光速这一类的。 例子: #include <stdio.h> #define PI 3.14 int main(){ double s,r2; pri…

虚拟机 ubuntu 20.04 git 设置代理的方法

前言 ubuntu 20.04 虚拟机中 Git 访问 github 或者其他的 git 仓库&#xff0c;大部分情况下速度很慢&#xff0c;并且容易掉线 如果 主机上使用了代理软件&#xff0c;但是虚拟机 ubuntu 中 Git 访问 git 仓库依旧是很慢 【问题】如何设置 虚拟机 ubuntu 的 Git 代理&#x…

langchain 学习笔记-FunctionCalling三种方式

ChatGPT 基于海量的训练数据生成答案&#xff0c;所以它无法回答训练数据中没有的信息或搜索信息 。人们希望 ChatGPT 具有对话以外的各种功能&#xff0c;例如“我想管理我的待办事项列表”。 函数调用是对此类请求的响应。 通过使用函数调用&#xff0c;ChatGPT 现在可以在生…

MPT - 初识账户状态树(World State)

往期回顾 ETH网络中的账户ETH网络中的区块链 通过以上文章&#xff0c;我们了解到ETH网络中的World State是节点根据交易维护的&#xff0c;节点在维护Wrold State时为了方便操作会将用户状态构建成一颗树&#xff0c;称为账户状态树&#xff0c;采用一种叫做MPT的数据结构 MP…

微信公众号取消了留言功能后,怎么提高互动和涨粉?

为什么公众号没有留言功能&#xff1f;2018年2月12日之后直到现在&#xff0c;新注册公众号的运营者会发现一个问题&#xff1a;无论是个人还是企业的公众号&#xff0c;在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验&#xff0c;少了一个这么重要的功能&…

四月软件测试面经合集(持续更新)

四月软件测试面经合集 polelink面试&#xff08;一面过&#xff09;01 对于JMeter接口测试&#xff0c;如何做接口关联&#xff1f;接口关联的定义JMeter关联方法正则表达式介绍贪婪匹配和非贪婪匹配案例分析正则表达式提取器步骤 02 是否会写shell脚本&#xff0c;能对shell进…