项目简介:开发基于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()构造用户界面。
浙公网安备 33010602011771号