基于zigbee光照感应系统之节点单播通信(4)

基于zigbee光照感应系统之节点单播通信
在上一篇博客已经介绍了如和配置协调器与路由器之间的广播通信,本文将介绍路由器与协调器之间的单播通信。
本项目在路由器节点上外加了一个GL7516光照传感器,在路由器节点上不断采集光照传感器的光照强度,然后路由器将光照传感器的信号通过单播的方式发送给协调器,同时将串口助手上打印出来。
首先,来介绍一下GL7516光照传感器:

光敏电阻式一种半导体材料制成的电阻,其电导率随着光照度的变化而变化。利用这一特性可以制成不同形状和受光面积的光敏电阻。GL7516 就是其中的一种,光越强阻值越小。光敏电阻广泛应用于玩具、灯具、照相机等行业。
在这里插入图片描述
通过光敏电阻的电路图我们可以看出,当有光照是光敏电阻的阻值变小,P0.1引脚为高电平;没有光照是光敏电阻的阻值为大P0.1引脚为低电平。

在协议栈里配置光照传感器引脚:

#define LIGHT P0_1  //光敏为P0.1口控制
P0DIR&=~0X02;       //配置p0.1为输出口

第二步,配置接收方(协调器)的配置:
在void SampleApp_Init( uint8 task_id )函数配置接收放为点播

 SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
  SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
 SampleApp_Periodic_DstAddr.addr.shortAddr = 0x0000;

通信方式位16位单播,目标地址为0x0000(协调器的地址)

第三步,在事件处理函数里uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )启动定时器,我们需要自动不断采集P0.1引脚的电平:

 case ZDO_STATE_CHANGE:
          SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
          if ( 
//              (SampleApp_NwkState == DEV_ZB_COORD)|| 
              (SampleApp_NwkState == DEV_ROUTER)
//              || (SampleApp_NwkState == DEV_END_DEVICE) 
                )
          {
            
            //LS164_BYTE(8);//数码管显示0-9
            // Start sending the periodic message in a regular interval.
            osal_start_timerEx( SampleApp_TaskID,
                              SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
                              SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
            
             //路由器双闪五次
            HalLedBlink(0x03,5,50,1000);
            HalUARTWrite(0,"I am RouterEB\n",sizeof("I am RouterEB\n"));
          }
          else
          {
            // Device is no longer in the network
          }
          break;

第四步,因为定时器函数是指向的是SAMPLEAPP_SEND_PERIODIC_MSG_EVT事件,然后我在SAMPLEAPP_SEND_PERIODIC_MSG_EVT事件里定义了一个路由器发送函数: SampleApp_SendRouterMessage()通过定时器指向一个事件而在一个事件里定义一个发送函数;通过这个简单的步骤就可以使发送函数不断执行也就是 SampleApp_SendRouterMessage()函数

 if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
  {
    // Send the periodic message
    //SampleApp_SendPeriodicMessage();
    SampleApp_SendRouterMessage();

    // Setup to send message again in normal period (+ a little jitter)
    osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
        (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );

    // return unprocessed events
    return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
  }

  // Discard unknown events
  return 0;
}

第五步,在发送函数SampleApp_SendRouterMessage()里

void SampleApp_SendRouterMessage(void)
{
  uint8 islight[1];
  if(P0_1==1)//强光
    osal_memcpy(islight,"1",1);
  else        //弱光
    osal_memcpy(islight,"0",1); 
 if( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PERIODIC_CLUSTERID,
                       1,
                       islight,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS )==afStatus_SUCCESS)
 {
    HalUARTWrite(0,"send light",10);
    HalUARTWrite(0,"\n",1);
 }
 else{
 }

定义一个8位的数组uint8 islight[1],通过if语句判断P0.1引脚是否为1,如果为1的话 通过osal_memcpy函数,将字符1赋值给数组islight[1];然后通过 AF_DataRequest函数通过单播的方式将islight发送出去

if( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PERIODIC_CLUSTERID,
                       1,
                       islight,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS )==afStatus_SUCCESS)
 {
    HalUARTWrite(0,"send light",10);
    HalUARTWrite(0,"\n",1);
 }
 else{
 }

