博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WSN基站项目总结

Posted on 2010-07-21 10:09  nkzc  阅读(579)  评论(0)    收藏  举报

项目简介:开发基于ARM平台的无线传感器网络基站的应用程序,包括数据的接收、存储、查询、显示以及转发。

硬件平台:mini2440 (S3C2400A+3.5寸触摸屏)

时钟频率:400MHz,最高533Mhz

64M SDRAM,32bit,SDRAM时钟频率高达100MHz

64M NAND Flash

2M Nor Flash

操作系统:Linux 2.6.29内核

开发框架:Qt4.6.3

 

项目主要包括以下几个模块:

1.SerialPort类

 

class SerialPort : public QThread
{
	Q_OBJECT
public:
        SerialPort();
	~SerialPort();
	int	open(int port,int nSpeed, int nBits, char nEvent, int nStop);
	void close();
	bool isOpen();
	void run();

signals:
	void inDataReady();
public slots:
	void dealOutData();

public:
	char		*outDataPtr;
        int		outDataLen;
	unsigned char	*rxBuffer;
        int		rxBufferLen;
	QMutex		bufferMutex;
        int		inDataTotal;
        int		outDataTotal;
private:
        int		port;
        int		fd;
	bool		opened;

};

SerialPort类继承自QThread类,QThread代表在程序中一个单独的线程控制,在多任务操作系统中,它和同一进程中的其它线程共享数据,但运行起来就像一个单独的程序一样。它不是在main()中开始,QThread是在run()中开始运行的。你继承run()并且在其中包含你的代码。

调用SerialPort继承自QThread中的start()方法,开始serialPort线程,该线程的主要工作是定时读串口,如果发现有数据到来,则发射inDataRead()信号。

 

2.WSNDatabase类

 

class WSNDatabase:public QObject
{
public:
    WSNDatabase();
    ~WSNDatabase();
    int  creatDatabase(char *filename);
    int insertNode(const NodeInfo &node);
    int insertSensorData(const SensorData &sData);
    int updateNode(const NodeInfo &node);
    int selectNode(int nodeID, QList<NodeInfo> *nodeList);
private:
    sqlite3         *db;
    char            *zErrMsg;
    int             rc;
    sqlite3_stmt    *stmt;

    const char *tblNodeSql;
    const char *tblSensorDataSql;

};

项目采用了Sqlite3.3.31数据库存储和查询节点信息和传感器数据,为了简单起见只用到了2个表,tblNode用来存储节点信息:

 

CREATE TABLE tblNode(NodeID INTEGER PRIMARY KEY,
FatherNodeID INTEGER,
Role INTEGER,
IsActive INTEGER);

tblSensorData用来存储各个节点的传感器数据:

 

CREATE TABLE tblSensorData(NodeID INTEGER,
Temperature INTEGER,
Humidity INTEGER,
Time INTEGER);

SQLite3中C++的API函数较为简单,主要包括:

1)sqlite3_open:函数以数据库文件名作为参数,打开该文件作为数据库连接指针,对其进行操作,只有当内存分配失败时才会返回NULL,数据库成功打开或者被创建时,函数返回SQLITE_OK。

2) sqlite3_prepare:函数将SQL查询语言编译为二进制代码,作为SQL语言运行的准备,函数返回编译结果和未使用的SQL语言部分。

3) sqlite3_bind_xxx:该系列函数用于SQL语言中带查询参数时的参数绑定,对sqlite3_prepare编译好的二进制代码,sqlite3_bind_xxx为其每个形参提供相应的实参,其中xxx指数据类型,如int、double等。

4) sqlite3_step:函数运行sqlite3_prepare准备好的SQL二进制代码,当运行完毕时返回SQLITE_DONE,SQLITE_BUSY表示数据库引擎不能获得相应的锁来完成该任务,SQLITE_ERROR表示运行时错误产生,可以调用sqlite3_errmsg函数获得错误消息,SQLITE_MISUSE表示该函数在错误的时段被调用(例如该二进制已经被释放)。

5) sqlite3_finalize:函数用于释放编译完的SQL二进制代码。

6) sqlite3_close:关闭sqlite3_open打开的数据库连接,并释放该连接相关的对象。

 

3.udp通信模块

Qt下的udp通信相当简单,通过使用QudpSocket,发送数据时只需要调用一个函数:

QUdpSocket::writeDatagram ( const char * data, qint64 size, const QHostAddress & address, quint16 port )

接收端先通过bind(ip,port)将QUdpSocket绑定到特定的ip和端口上,然后当接收到数据时,会触发readyRead()信号。

 

4.MainForm类,包含一个由uic生成的类指针ui,并在MainForm构造函数中调用ui->setupUi()构造用户界面。