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