基于Zigbee的SHT10温湿度数据采集系统+python串口读取——Zigbee终端节点主要代码解析

基于Zigbee的SHT10温湿度数据采集系统+python串口读取——Zigbee终端节点主要代码解析

1)温湿度传感器用采用的是SHT10,之前用的是DHT11采集温湿度数据,结果精度不行,所以换成SHT10传感器。
在这里插入图片描述
2)我组的是星状网络,一个Zigbee协调器,12个Zigbee终端节点。

3)当Zigbee路由节点上电后,会使用NLME_GetShortAddr()函数获取自身16位的网络地址信息,然后AF_DataRequest给协调器。

  void SampleApp_to_xie_addr(void)//ok
  {
   uint16 NLMEAddr;
   
   if(AddrID<=9)
   {
   //1~9
     NLMEAddr =NLME_GetShortAddr();//获得16位的网络地址信息
             NLME_addr[0]=0;
               NLME_addr[1]=AddrID;
                  NLME_addr[2]=(unsigned char)((NLMEAddr>>8)&0xff);
                   NLME_addr[3]=(unsigned char)(NLMEAddr&0xff);
         
     if ( AF_DataRequest( &SampleApp_P2P_DstAddr, 
                         &SampleApp_epDesc,
                         SAMPLEAPP_P3P1_CLUSTERID,
                         4,
                         (byte * )&NLME_addr,
                         &SampleApp_TransID,
                         AF_DISCV_ROUTE,
                         AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }   
   }
   }

4)Zigbee终端节点的/接收消息事件 处理函数是用来读取,Zigbee协调器发来“数据请求”,当Zigbee终端节点收到“数据请求”时,就会返回自己采集到的SHT10温湿度值,我这里命名为函数SampleApp_Send_P2P_Message();

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  
  switch ( pkt->clusterId )
  {
    case SAMPLEAPP_P2P_CLUSTERID:
      {
             //初始化D2
  P1SEL&=0Xfd;//1111 1101
  P1DIR|=0x02;  //P11定义为输出0000 0010
  P1_1 =0;
      SampleApp_Send_P2P_Message();
      }
      break;    
      
    case SAMPLEAPP_PERIODIC_CLUSTERID:
      break;
  }
}

5)Zigbee终端节点的数据发送函数的代码

void SampleApp_Send_P2P_Message( void )
{
   
  int temp;
  uint16 huim; 
  //uint8 dataLen;
  
  huim = MeasureHuim();
  temp = MeasureTemp();
  
  if(AddrID<10)
  {
  Data[0] = 0+ '0';
  Data[1] = AddrID + '0';
  Data[2] = ' ';
  }
  else if(AddrID>=10)
  {
    Data[0] =1 + '0';
  Data[1] = (AddrID%10) + '0';
  Data[2] = ' ';
  }
  Data[3] = huim/1000 + '0';
  Data[4] = huim%1000/100 + '0';
  Data[5] = '.';
  Data[6] = huim%100/10 + '0';
  Data[7] = huim%10 + '0';
  Data[8] = ' ';
  
  if(temp >= 0)
  {
    Data[9] = temp/1000 + '0';
    Data[10] = temp%1000/100 + '0';
    Data[11] = '.';
    Data[12] = temp%100/10 + '0';
    Data[13] = temp%10 + '0';
    Data[14] = ' ';
  }

  //HalUARTWrite(0,Data,dataLen );

   if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,
                       //SAMPLEAPP_P2P1_CLUSTERID,
                       //SAMPLEAPP_P2P2_CLUSTERID,
                       //SAMPLEAPP_P2P3_CLUSTERID,
                       //SAMPLEAPP_P2P4_CLUSTERID,
                       //SAMPLEAPP_P2P5_CLUSTERID,
                       SAMPLEAPP_P2P6_CLUSTERID,
                       //SAMPLEAPP_P2P7_CLUSTERID,
                       //SAMPLEAPP_P2P8_CLUSTERID,
                       //SAMPLEAPP_P2P9_CLUSTERID,
                       //SAMPLEAPP_P2Pa_CLUSTERID,//10
                       //SAMPLEAPP_P2Pb_CLUSTERID,//11
                       //SAMPLEAPP_P2Pc_CLUSTERID,//12
                       //SAMPLEAPP_P2Pd_CLUSTERID,//13
                       //SAMPLEAPP_P2Pe_CLUSTERID,//14
                        //SAMPLEAPP_P2Pf_CLUSTERID,//15
                         //SAMPLEAPP_P2Pg_CLUSTERID,//16
                          //SAMPLEAPP_P2Ph_CLUSTERID,//17
                           //SAMPLEAPP_P2Pi_CLUSTERID,//18
                       15,
                       (byte * )&Data,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
               //初始化D1
  P1SEL&=0Xfe;//1111 1110
  P1DIR|=0x01;//P10定义为输出0000 0001
  P1_0 = 0;
  
  }
  else
  {
    // Error occurred in request to send.
  }
}

