物联网通信技术课设流程软件部分

软件部分

作者:物联B221 cms

PS:确保硬件调试已经完成,传感器已经正常传输数据。

流程

整体的流程其实都差不多,都是用协调板连接网关,然后网关用以太网、无线网等通信手段跟PC机(电脑)进行通信。所以一开始要确保传感器有数据传输,这样网关才可以通过串口读取协调器发过来的数据。我们做的是以太网加udp的方式,下文将以此作为例子。

第一步 网关和协调器串口通信

串口接收数据

在机房的PC机里有很多吴静老师留下来的示例可以用来测试用,其中tem用来测试串口通信,文件地址为”C:/物联网通信技术实验资料/基于无线传感器网络的物联网通信系统(6学时)/网关+协调器+温湿度程序/网关程序“。此文件界面主体是一个白色框框,连上协调板后点击串口初始化,之后点击打开串口,然后就可以在白色框上看见协调板接收到的数据,应该是一堆十六进制字符串。如果成功了,就说明我们的数据可以通过串口发送给网关了。如果没有的话建议先检查协调器是否连接好,一般来说代码是没问题的,如果你在电脑上的串口助手是可以看见字符串的话,那这个代码上也是没问题的。

之后的步骤就是解析发送来的十六进制数字,一般来说发送的是按照你硬件烧写所发送的数据包格式来解析。拿我们的项目来举例,我们有红外对射传感器、霍尔传感器和继电器,我们定义的数据包格式为前两位来判断传感器类型,后两位为具体数值。0xe1 0x00 假设e1代表红外对射传感器,00代表有遮挡物,01代表没有遮挡物,那么解析的方法就是进行if判断。假设读取的串口数据放在了buffer里面,buffer是一个数组。

if(buffer[0]==(char)0xe1)
{
    if(buffer[1]==(char)0x00)
  {
     //将对应的ui显示对应的内容
     ui->textedit->settext("有遮挡");  //瞎写的,意思是这样的,但是代码肯定是无法运行
  }
  else
  {
        //将对应的ui显示对应的内容
     ui->textedit->settext("无遮挡"); 
  }
}
else if(buffer[0]==(char)0xe2)
{
    if(buffer[1]==(char)0x00)
  {
     //将对应的ui显示对应的内容
     ui->textedit->settext("有磁场");  
  }
  else
  {
        //将对应的ui显示对应的内容
     ui->textedit->settext("无磁场"); 
  }
}

然后再此测试是否联通,一般来说前面的通了,后面解析不会有问题,因为串口读数据没问题,数据已经可以读到网关了。

串口发送数据

现在完成了串口数据的接收,我们要发送了,有些人可能不需要控制传感器,那么就不需要串口发送数据,这个步骤就可以跳过了,如果要控制的话,大体思路是一样的。首先我们要知道发送的控制命令的格式,这个也是在硬件烧写的时候就决定了,之前的硬件调试的时候,应该会有利用串口监视器来发送数据,然后控制继电器开关的实验,原理跟这个一样,你那时候发送的数据,就是控制命令数据。按照那个格式来设置你发送的数据就可以了,qt也自带函数,可以进行串口发送。

//假设数据格式为 0xdd 0x01 0xaa
string buffer[3];
buffer[0]=0xdd;
buffer[1]=0x01;
//发送打开命令
if("打开按钮被点击")
{
    buffer[2]=0xaa;//aa为打开指令
    serial.write(buffer);//串口写指令
}
if("关闭按钮被点击")
{
    buffer[2]=0xbb;//bb为打开指令
   serial.write(buffer);//串口写指令
}

PS:以上代码为伪代码,仅给出逻辑,具体函数得自己去查。

第二步 网关和PC机通信

上面实现的是网关和协调器串口通信的代码,之后网关要通过网络发送给PC机,我们的项目是以太网+UDP,无线网+UDP的通信代码也是适用的。但是3G的就得去看看吴静老师留下来的视频,他们的数据发送不是同一种代码。

网关发送数据给PC机

现在网关通过串口已经将协调器的数据接收了,之后我们要做的就是将数据转发给PC机。这里就要利用UDPSocket来发送数据,之前的课程中应该有接触到Socket这个技术,在java中曾讲过,qt其实就是帮助C++开发者开发界面用的,所以他也封装好了UDPSocket,可以直接使用。

首先创建udpSocket,然后将要发送的数据封装成一定的格式(这个自己定义即可),例如:我们之前已经将收到的传感器数据转换为字符串形式,霍尔传感器:有磁场,那么写一个函数用来将数据放入Socket并发送就可以了。下面用伪代码来展示逻辑。

void sendsensordata(string senseorname,string sensordata)
{
    QbyteArray data;
    data[0]=sneseorname;
    data[1]=senseordata;
    socket.write(data);  
}

在电脑里面的”C:/物联网通信技术实验资料/无线局域网技术应用(4学时)/UDP客户机服务器通信“是吴静老师写好的通信示例,根据里面的代码来模仿它的格式并转换到自己的项目里。然后也可以利用那个作为测试来看你的代码那个位置有问题,可以以他的为基础,在上面添加内容。比如你写了一个发送的代码,然后编译没问题,你首先将这个代码烧给网关,然后再PC机上运行他写好的接收的网关,看看接收网关是否可以收到,因为接收网关是一定没问题的,反过来也是一样。

PC机接收网关发送的数据

与发送一样,也是使用了udpsocket这个技术,在接收端也是参考老师给的代码来进行修改就可以了。特别注意一下每个项目的头文件和.pro文件,将不同的地方添加好,我记得是要在.pro文件添加QT+=network,然后再头文件添加#include ,这样才可以在项目中使用udpsocket。

第三步 后续

先前我们实现了网关发送数据,PC机接收数据的功能。之后由于你的PC机需要实现控制继电器或者别的东西的功能,所以你还得写一个PC机发送数据给网关的功能,然后网关还得写一个接收数据和一个将接受的数据转换成发送串口指令给协调器两个功能。测试的方法与前面一样,用给的示例测试你的代码是否能发送就可以了。

作者:sbcvin

物联沃分享整理
物联沃-IOTWORD物联网 » 物联网通信技术课设流程软件部分

发表回复