UP智能家居系统之节点cc2530源码分析(2)

本文详细解析了ZigBee网络中传感器数据从接收、处理到发送的整个流程,重点介绍了OTA_CMD_GET_NWK_TOPO_REQ与OTA_CMD_SET_SENSOR_STATUS_REQ命令的处理方式及中断型传感器的数据发送机制。
摘要由CSDN通过智能技术生成

数据进入到endpoint后的流向.

以OTA_CMD_GET_NWK_TOPO_REQ 为例.

case AF_INCOMING_MSG_CMD:
      case OTA_CMD_GET_NWK_TOPO_REQ:
              HalLedBlink( HAL_LED_1, 2, 50, (1000 / 4) );
              SampleApp_ProcessGET_NWK_TOPO_REQ();
		/*根据gSensorType 等变量构建发送包.并调用  (如果要采集传感器(非中断型)数据可以在这里调用采集函数)
SampleApp_SendNwkData(0x0000, SAMPLEAPP_OTA_NWK_CLUSTERID, data, len); 发送
	AF_DataRequest								*/
              break;


ps:温湿度sht11芯片传感器采集函数,对这个系统的osal还不太熟.下次再写一篇分析这个芯片的linux驱动:

    if(gSensorType == (sensor_t)SENSOR_SHT11){
      if(GetHumiAndTemp(temp) == 0){           
            data[17]  = temp[0];
            data[18]  = temp[1];	
            data[19]  = temp[2];
            data[20]  = temp[3];	
      }

pss:这个芯片很多人说是i2c接口的.其实它的时序根本不符合i2c规范,它的地址是固定的,它的数据是7位的.所以它根本不能当成i2c设备注册到linux内核,厂家提供的实现驱动中只是模拟它的时序实现读写.



另外,中断型传感器的路由器支持异步发送的:

/* comment add by @wei 
* 发生中断则将标志位 置位
*/
HAL_ISR_FUNCTION(halP12isr,P1INT_VECTOR){
    if(P1IFG & 0x04)         //中断
    {
      gIntFlag = 0x01;
      HalUARTWrite ( 0, "\rINT2\r", 6 );
      if(gSensorMode==0x01)
        osal_set_event(SampleApp_TaskID,SAMPLEAPP_SEND_SENSOR_INT_EVT);	//注册中断发送事件
      Delay(100);	
      P1IFG &= ~(0x04);	
    }

    P1IF = 0;          //清中断标志

}
注册事件后,事件就会加入任务队列:

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
    afIncomingMSGPacket_t *MSGpkt;
    (void)task_id;  // Intentionally unreferenced parameter
    
    if ( events & SYS_EVENT_MSG )
    {
//.......
   if ( events & SAMPLEAPP_SEND_SENSOR_INT_EVT )				//中断类型传感器节点注册中断事件后处理函数
    { 
      SampleApp_Process_SENSOR_INT();
      return ( events ^ SAMPLEAPP_SEND_SENSOR_INT_EVT);
    }

SampleApp_Process_SENSOR_INT  最终构建并发送了这样一个数据包:

cmd + datalen +nwkaddr +gSensorType +data

1      +1           +2                       +1                    +4


在zigbee网络事件处理中(以下是协调器的处理代码)

      case OTA_CMD_RPT_SENSOR_STATUS:
              HalLedBlink( HAL_LED_1, 2, 50, (1000 / 4) );
              SampleApp_ProcessGET_SENSOR_STATUS_RSP(pkt);
			-->SampleApp_BuildAndSendZToolResponse( NODEINFO_CMD_GET_SENSOR_STATUS_RSP, datalen, (pkt->cmd.Data)+2);
              break;
最终 协调器SampleApp_BuildAndSendZToolResponse
构建了这样一个包通过串口发送回去

/*@wei
sof HI_UINT16(callbackID)  LO_UINT16(callbackID) dataLen  data[n]((pkt->cmd.Data)+2)  FCS
*/
ps:"sof" mean start of frame . fcs是某种校验算法算出来的结果.

//end 中断型传感器的路由器支持异步发送


还有一个实际使用中用得到的命令就是OTA_CMD_SET_SENSOR_STATUS_REQ 了. 原理也差不多不做分析.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值