李昱兵,汪 伟,赵季中
(1.西安交通大学 电子与信息学院 计算机系,陕西 西安 710049;2.长虹四川虹美智能科技有限公司 技术研究中心,四川 绵阳 621000)
近年来,随着移动互联网的普及和物联网技术的成熟,以智能冰箱、智能空调为代表的智能白电产品(以下简称智能白电)虽然发展迅速,但是由于缺乏平台化的系统软件,行业普遍存在重复开发、研发周期长、传感器匹配难、配网体验差、系统通用性不强等问题。因此,研发面向智能白电的系统软件,不仅有利于企业提升新品开发效率,也有利于家电和智能家居行业的智能化转型升级。
文中在研发定制化系统软件、特定外设传感器驱动方面做了大量研究和实践,产品化后效益显著。文中将阐述智能白电系统软件的总体设计思路,以及传感器驱动、设备控制协议、家电网络接入等核心软件的设计方法、技术突破和创新工程应用。
国内外大部分研究是基于Windows CE、Android等开发相对独立的家居控制系统。例如,基于Windows CE的智能家居系统多以系统应用软件为主控,配合外围单片机实现温度采集、视频采集、网络服务等功能[1]。而基于Android搭建的智能家居控制系统多以手持终端与其他硬件模块配合,实现家居控制,与家电本身存在差异[2]。另外则基于Android开发智能网关来实现视频监控、电量检测、温度检测等功能[3-4]。现有研究多是家居系统而非白电产品。
文中研究侧重基于智能白电的系统软件,研究方式上并未停留在简单移植和裁剪层面,而是针对白电专属外设驱动、设备控制协议、网络接入等方面做了深入研究,解决了一系列技术难题,形成了一套通用化、平台化水平较高的系统软件。该软件缓解了行业缺乏白电系统软件的难题,有效提升了智能白电产品的研发效率和质量。
基于智能白电特性,系统须满足:(1)轻量、高效、稳定;(2)具备成熟的GUI系统;(3)具有可配置化及可裁剪特性,基础系统需要方便进行二次研发。
综合评估Windows CE、Unix等现有主流操作系统后,最适合作为智能白电系统软件的基础系统[5]是开源Android系统。
通常智能白电的硬件系统由两部分组成(见图1),左侧为产品的电控系统,右侧为智能SOC系统。二者通过串口连接,构成整个硬件系统。文中设计的系统软件运行于智能SOC上。
图1 智能白色家电硬件架构
文中采用裁剪加定制的研发思路,先将Android系统中白电产品不需要的软件模块(图2中白底黑字部分)裁剪掉,保留Linux Kernel、HAL、JNI、Java Framework等核心框架(图2中黑底白字部分)。
图2 Android系统裁剪示意
定制开发分为三步。第一步是开发白电设备所需的一系列外设(传感器)驱动及硬件抽象层;第二步是开发智能白电控制协议、网络接入模块等核心库和定制库;第三步是开发应用接口,供上层应用调用。
如图3所示,定制开发的系统软件从上至下分为4层,分别与Android的应用层、框架层、运行库层和内核层对应[6]。定制开发的系统可支持带GUI的Android应用和不带GUI的Linux应用,以满足不同产品需求。
图3 智能白电系统软件架构
系统裁剪分为Linux内核裁剪和Android系统裁剪两方面。
内核裁剪重点是对智能白电无用但又会占用大量硬件资源的文件系统,如EXT、DOS-FAT/NTFS等,ISA、PCMCIA等总线协议,WIMAX、VLAN等通信协议,打印机、CD/DVD、鼠标等针对PC的外设驱动[6]。
裁剪时先使用$make menuconfig命令调出内核配置菜单进行快速裁剪[7],按需要调整KCONFIG文件,并进行编译、烧录和运行测试。执行$make menuconfig命令后,裁剪配置信息会保存到内核源码树根目录下的.config中。在确认裁剪生效后,以产品的SOC信息重命名.config文件,并将其保存到kernel/arch/arm/目录下指定位置。后续研发时只需修改此文件中的编译开关就可快速启用所需驱动。
Android系统裁剪需从系统应用、系统服务、硬件抽象层三方面入手。
裁剪掉包括电话拨号、通讯录管理、短信与彩信、电子邮件、Google play、地图和游戏等[7]在内的系统应用,可使system.img缩小几十兆字节,降低存储空间占用并提升软件烧录速度。裁剪可从build/target/product/目录下的core.mk和generic.mk文件入手,理清默认编译、安装的应用程序及依赖关系后,将裁剪对象涉及的代码注释掉。
需要裁剪的服务包括本地系统服务和Java系统服务两类[8]。裁剪前者可从init.rc文件入手,重点移除vold、ril-daemon、dbus、bluetoothd、pbap等本地系统服务。裁剪后者需要找到源码树中所有调用addService方法(ServiceManger类的成员)的代码,在理清错综复杂的依赖关系后裁剪掉BatteryService、LocationMangerService、DropBoxManagerServicet等Java系统服务。
同时裁剪RIL、重力传感器、磁力传感器、陀螺仪、图像硬件加速以及GPS等模块为主的硬件抽象层。裁剪硬件抽象层frameworks/base/services/jni/Onload.cpp文件中的JNI_OnLoad函数,注释掉无关的硬件抽象层模块可获得显著的裁剪效果。在hardware目录下的各个Android.mk,修改此文件后无关的硬件抽象层将不被编译。
定制开发涉及内核驱动、定制库、核心库等三个层级的十余个模块(如图3所示),而SOC控制步进电机、多摄像头驱动、设备连接控制协议等则是创新应用基础[9],也是文中的技术创新点。
定制系统软件首先为智能白电特有的外设(传感器)开发驱动和硬件抽象层。驱动被设计在内核空间,硬件抽象层则按照Android Hal标准实现[10-12]。智能白电特有的外设包括步进电机、红外传感器、图像传感器、温湿度传感器、PM2.5传感器、VOC传感器、麦克风阵列与音频DSP等。家电专用的传感器按标准I2C设备驱动实现,并以字符设备形式向上层提供接口。
步进电机多与单片机配合应用于工业控制领域,在智能白电上应用特别是SOC直接控制步进电机的研究和应用都比较少。文中设计了一种适用于智能家电SOC控制步进电机的新方案:利用SOC主芯片的若干个PWM控制器生成具有精确周期和占空比的脉冲信号,利用delay类函数精确控制各脉冲信号间的初始相位差,从而解决CPU占用率高的问题。同时PWM控制器生成的脉冲信号具备芯片级的一致性和准确性,而delay类函数也有足够的精度用于设置初始相位差。
该设计无论是CPU占用率还是信号精度,都满足了智能家电的应用要求。实验表明,采用新方案的某型号智能空调,其步进电机实现了7×24小时无故障运行。由于Linux是多任务抢占式操作系统,必须在操作若干个PWM控制器前关闭中断、关闭抢占,操作PWM控制器后再打开(见示例代码前两行和最后两行),否则运行过程或出现难以排查的问题。
void pwm_drive_motor_move_clockwise(void){
local_irq_disable();//关闭中断
preempt_disable();// 关闭抢占
motor_pwm_enable(&motor_pwms[3]);
ndelay(STEP_PERIOD*2);
motor_pwm_enable(&motor_pwms[2]);
ndelay(STEP_PERIOD*2);
motor_pwm_enable(&motor_pwms[1]);
ndelay(STEP_PERIOD*2);
motor_pwm_enable(&motor_pwms[0]);
local_irq_enable();
preempt_enable();
}
某系列智能冰箱的核心功能“食材图像识别”,其关键是基于智能白电SOC实现多路图像采集:快速地从冰箱的十余个位置采集清晰的食材图像。关于多路图像采集技术的研究多集中在安防领域,以采用FPGA、DSP或PC处理器构建的系统居多[13]。与安防等常见领域的多路图像采集不同,智能白电的多路图像采集要求低成本、低功耗、小尺寸、高可靠性。
新设计的多路图像采集系统采用USB2.0总线,将分布于冰箱内部不同位置的摄像头与SOC芯片连接,在对成本(低于20元)、尺寸、线长(超过1米)的约束下,支撑了12个摄像头的图像采集。
基于USB构建多路图像采集系统的关键是需要解决多摄像头支持问题。此前未见关于Android系统支持超过3个摄像头的研究文献。对此,文中首先采用2颗SMSC公司的USB2517芯片,将一个USB接口扩展为12个,突破了SOC芯片USB接口数量约束。
其次,采用如图4所示设计,使用最多4个GPIO输入到2个3-8译码器,即可控制多达16个摄像头的供电切换。结合USB即插即用性质可实现多个摄像头快速切换的目标。以下是摄像头供电切换控制的示例,将译码器状态表与控制口的GPIO信息形成数据结构,供切换时查询。实现方法如下:
static int uvc_hub_enable_port(int port_index){
int i;
int ret=0;
for (i=0;i if(ret<0){ printk("Fail to control LDO port: %d, GPIO:%d
",port_index,->a[i].gpio); return ret; } } 图4 多路摄像头电源控制 第三,对Android和Linux内核做从上而下的修改[14],解除Android框架对摄像头数量的限制,扩大V4L2体系中相关数据结构的长度,解决原生Android的摄像头框架未考虑多摄像头成千上万次切换的问题。 下面代码是以Android接口文件CameraService.h为例,解除系统支持的摄像头个数上限为2的限制。在Android JNI层、硬件抽象层以及Linux内核中亦存在诸多类似限制,需逐个修改,限于篇幅不再列举。 #define MAX_CAMERAS2 //对摄像头数量的限制需要解除 class Client:public BnCamera { … Mutex mServiceLock; wp Mutex mClientLock[MAX_CAMERAS]; //prevent Client destruction inside callbacks int mNumberOfCameras; … } 对采用该设计的冰箱实验和测试显示,12颗摄像头完成一次图像采集耗时不超过30 s,并以7×24小时反复采集图像数据。 系统另外一个定制化特色是设备控制协议,包含互联网范围内的远程控制协议、局域网控制协议以及SOC与电控系统的串口通信协议等三个层次[15]。 互联网范围内远程控制协议是采用可扩展消息处理现场协议(XMPP),利用它来实现设备远程控制、上传设备状态信息等功能,该协议被越来越多地应用于智能家电[16]。 IPP(integrated person portal)作为局域网近端通信协议,用于本地控制。在此协议中存在控制终端和被控终端两种角色,前者一般是移动应用,后者是各种智能白电。IPP在设备入网发现、局域网设备控制中发挥核心作用。 其设计方法是:在设备入网时,控制APP和智能白电通过监听指定端口上的UDP包,实现设备发现。端口和数据包格式由IPP协议规定。图5描述了移动应用通过IPP协议在局域网控制智能白电的关键通讯过程。 图5 IPP协议局域网数据通讯过程 如图1所示,智能白电SOC与电控系统之间通过串口进行通信,并建立一个主控通信接口层,将与电控系统联系紧密的协议拼接工作控制在底层,兼顾具体智能产品的特性,使得同一套通讯控制代码可以自动适配不同的产品。 设备接入方式可划分为有线接入和无线接入两大类。前者多采用MCU加以太网控制器的架构,通过RJ-45接口接入以太网[17]。这类接入方式的优点是连接方便、稳定,缺点是需要布线、移动性差,在白电领域应用受限。后者多基于Wi-Fi、ZigBee等无线通信技术及无线网关将设备接入Internet。相比有线接入方式,无线接入更具灵活性,更适合智能白电。 目前智能白电网络配置主要步骤如下: (1)智能设备进入待配网模式; (2)手机连接家庭Wi-Fi路由器; (3)手机将家庭Wi-Fi路由器SSID和密码发送给智能设备; (4)智能设备切换至Station模式; (5)智能设备连接家庭Wi-Fi路由器。 在以上配网流程中,智能设备在同一时刻工作在单一模式,因此需要进行工作模式切换,而智能手机也将反复连接智能设备和家庭路由器,三者的配合非常复杂,操作麻烦,易出现配网失败,造成用户体验差。 文中设计是将白电Wi-Fi工作期划分为若干个可调节时隙,如图6所示,在T1时隙内,Wi-Fi工作在STA模式,在T2时隙内,Wi-Fi工作在AP模式,如此反复。 图6 智能白电Wi-Fi模式分时复用 这种设计在宏观上可使一颗Wi-Fi芯片同时工作在STA(station)和AP(access point)两种模式,从软件上虚拟出两个网卡。工作在AP模式的网卡可用于手机向白电发送家庭中心路由器的SSID和密码,也可用于局域网控制。而工作在STA模式的网卡则用于连接家庭路由器。由于设备AP热点一直存在,手机APP可直观地扫描到家庭中有哪些同品牌的智能家电,因此可以有选择地对设备进行网络配置和局域网范围内的操控,能有效地提升用户体验。 从原生Android系统出发,采用裁剪加定制的方法研制面向智能白电的系统软件,解决了行业缺乏平台性系统软件的问题,在智能白电外部传感器驱动设计、设备控制协议、网络接入、通用性等方面克服了众多技术难题。在业内首次将多摄像头、步进电机等应用于智能白电产品,支撑了M品牌CHiQ空调的“红外人体状态识别”和CHiQ冰箱的“食材识别”等业界领先的全新功能,不但有效提升了企业智能白电产品的研发效率和质量,对整个智能家电产业、智能家居行业、人工智能发展也有一定的参考意义。4.2 智能白电设备控制协议
4.3 设备的网络接入技术
5 结束语