引言
近年来,随着嵌入式技术的迅速发展和开发成本的降低,基于掌上电脑的无线点菜系统正在逐渐替代原有的人工点菜方式[2]。以嵌入式系统为核心的无线点菜系统以快捷、高效、稳定等优点已迅速在中高端餐饮企业使用。
目前,已有的手持式点菜机多为服务员操作,其无线通信采用多信道跳频通信技术。随着人力成本的提高及客户体验度要求不断提升,人们希望在更为宽松与私密的空间中就餐,无人餐厅系统应运而生。本设计选择CortexA8平台结合ZigBee组网技术实现自助点菜系统,除具有一般点菜机的基本功能(如自动送餐、清洁、结算等)外,还可通过WiFi模块及云平台实现手机、网页及微信订餐业务。
无人餐厅系统实现了顾客与餐厅的互动,为顾客提供了各种菜品和服务信息;同时,餐厅通过后台数据库可以便捷地收集顾客的意见和建议,从而不断改善服务质量,为最终实现顾客和餐厅的双赢创造条件。利用ZigBee的网络拓扑,还可以实现对餐厅家电的控制,实现餐厅无线物联化。
1 系统构成
根据系统需求分析,本系统包括:自助点菜终端、PC主机端、网关端、厨房端、载物车、清洁车以及ZigBee无线通信系统。其中自助点菜终端、网关端和厨房端由CortexA8 DM3730与ZigBee模块构成,ZigBee无线通信是由CC2530组成的星形网络,作为核心模块的PC主机端利用ZigBee协调器实现与各节点模块的通信。通过QT应用程序编写人机交互界面,SQLite 作为嵌入式数据库,实现对无线传感网络的控制、管理、存储及查询。智能无人餐厅系统框图如图1所示。

图1 智能无人餐厅系统框图
各模块简要功能如下:
① PC主机端:实时显示餐厅信息,如菜单管理、预定管理、账单管理、用户管理、系统设置、打印账单和查询点菜信息。
② 手持点菜终端:点菜系统分为无预定点菜和预定点菜,可以查看菜品介绍、发送点菜信息、发送送餐及清洁指令。
③ 厨房端:厨房端能显示总台传来的菜品信息,将完成的菜品信息反馈给PC主机端。
④ 网关端:通过搭建Web服务器及CGI接口,可实现手机和网页订餐。
⑤ 送餐车:基于餐厅坐标,通过Dijkstra算法计算出餐桌间的最短路径[3],沿最短路径送餐,提高送餐效率。
⑥ 清洁车:智能两轮洗地机运用两轮和舵机臂的配合可以进行360°全方位的清洗,可以通过ZigBee发送指令或者使用手动模式进行清理。
⑦ 微信订餐:通过云计算平台、网络服务器及微信公众号可实现微信订餐。
2 硬件平台
本系统嵌入式平台硬件部分的核心采用TI公司CortexA8处理器DM3730,该芯片时钟主频可达到1 GHz,包含丰富的功能外设。选择UART3与CC2530连接,通过MAX3386进行电平转换,采用CP2102芯片完成UART转USB,由TFT 7寸触屏实现人机交互。采用DM9000AE网卡芯片实现网络通信,通过RJ45端口与外部网络接口相连。512 MB的MDDR以及512 MB的NAND Flash共同构成外部存储器。
无线通信传感网络各节点采用TI公司的CC2530,该芯片符合2.4 GHz IEEE 802.15.4协议,内部集成高性能RF收发器与8051微处理器。可配备TI专有网络协议栈ZStack,加快开发速度。打印机采用DPHT201便携式热敏打印机,提供USB接口,安装相应的驱动程序即可通过串口输出打印信息。清洁及送餐车模块略——编者注。
3 软件平台
3.1 ZigBee数据通信协议
在ZigBee网络中使用TI公司的ZStackCC25302.3.11.4.0协议,该协议符合ZigBee2007规范,支持多种平台。PC主机端与协调器之间的通信协议格式如下:

