这一段时间我在做一些关于基于webrtc应用的一些研究,做个一个android的demo,详情如下:
手机客户端: 基于webrtc的 android apk (webrtc 代码版本 R6751)
server : 已经nodejs的javascript 版的server
web客户端: 浏览器(chrome 36.0.1985.125 m)
客户端和server之间是通过websocket来通讯。
遇到的问题
浏览器和浏览器之间能够正常的通讯(视频通话),但是android apk 一直都不能和web浏览器进行视频通讯。整了三个星期才整明白是怎么回事,我证明我有多搓,特将我解决问题的过程写下来,以防下次再犯。
1.由于官方有提供的android 版的demo,首先肯定想到的是自己对jni接口的使用上存在问题。所以查了很久的代码发现对接口的使用上存在一些问题,并改了过来,但是问题仍然没有解决。
发现的问题有:接口的调用方式存在问题,setremotedescription成功之后才能调用createanswer,mediaconstraint的设定不正确。
2.既然问题仍然存在就追查呗,后来发现android客户端试图使用受到的candidate和对方创建连接,但是对方无任何反应。就觉得是nat穿越的问题,NAT穿越失败,google上查了很多资料,相关的论坛上也找了个遍,也没什么发现。后来去设置turnserver,花了很久吧server配置好之后,问题仍然存在。
3.后来觉得是apk权限不足,找了去查了AndroidManifest.xml也没什么问题,其实这个想法有点有病乱投医的味道。
4.后来从报文入手,分别抓去官方demo和浏览器的交互报文(websocket,stun等等),自己的demo和浏览器的报文,官方web应用之间的报文,自己的web应用之间的报文。深刻对比他们的sdp之间有什么差别,结果也没什么问题,上面的四种情况中其他三种都是stun报文都是正常的,为自己的demo和浏览器之间浏览器不响应demo的stun报文。百思不得其解。
5.经过一番折腾之后还是觉得mediaconstraint的设定存在问题,然后就是mediaconstraint的各种参数的尝试,结果还是没发现问题。
6.在查看官方web应用的log时无意中发现了里面一些关于设定成功的日志(set remote session success 类似这样的提示),后来也将这些 日志加到自己的web应用中,结果发现web应用中在把androiddemo发过来的sdp设置到自己的session(我的理解是用对方的sdp,设定自己的session)里面时出错。以前从来没有怀疑过自己的web应用会有问题,现在觉得可能是web应用存在错误。于是将官方的web应用里面的一些处理数据的方式和log 加到自己的web应用中,发现问题还是没有解决。
7.为什么web应用之间就不会出错,androiddemo和web应用之间就会出错,难道web应用有什么地方可以根据报文来区分报文是androiddemo发来的还是web应用发来的?没理由啊,后来我就讲携带sdp的整个报文拿出来分析,结果androiddemo发来的报文中少了一个字段(sdp的type),查看代码发现自己在发送sdp报文的时候,无意中将type字段给漏掉了,问题还是处在android程序这边,无语。。。 ,加上该字段问题解决。
总结:
问题其实是一个很简单的错误导致的,我追查了这么久分析了各种原因,查android 代码,查日志,查报文,查web应用的代码,查web应用的log,结果发现问题还是在android代码上。
发现了自身很多问题,分析问题不够准确,不够自信,在压力的情况下思路不够清晰,更重要的是不够仔细(完全可以避免这样的问题),对日志的重要性认识不够深刻。