Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12604
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 53
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-10 22:00
文章分类
文章存档

2014年(5)

我的朋友

分类: 嵌入式

2014-09-07 20:51:09

       花了大概暑期两个月的时间做这个项目,其实也不是叫做,就是把师兄之前弄的东西再重新跑一遍,再完成的过程中学到很多新的东西,自己也有了一些优化,现在总结下。

     这个项目可以细分为四个模块:单片机(模拟家电)模块,zigbee模块,家庭网关模块,pc机上的网页制作模块。我先说下整个项目的运作机理,再细说下每个模块。Pc机上的网页是用户交互的界面,我以点亮单片机的led为例来说明项目的运作流程。比如说用户按下点亮led1灯按钮,网页就将该操作存储到FORM表单中,并通过网络提交请求到家庭网关的boa服务器,boa服务器得到请求后调用cgi,通过cgi程序的预先指定的协议,将该操作定位“1”(假设),之后cgi通过串口将“1”发给zigbee模块中的协调器,协调器收到“1”后再将数据通过zigbee网络发给终端节点,终端节点最后通过串口将“1”发给单片机(模拟家电)模块,单片机收到“1”后响应串口中断,就能使指定的灯亮或者灭。整个过程就是这样的,控制家电的流程都是这样,温度采集稍有不同,有一个双向通信的过程,这个我等下会在zigbee模块细讲的。好,我现在分模块讲实现的机理。

       (一)单片机模块:

        单片机用的是51单片机,用led1--led3来模拟不同位置的灯的亮灭情况,用步进电机来模拟窗帘的控制,好,我说下每个模拟家电的协议:0是用来指定灯全亮,1用来指定灯全灭,234分别用来指定led1--led3灯的亮灭情况,5用来指定窗帘的工作。具体的程序是串口中断程序,这一部分难度不大,程序写完后可以用pc机上的串口调试助手调试单片机程序是否正确。好,这部分就不细讲了。

        (二)zigbee模块

         这个模块是我花时间最多的,也是感觉最难的。之前没有学习zigbee的基础,先自己看了一些讲解的视频,感觉听的云里雾里,之后看了罗老师和师兄推荐的一本“黄皮书”(名字很长,我就不写了,书皮是黄色的),写的非常好,也很好懂,非常适合初学者看,看了一段时间后,就着手做了cc2530资料里的一些小的实验,重点做了书中的一些实验,对zigbee的通信协议有了初步的认识。谈谈这个项目中我对协调器和终端节点编程的一些认识吧:分两部分说,控制家电和采集温度。好,控制家电模块,首先是协调器编程,协调器编程主要是串口openwriteread函数,数据处理函数,数据发送函数。协调器首先是将串口数据读出后,消息处理函数通过osal_msg_receive函数从消息队列中接收消息,接收到的消息处理完后再将消息所占据的存储空间释放掉,重新接收新来的消息。接收完消息后,协调器再通过发送函数sendthemessage将数据发送到终端节点,同样,终端节点也有消息处理函数,通过消息处理函数将接收到的消息放到寄存器recvbuf中,再终端节点通过memcmp函数将recvbuf中的数据和预先指定好的协议比较而做出不同的反应,串口write函数再将终端的值写入到单片机,控制不同的家电的亮灭。这个是控制家电部分。我再来说说温度采集过程,因为温度采集是个双向的过程,是首先协调器通过网关收到6-8(我是用678来指定不用地方的温度采集)中的任何一个数据后,将数据发给终端节点,终端节点也是通过一个比对函数memcmp来判断是采集哪个地方的温度值,终端节点将温度值采集完打包后,发给协调器,协调器将温度信息再发给上一级。好,这里我要说下温度采集函数,我们知道cc2530本身自带了温度传感器,这里我们需要定义一个结构体来存放温度数据信息,我使用四个字节长度来储存温度信息,数据头是TWR来代表不同位置,中间两个字节来储存温度值,数据尾是C

     (三)家庭网关模块

       网关是协议转换器,用来连接不同的层,家庭网关模块主要是boa服务器的搭建,sqlite数据库的建立和cgi程序。先说下boa服务器,boa服务器是一个小巧高效的web服务器,运行于linux下,同时支持cgi,但是boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求,我自己试验了一下,在pc机上和手机上同时操纵模拟家电,没有任何响应。Boa服务器的移植比较简单,有固定的步骤,把编译的boa文件下到开发板上后boa服务器的搭建就算完成了。第二个就是数据库sqlite的建立,这个网上也有移植的教程,就不说了(数据库部分是这个项目中我最模糊的一个模块,主要不知道数据库是如何存储和查找数据的,后面有时间会好好学习下的)。最后一个就是cgi程序了,也是这个家庭网关的重中之重。 CGI是Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。组成CGI通信系统的是两部分:一部分是html页面,就是在用户端浏览器上显示的页面,另一部分则是运行在服务器上的cgi程序,它们的通信方式如图:

        cgi存放环境变量有两种方式,post方法和get方法,如果采用POST方法,那么客户端来的用户数据将存放在CGI进程的标准输入中,同时将用户数据的长度赋予环境变量中的CONTENT_LENGTH。该类型记录在环境变量CONTENT_TYPE中,CGI程序应该检查该变量的值。如果采用get方法,CGI程序无法直接从服务器的标准输入中获取数据,因为服务器把它从标准输入接收到得数据编码到环境变量QUERY_STRING(或PATH_INFO),采用GET方法提交HTML表单数据的时候,客户机将把这些数据附加到由ACTION标记命名的URL的末尾,用一个包括把经过URL编码后的信息与CGI程序的名字分开。我用的是get方法,所以在我提交表单的时候动态信息会附加在url的末尾,如:/cgi-bin/led.cgi?led1=on(我是操作灯的亮,其他的也是依次类推。

  (四)网页制作模块

        网页制作主要是参考html语言编写规范,前面的一些基本的设计框架方法我就不细说了,我主要说下html表单,因为这个是和cgi程序紧密联系起来的,决定这用户的每次操作都能够有所响应。Html表单(Form)主要用于采集和提交用户的操作信息,比如说用户在网页界面点击了查询卧室温度按钮,对应的html语言就是name=temp1 value=on,之后就把temp1=on这个字符串存入到表单Form中,cgi程序通过get函数读取出Form表单里的temp1=on后,通过一个strcmp比对函数后执行向串口写入6,zigbee收到6后将温度值返回给cgi,cgi再通过一个printf函数将温度值打印到网页中,这个就是表单的功能

        这四个模块是这个项目的关键,好,现在我说下在使用的过程中需要优化的地方的吧。(1)协议制定的不严谨,会出现消息发送错误的情况 。(2)网页制作的不美观,都是文字,没有图片,而且显示的温度值有时候会出现乱码的情况。(3)能不能用继电器代替单片机的led灯,使模拟更真实。(4)可以加上其他的一些模块,比如说摄像头监控(这个现在已经能够实现),播放音乐,还有后续的智能开关模块。还有一些问题后续再继续补充。

阅读(1883) | 评论(0) | 转发(0) |
0

上一篇:tftp和ftp服务器的区别

下一篇:没有了

给主人留下些什么吧!~~