协议帧由64 位组成,协议帧帧头标记为“&&”,帧尾标记“$$”,表示一帧的结束。不足64 位,以“$”符号补齐。
协议帧共包括5个数据域,其中消息源及消息目的中的d、p、c、w、x、f分别表示点菜终端、PC主机端、厨房、网关端、小车和温控系统;源ID是用来标记点菜终端的ID号,范围为000~999;命令以“@”标记,根据消息源和消息目的不同,表示不同的含义,例如某数据来自点菜端,接收者为PC主机端,则命令“@1”表示点菜、“@2”表示加菜、“@3”表示结账、“@4”表示送餐;不同的命令将附加不同的命令参数,该数据域以“#”开始,以“#”结束。
如某数据帧为:&&d001p@1#1012#1034#$$…$$$$d001。表示该数据来自点菜终端1号桌;数据接收者为PC主机端;@1表示点菜;#1012表示点菜信息,其中“101”为菜品编号,“2”表示份数;不足64位的部分用“$”补齐。协调器主要完成3个部分的工作:初始化组成星形拓扑;接收PC主机端串口的控制命令,判断并封装成协议包发送给各节点模块;接收来自各节点模块的数据并解析,发送给PC主机端。
3.2 PC主机端软件架构
PC上安装集成开发环境Qt Creator,配置交叉编译工具win32g++及环境变量。在开发环境下编写人机交互界面,PC主机端QT应用程序流程框图如图2所示,包括餐厅实时信息界面、菜单管理界面、系统设置界面、账单管理界面、预订信息界面、温度控制界面、送餐车控制界面。搭建SQLite数据库,数据库包含6张数据表:
① 菜单信息数据表:保存菜品的ID、价格、描述、图片等信息。
② 预订信息数据表:通过MySQL定时读取网络数据库中的手机、网页、微信订餐等信息,并将预订信息更新到本地数据库。
③ 餐厅座位信息数据表:保存开台及订桌信息,通过主界面实时显示。
④ 实时账单数据表:保存当日账单,提供查询、修改、打印等功能。
⑤ 总账单数据表:保存总账单,提供查询、修改、打印等功能。
⑥ 特色菜数据表:根据菜品的销售情况排序,为微信客户提供特色菜目录。

图2 PC主机端QT应用程序流程框图
PC主机端通过串口实时接收来自ZigBee协调器上各节点模块的信息并更新数据库,然后将处理后的数据通过协调器发送给各节点模块。图3为送餐车Dijkstra算法实现界面。基于餐厅坐标,通过Dijkstra算法计算出餐桌间的最短路径,实时接收来自于送餐车的位置信息,当小车处于空闲或者到达某一目的地时,根据最短路径指定下一目的地。目前只考虑环形结构,即所有的节点分布在环形的循线上,可根据最短路径决定向前或向后循迹。

