Whatsapp VoiceCall
github demo
客户端通过websocket连接到服务器,客户端发起语音通话请求,并且完成必要的协商之后,就可以直接将语音数据发送给服务器,服务器接收到对方的语音数据之后也会通过websocket将语音数据转发给客户端。
websocket连接并不是和whatsapp 服务器连接
获取协商秘钥
XMPP 在发起语音通话请求的时候,需要带上一个秘钥,这个秘钥长32字节,通过特殊算法生成。whatsapp 服务器接收到秘钥之后会解密,然后校验时间戳。这个算法需要三个参数:
- 自身jid
- 对方jid
- 时间戳
//发送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