这些代码只是SampleApp.c文件的主要代码,其余比较重要的OSAL,ZMAIN,后期有时间再整理吧~
在这里插入图片描述
6)使用串口调试助手看看效果~
发送01返回,终端节点1到终端节点6的温度和湿度,不是按顺序输出的:
在这里插入图片描述
发送02返回,终端节点7到终端节点12的温度和湿度:
在这里插入图片描述
发送03返回,终端节点13到终端节点18的温度和湿度:
在这里插入图片描述
7)后面用的python实现的串口读写程序,然后对之前代码,做了些小小的改动温度加上了正负,因为天气比较冷,到了0下了,波特率还是115200,这里我就只用Zigbee终端节点两个节点测试一下~
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 实现网络通信监控需要通过以下几个步骤来实现: 1. 监听网络通信:采用代理服务器的方式,将网络流量导向到一个中间设备上,然后在该设备上监测网络通信。可以使用网络抓包工具,如Wireshark,来捕获并分析网络数据包。 2. 分析网络数据:对捕获到的网络数据包进行解析和分析,提取关键信息,如源地址、目标地址、协议类型、端口号等。可以采用数据解析库,如Scapy或Pcap来辅助分析。 3. 实时监控:将分析得到的网络信息进行处理,并实时监控网络数据的流向和传输状态。可以使用编程语言,如Python或Java,利用网络编程库,如socket或scoket.io来开发监控程序。 4. 报警机制:当监测到异常或危险情况时,通过邮件、短信或弹窗等方式进行即时报警通知。可以设置关键指标的阈值,并通过条件判断来触发报警。 5. 数据记录与分析:将监测到的网络数据进行记录,并可以对其进行分析和统计,以便后续分析网络流量、检测网络攻击或优化网络性能。 6. 可视化展示:将监测到的网络数据以可视化的方式展示在监控界面上,可以使用图表、表格、地图等形式展示相关信息,方便用户查看和理解。 总之,实现网络通信监控需要对网络数据进行分析和处理,并利用报警机制和数据分析来提升网络安全性和性能。同时,合理的可视化展示可以帮助用户直观地了解网络通信的情况。 ### 回答2: C实现网络通信监控可以通过以下步骤实现。 首先,需要使用C语言的网络编程库,例如sockets库,以便与网络通信进行交互。可以使用socket()函数创建一个套接字,并使用bind()函数将其绑定到特定的IP地址和端口号上。 接下来,可以使用listen()函数将套接字设置为监听状态,以便接受传入的网络连接。可以创建一个循环,使用accept()函数接受连接请求,并为每个连接创建一个新的线程或进程进行处理。 在每个连接中,可以使用read()函数从套接字中读取数据,或使用write()函数将数据写入套接字中。可以根据需要制定通信协议和数据格式。 为了实现网络通信的监控,可以添加适当的监控机制。例如,可以使用select()函数来监视套接字的状态变化,以便在有新的数据可读或写入时及时做出相应的处理。 此外,还可以使用日志记录或打印输出等方式,将网络通信过程中的各个步骤和数据进行记录,以便进行监控和故障排除。可以使用文件操作函数如fprintf()来写入日志文件,或使用printf()函数将日志信息打印到控制台。 最后,为了确保网络通信监控的稳定性和可靠性,还可以添加错误处理机制。例如,可以检测套接字连接的异常或错误,及时关闭连接并释放资源,以避免潜在的资源泄露或崩溃。 总之,通过以上步骤和技术,可以使用C语言实现网络通信监控,并对网络通信进行有效地监控和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值