图3 送餐车Dijkstra算法实现界面
3.3 点菜终端与厨房端
点菜终端与厨房端模块软件架构基于嵌入式Linux系统。嵌入式环境的构建包含交叉编译环境的建立,UBoot1.1.6的移植、嵌入式Linux3.0.1内核的配置和移植,基于Busybox及Qt4.7.1的YAFFS2根文件系统的构建。对于内核的移植主要包括添加串口驱动、触摸屏及LCD驱动,以及网卡芯片、WiFi模块驱动等。
点菜终端界面可选择预定点餐和无预定点餐,进入点菜界面可以点餐、发送菜单信息、查看消费信息等功能。厨房端根据主机发送过来的菜单信息完成相应菜品准备,当完成相应菜单将信息返回给主机,继续下一餐单的准备。以下程序段为发送菜单的槽函数:
void ordersend::on_pushButton_4_clicked(){ //菜单发送槽函数
QSettings *sysset = new QSettings("/usr/qte/config/myorder.ini", QSettings::IniFormat);//读取ini配置文件
QString set;
QString senddata;
QString temp;
set=sysset->value("ORDER/tbnum").toString();//读取点菜终端的桌号
senddata.append("&&d");
senddata.append(set);
senddata.append("@1");
QSqlQuery query;
query.exec("select *from wei_send");//查询数据库
while(query.next()){//下一条数据
senddata.append("#");
senddata.append(query.value(0).toString());
//发送菜品编号
senddata.append(query.value(3).toString());
//发送菜品数量
}
senddata.append("#$$");//添加#$$
int i=senddata.length();
temp.fill('$',64-i);//用$填满64位数据
senddata.append(temp);
emit sendmsg(senddata);
//触发信号,调用相应槽函数发送协议帧
}
3.4 网关及微信点菜
3.4.1 CGI接口HTML页面设计
在网关端搭建BOA Web服务器,BOA服务器是一个高效小巧的Web服务器,可运行于Linux操作系统之下,支持CGI接口编程,且源代码开放,性能高。利用CGI编程可实现与HTML网页的交互[4],用户通过网页或手机端APP进行订桌并可预定菜品。
系统通过浏览器输入BOA 服务器的IP地址即可发送HTTP请求,服务器响应请求后返回HTML登陆界面,并提交表单。CGI通过“Get”方式获取表单提取的内容,若登陆成功则返回订桌及预定菜品界面。订桌及预定菜品HTML网页如图4所示。

图4 订桌及预定菜品HTML网页
同理,在点击界面中的按钮时,触发服务器调用相应的CGI脚本,在脚本中将根据HTTP请求向串口发送命令或查询数据库内容更新HTML页面。
3.4.2 微信订餐
通过申请微信公众号及新浪云计算APP服务,即可成为微信开发者,可使用微信公众平台接口及云计算平台进行开发。普通用户能与公众账号交互6种格式的消息:文本(包括表情)、语音、图片、视频、位置、链接。该公众账号可提供特色菜推荐、订桌、获取验证码等服务。
微信通信接口示意图如图5所示,手机向微信公众号发送如“特色菜”指令后,微信服务器将以固定的xml格式封装发送给云平台,云平台解析后访问相应的网络数据库,查询菜品并以固定的规则组装,回复给公众账号,公众账号再推送给用户。在这个收发过程中,发送方和接收方进行了调换(ToUserName和FromUserName值互换),收发都是以xml格式在后台进行传输的。云计算平台端采用PHP(超文本预处理器)编程。

图5 微信通信接口示意图
相应PHP的关键代码如下:
public function responseMsg(){
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
//获取微信传来的信息,赋值给结构体
$MsgType = trim($postObj->MsgType);
//获取消息类型
$keyword = trim($postObj->Content);//获取消息内容
......
if($keyword == "特" || $keyword == "特色" || $keyword {== "特色菜"){
//判断输入的内容
$msgType = "text";
$link=mysql_connect("103.1.90.135","sq8china","cestel99") or die("connection error".mysql_error());
//连接网络数据库、输入IP、账号、密码等
$flag=mysql_select_db("sq8china",$link);//打开数据库
$result = mysql_query("SELECT * FROM menu");
//查询数据库中menu的数据表
$respon = "您好,我们的特色菜有:\\n";
while($row = mysql_fetch_array($result)) {$respon = $respon . "\\n" . $row['state'];
}
}
结语
本文设计了一种基于物联网的嵌入式智能餐厅系统,系统分为自助点菜终端、PC主机端、网关端、厨房端、载物车、清洁车以及ZigBee无线通信模块。各模块之间通过PC主机端及ZigBee网络进行通信,可实现包括自助点菜、送餐、清洁、结算等功能,还可通过WiFi模块及云平台实现手机、网页及微信订餐业务。经测试,本方案切实可行,能实现各种预设功能。