树莓派作为网络网关,在车载对讲机与在同一局域网内的设备终端之间进行音频传输。
车载对讲机通过无线电将音频传输给若干个手持对讲机,这样就实现了手持对讲机与同意局域网内的设备终端之间的语音通话。
(1)设备终端通过UDP的广播找到树莓派网络网关的IP地址。 终端设备可能并不知道树莓派网关的IP地址,如果没有树莓派网关的IP地址则无法进行通信,因此需要利用UDP的广播功能获得树莓派网关的IP地址。 UDP为用户数据包协议,它不需像TCP 那样,在发送数据前需建立连接,UDP是无连接的。 广播仅应用于UDP,广播是将数据报发送到网络中的所有主机。 当树莓派接收到来自设备终端的UDP广播数据包,会给该终端回复一个数据包,这样设备终端收到该数据包时就知道了树莓派的IP地址,为之后的音频通信做准备。
(2)在网络传输(或接收)音频之前,用开源免费的speex编解码器进行编(解)码,这样可以减小网络负担。 由于音频数据的传输可能会占用较大的网络带宽,因此需要先对音频数据进行压缩编码再传输。 Speex是一种开源免费的音频压缩格式,专为语音而设计。Speex是基于CELP并且专门为码率在2-44kbps的语音压缩而设计的。
(3)利用自己实现的RTP协议在网络中传输音频数据。 由于语音通话需要较高的实时性,UDP是比TCP更好的选择,因为TCP协议的是面向连接的,协议较为复杂,这是牺牲了实时性换来了可靠性。而UDP是不用连接的,但是这会引入一个问题,在网络传输的过程中,发送数据包的顺序和接收数据包顺序可能是不一致的,因此需要改进UDP协议,实现数据包的顺序一致性。 实时传输协议(Real- time Transport Protocol,RTP)是在Internet上处理多媒体数据流的一种网络协议,利用它能够在一对一(unicast,单播)或者一对多 (multicast,多播)的网络环境中实现传流媒体数据的实时传输。 RTP协议最重要的是提供了时间标签,序列号以及其它的结构用于控制适时数据的流放。在流的概念中”时间标签”是最重要的信息。发送端依照即时的采样在数据包里隐蔽的设置了时间标签。在接受端收到数据包后,就依照时间标签按照正确的速率恢复成原始的适时的数据。不同的媒体格式调时属性是不一样的。RTP协议和UDP二者共同完成运输层协议功能。UDP协议只是传输数据包,不管数据包传输的时间顺序。 RTP的协议数据单元是用UDP分组来承载的。在承载RTP数据包的时候,有时候一帧数据被分割成几个包具有相同的时间标签,则可以知道时间标签并不是必须的。而UDP的多路复用让RTP协议利用支持显式的多点投递,可以满足多媒体会话的需求。
(4)设备终端实现PTT模拟手持对讲机的半双工机制。 手持对讲机有一个叫PTT(Push to talk)的按键,在需要对讲时要按下PTT,而设备终端是没有这个按键的,所以我们通过软件实现了一个PTT,在设备终端需要对讲时要按下该“按键”。
(5)树莓派网关监测对讲机设备处在speech模式还是mute模式 为了减小车载对讲机的能耗,树莓派通过监测从车载对讲机传来的声音的能量来确定是否有人在说话,如果声音的能量低于某个阀值则为mute模式,关闭车载对讲机;如果声音的能量高于某个阀值则为speech模式,开启车载对讲机。