ZigBee 是以 IEEE 802.15.4 标准为基础的一种低成本、低功耗的无线网络技术,通过 ZigBee 协议栈,可将各 ZigBee 节点形成一个节点容量大、通信范围广的 ZigBee 网络。而 H.264 是当今最好的视频压缩标准,具有码流率低、图像质量高、容错能力强等优点。使用 ZigBee 网络来传输 H.264 视频码流,是实现无线视频传输系统的一种好方案。通过具体开发实例,从硬件和软件两个方面讨论了该方案的设计与实现。
 
0  引言
ZigBee 是以 IEEE 802.15.4 标准为基础的一种低成本、低功耗、网络容量大、通信范围广的无线网络技术,可支持多达 65 000 个节点。ZigBee 的工作频段有 3 个,分别是 868 MHz、915 MHz、2.4 GHz,当工作于 2.4 GHz 时,其拥有最高的传输速率 250 KB/s。在存储量尽可能小的情况下获得好的图像质量和低带宽图像快速传输已成为视频压缩的两大难题。为此 ISO/IEC 和 ITUT 两大国际标准化组织联手制定了新一代视频压缩标准 H.264[3]。H264 具有图像质量好、连续性强、动态图像质量高、压缩比高、码流速率可调等优点。本文从硬件和软件两个方面讨论使用带 H.264 硬件编解码器、ARM9 CPU 核的 i.MX27 和带 ZigBee 协议栈的微处理器 CC2430 来共同组建无线视频传输系统。
 
1  系统总体设计
 
 
 
系统总体设计如图 1 所示,整个 ZigBee 网络由一个 ZigBee 协调器、多个 ZigBee 路由器和 ZigBee 无线视频终端组成[4]。由于 CC2430 集成了 2.4 GHz DSSS 射频收发器和单片机控制器,因此 ZigBee 设备可以使用 CC2430 单芯片来实现。ZigBee 协调器用于组建最初的 ZigBee 网络,并为加入网络的每个 ZigBee 路由器和 ZigBee 无线视频终端分配 16 位网络短地址。ZigBee 路由器在 ZigBee 网络中扮演路由和中继的角色,为各 ZigBee 无线视频终端传输数据并扩大无线数据传输的范围。ZigBee 无线视频终端根据分配得到的 16 位网络短地址可以相互之间进行双向无线数据通信[5]。i.MX27 上采用 Linux 操作系统,在 Linux 下通过对采集的图像进行硬件压缩编码,各 ZigBee 无线视频终端之间的数据以 H.264 码流的形式进行无线传输。
 
2  ZigBee 无线视频终端的硬件设计
考虑到 H.264 软件编解码需要消耗大量的 CPU 资源,故本方案中选择了具有 H.264 硬件编解码器及 ARM9 CPU 核的 Freescale 微处理器 i.MX27。ARM9 CPU 核一方面负责将摄像头采集到的 YUV 图像数据送入 H.264 硬件编码器,并将硬件编码器输出的 H.264 码流通过 ZigBee 微处理器 CC2430 无线发送出去。另一方面通过 CC2430 接收 H.264 码流并送入 H.264 硬件解码器,然后将硬件解码器输出的 YUV 图像数据显示到液晶屏上。ZigBee 微处理器 CC2430 负责 H.264 码流的收发工作,并通过 SPI 接口与 i.MX27 进行通信。 ZigBee 无线视频终端的硬件组成如图 2 所示。  
 
 
为了实现图像的采集,本方案采用含有 OV9650 芯片的 CMOS 摄像头,采集到的图像通过 i.MX27 的 CSI 接口传输到 H.264 硬件编码器中。对于图像的显示,则选择群创 AT070TN83V.1(16∶9,800×480)7 英寸 TFT 液晶屏。该屏支持 18 位数字 RGB 接口,格式为 RGB666,即每个像素由 6 bit 红、6 bit 绿、6 bit 蓝构成 18 bit 数据。该屏与 i.MX27 的 LCDC 控制器主要通过 18 根数据线(LD[17:0])、帧同步(VSYNC)、行同步(HSYSNC)、时钟(LSCLK)进行连接。采用一片三星的 K9F2G08R0A NAND Flash 芯片(256 M×8 bit)来储存系统的 Bootloader(RedBoot),Linux 内核,文件系统和视频程序。由两片 Infineon Technologies 的 HYB18M512160AF7.5 芯片(4 Bank×8 M×16 bit)构成 128 MB 的 DDR,主要用于加载 Linux 操作系统和运行视频编解码程序。
 
