UP智能家居系統之節點cc2530源碼分析(2)

數據進入到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 了. 原理也差不多不做分析.

發佈了30 篇原創文章 · 獲贊 21 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章