数据进入到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 了. 原理也差不多不做分析.