设计一个 10 针的 JTAG 接口,用来烧写系统的 Bootloader、Linux 内核和文件系统。使用 MAX3232 构成 UART 接口,用来将调试信息返回到 MiniCom 上显示。因处理器内核需要 1.8 V、1.5 V 电压,而存储器和外部 I/O 需要 3.3 V 电压,故把整个系统的输入电压设为 5 V,经过 DCDC 转换器可完成到 3.3 V、1.8 V、1.5 V 的电压转换。采用 26 MHz 的有源晶振,晶振经过 i.MX27 片内的 PLL 电路倍频后最高可达到 400 MHz。
 
ZigBee 通信模块以 CHIPCON 公司的 CC2430 微处理器为核心。将 CC2430 的 SPI 接口与 i.MX27 的 SPI 接口连接,H.264 码流通过 SPI 接口进行传输。
 
3  ZigBee 无线视频终端的软件设计
3.1 图像采集
CSI(CMOS Sensor Interface)是 i.MX27 中的 CMOS 图像传感器接口。图像的采集可通过 CSI 接口、图像传感器芯片 OV9650 和 Linux 下视频设备的内核驱动 V4L2 来实现,所以需要加载 CSI 驱动 mx27_csi.ko、ov9650 驱动 ov9650_cam.ko 和 V4L2 驱动 mx27_v4l2_capture.ko。这样应用程序在打开 V4L2 后,就可以进行图像数据采集了。
 
3.2 图像显示
LCDC(Liquid Crystal Display Controller)是 i.MX27 中的液晶显示控制器。可通过 LCDC 接口来控制图像的显示,故需要加载 LCDC 驱动 mxcfb_modedb.ko 和 mxcfb.ko 及帧缓冲驱动。使用帧缓冲设备时,可将显示缓冲区直接映射到 Linux 用户空间。这样在 Linux 用户空间,应用程序可按照预先设置好的 R、G、B 位数和偏移量,将图像数据直接写到经过 mmap()映射后的显示缓冲区,进而实现图像的显示。
 
3.3  H.264 编解码
VPU(Video Processing Unit)是 i.MX27 中的视频处理单元,主要用于 H.264 BP、MPEG-4 SP、H.263 P3 格式的硬件编解码[6]。为了用户能够使用 VPU 的硬件编解码器,Freescale 提供了一套 Linux 下的基于 i.MX27 VPU 的库文件。不论是编码还是解码,首先都必须调用 vpu_Init()函数对 VPU 硬件进行初始化。
 
对于 H.264 编码,需要执行以下步骤:
(1)调用 vpu_EncOpen()函数对 VPU 编码器初始化;
(2)调用 vpu_EncGetInitialInfo()函数获取编码初始化信息;
(3)调用 vpu_EncRegisterFrameBuffer()函数注册编码帧缓冲;
(4)调用 vpu_EncStartOneFrame()函数,将编码帧缓冲中的每一帧图像数据送入 VPU 编码器编码,并将编码得到的 H.264 码流存放到指定的位流缓冲区中;
(5)当需要结束编码操作时,只需调用 vpu_EncClose()函数。H.264 编码的执行流程如图 3 所示。
 
 
 