第六步,协调器接收路由器的数据:
在SampleApp_MessageMSGCB函数

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  uint16 flashTime;
  uint8 islight[8];

  switch ( pkt->clusterId )
  {
    case SAMPLEAPP_PERIODIC_CLUSTERID:
       if(osal_memcmp(pkt->cmd.Data,"1",1)){//强光
          HalLedSet (0x03, HAL_LED_MODE_ON);
        osal_memcpy(islight,"light",sizeof("light"));
         HalUARTWrite(0,"light",5);
         HalUARTWrite(0,"\n",1);
        
      }
      else{             //弱光
        HalLedSet (0x03, HAL_LED_MODE_OFF);
        osal_memcpy(islight,"dark",sizeof("dark"));
         HalUARTWrite(0,"dark",4);
         HalUARTWrite(0,"\n",1);
      }
      HalUARTWrite(0,islight,sizeof(islight));
      
      break;

协调器接收数据代码比较简单我就不在多讲了

通过以上几步就可以实现路由器不断采集光照传感器的信号,通过单播的方式发送给协调器。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基于Zigbee的智能家居系统设计与实现。 智能家居系统是一种基于物联网技术的智能化家居管理系统,它利用各种传感器和执行器,通过无线通信技术实现家居设备的互联互通和智能控制。其中,Zigbee作为一种低功耗、低数据率的无线通信技术,被广泛应用于智能家居系统中。 智能家居系统基于Zigbee的设计与实现主要包括以下几个方面: 1. 网络拓扑设计:根据家庭的特点和需求,设计出适应的Zigbee网络拓扑结构,如星型、网状或者混合型拓扑结构。通过合理布置和优化网络节点,实现家庭各个设备之间的无线通信。 2. 硬件设备选择:选择符合Zigbee通信标准的智能设备,如智能插座、智能开关、智能门锁等。这些设备需要支持Zigbee协议栈,并能与智能家居系统进行互联互通。 3. 数据采集与处理:各个智能设备通过传感器采集环境信息,如温度、湿度、光照等,并通过Zigbee通信将数据传输给智能家居系统。智能家居系统对收集到的数据进行处理和分析,为用户提供智能化的服务。 4. 无线通信安全性:Zigbee协议通过加密和认证技术来保证通信的安全性。设计时需要确保数据的机密性和完整性,防止信息泄露和非法访问。 5. 智能控制与应用开发:基于智能家居系统,开发相应的手机应用或者智能音箱等用户界面,使用户可以通过手机或语音指令对家庭设备进行远程控制和管理。 6. 系统可扩展性:智能家居系统需要具备良好的可扩展性,可以方便地添加新的智能设备,同时可灵活配置和管理,以满足用户的个性化需求。 7. 能效优化:优化智能家居系统的能源消耗,提升系统的能效。比如利用Zigbee的低功耗特性,控制智能设备的开关和休眠模式,避免能源的浪费。 基于Zigbee的智能家居系统设计与实现需要考虑以上几个方面,以实现可靠、安全、高效的智能家居体验。 ### 回答2: 基于Zigbee的智能家居系统是一种通过Zigbee无线通信技术实现家居设备互联互通的智能化控制系统。它由传感器、控制器、通信模块和应用软件等组成。 该系统的设计和实现涉及以下几个方面: 1. 网络拓扑结构:智能家居系统采用星型或网状拓扑结构。其中,一个网络协调器负责管理整个网络,负责维护设备连接、数据传输、路由选择等。 2. Zigbee无线通信技术:Zigbee协议是一种低功耗、低数据速率的无线通信技术,适用于家庭环境。设备之间通过无线信号进行通信,实现互联互通。Zigbee协议能够有效节约能源,延长设备的电池寿命。 3. 传感器:智能家居系统通过各种传感器获取环境信息,例如温度、湿度、光照强度、人体感应等。传感器采集的数据通过Zigbee模块发送给网络协调器,进而实现对家居设备的自动控制。 4. 控制器:智能家居系统的控制器负责接收和解析网络协调器发送的指令,并控制相应的设备,例如照明灯、空调、门锁等。通过智能手机、平板电脑等终端设备,用户可以远程控制家居设备。 5. 系统集成与应用软件:为了实现智能家居系统的自动化和便捷性,需要对各种设备进行集成,并开发相应的应用软件。用户可以通过手机App或者微信小程序等界面,实现对家居设备的远程控制、状态查询、设备联动等功能。 基于Zigbee的智能家居系统设计与实现的关键是保证通信的可靠性和安全性。通过优化网络拓扑结构、增加网络中继节点、加密数据传输等手段,确保系统的稳定性和安全性,提升用户的使用体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值