对于 H.264 解码,需要执行以下步骤:
(1)调用 vpu_DecOpen()函数对 VPU 解码器初始化;
(2)调用 vpu_DecGetInitialInfo()函数获取解码初始化信息;
(3)调用 vpu_DecRegisterFrameBuffer()函数注册解码帧缓冲;
(4)为了获取需解码的 H.264 码流,可调用 vpu_DecGetBitstreamBuffer()函数;
(5)调用 vpu_DecStartOneFrame()函数,将 H.264 码流送入 VPU 解码器进行解码,并将得到的图像数据存放到解码帧缓冲中;
(6)当需要结束解码操作时,只需调用 vpu_DecClose()函数。H.264 解码的执行流程如图 4 所示。
 
3.4H.264 无线传输
要进行 H.264 码流无线接收和发送,首先需要加载 i.MX27 的 SPI 接口驱动 mx27_spi.ko。通过 SPI 接口,i.MX27 可以将 H.264 码流[7]传输到 CC2430 中并无线发送出去,也可以将 CC2430 无线接收的 H.264 码流输入到 i.MX27 中。
 
由于 ZigBee 在 2.4 GHz 工作频段和 250 KB/s 的传输速度下,物理层每次最多只能传输 127 B 的数据包。除去物理层和 MAC 层的网络包头,ZigBee 每次传输的实际数据最多只有 89 B[8]。由于 ZigBee 网络层不能对 H.264 码流进行分割和重组,而传输的 H.264 码流远多于 89 B,因此必须在 ZigBee 协议的应用层将 H.264 码流分割为等于或小于 89 B 的数据包进行传输。在接收端需要对这些分解的数据包进行重组,以形成正确的 H.264 码流。由于在无线数据传输过程中被分割的数据包可能会丢失,这将直接影响接收端的数据重组,因此需要建立一个重传机制来重传数据传输过程中丢失的数据包。下面给出分组传输的数据包的格式。
 
数据发送之前,先执行握手协议[9]。ZigBee 发送端先发送请求包,告诉 ZigBee 接收端即将发送的一帧 H.264 数据将被分割为几个数据包以及第一个数据包的编号。编号字段定义为 4 B,能对 4 GB 的数据进行编号,这样可以保证当编号重复时,旧编号的数据包早已在网络中消失。
 
ZigBee 接收端接收到请求包后,将返回一个确认包,表示 ZigBee 接收端接受 ZigBee 发送端的请求。ZigBee 发送端接收到确认包后,同样也返回一个确认包,这样握手协议完成。接下来就是实际的数据通信了。握手协议的执行流程如图 5 所示。
 
  
 
握手协议完成后,ZigBee 接收端将根据分割数据包的数量来分配接收缓冲区大小。将接收到的每个数据包按照数据包的编号依次存放到接收缓冲区对应的位置处,并将该位置的标志置 1,表示接收到了对应的数据包。如果接收缓冲区中某些位置的标志为 0 并且对应的定时器超时,则表示该位置没有接收到对应的数据包,数据包在无线传输的过程中丢失。ZigBee 接收端需要向 ZigBee 发送端发送一个重传包,请求将丢失的数据包重新传递过来。本传输协议规定,若针对某位置连续 3 次发送重传包后,定时器连续 4 次超时,则表示传输失败。ZigBee 接收端将发送重新开始包,命令 ZigBee 发送端对下一帧 H.264 数据进行传输。协议重传的执行流程如图 6 所示。
 
 

 

4 系统测试
为了测试 ZigBee 发送端是否将每一帧 H.264 数据成功地传输到了 ZigBee 接收端,现在在 ZigBee 发送端和接收端之间依次放置 1~4 个 ZigBee 路由器,对 100 帧 H.264 数据进行传输测试。无线传输 H.264 图像的测试结果如表 1 所示。
 
 
可见,图像从 ZigBee 发送端无线传输到 ZigBee 接收端所经过的路由器越少,传输的成功率越高。实际测试时,每秒能传输约 14 帧 H.264 图像数据,基本上达到了无线视频传输的要求。
 
5 结论
本文详细地介绍了基于 ZigBee 和 H.264 的无线视频传输系统的设计与实现,文中所设计的方案不仅能用于无线数字视频传输,也可以应用到无线数字音频传输,具有很强的通用性。