关于ZStack-CC2530-2.3.0-1.4.0中simpleApp例子的 终端节点如何向协调器发送数据,以及数据的接收

本文详细介绍了ZigBee网络中终端节点与协调器之间的数据交互过程,包括终端节点的状态转换、定时报告温度与电池值的功能实现,以及协调器接收到数据后的处理流程。

上一篇文章写到终端节点向应用层发送绑定确认,即zb_BindConfirm函数,我们可以看下源代码。

 

void zb_BindConfirm( uint16 commandId, uint8 status )
{
  (void)commandId;

  if ( ( status == ZB_SUCCESS )&& ( myAppState == APP_START ) )//条件成立
  {
    myAppState =APP_BOUND;//将应用状态修改为 绑定状态

    //Startreporting sensor values
   myApp_StartReporting();//开始传输函数
  }
  else
  {
    // Continueto discover a collector
   osal_start_timerEx( sapi_TaskID, MY_FIND_COLLECTOR_EVT,myBindRetryDelay );
  }

 

查看传输函数源代码:

 

void myApp_StartReporting( void )
{
  osal_start_timerEx( sapi_TaskID,MY_REPORT_TEMP_EVT, myTempReportPeriod );//传输温度事件
  osal_start_timerEx( sapi_TaskID,MY_REPORT_BATT_EVT, myBatteryCheckPeriod );//传输电压事件
  HalLedSet( HAL_LED_1, HAL_LED_MODE_ON);//点亮LED_1;

}

我们看终端节点sapi层如何处理这两个时间,首先找到SAPI_ProcessEvent函数中的:

 

 if ( events & ( ZB_USER_EVENTS) )
  {
    // Userevents are passed to the application
#if ( SAPI_CB_FUNC )
   zb_HandleOsalEvent( events );//事件处理函数
#endif

    // Do notreturn here, return 0 later
  }

 

进入到函数中去:

 

void zb_HandleOsalEvent( uint16 event )
{
  uint8 pData[2];

  if ( event & MY_START_EVT)
  {
   zb_StartRequest();
  }
  if ( event & MY_REPORT_TEMP_EVT)
  {
    // Read andreport temperature value
    pData[0] =TEMP_REPORT;//要发送的数据的类型
    pData[1]=  myApp_ReadTemperature();//利用此函数接收读取的温度值
   zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, 2, pData, 0,AF_ACK_REQUEST, 0 );//发送数据
   osal_start_timerEx( sapi_TaskID, MY_REPORT_TEMP_EVT,myTempReportPeriod );
  }

  if ( event &MY_REPORT_BATT_EVT )
  {
    // Readbattery value
    // Ifbattery level low, report battery value
    pData[0] =BATTERY_REPORT;//要发送的数据的类型
    pData[1]=  myApp_ReadBattery();//利用此函数接收读取的温度值
   zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, 2, pData, 0,AF_ACK_REQUEST, 0 );//发送数据
   osal_start_timerEx( sapi_TaskID, MY_REPORT_BATT_EVT,myBatteryCheckPeriod );
  }

  if ( event &MY_FIND_COLLECTOR_EVT )
  {
    // Find andbind to a collector device
   zb_BindDevice( TRUE, SENSOR_REPORT_CMD_ID, (uint8 *)NULL );
  }

}

 

好,然后我们看下协调器是怎么接收数据的,首先切换工作空间为协调器模式,查看sapi.c文件,查看SAPI_ProcessEvent函数,找到:

case AF_INCOMING_MSG_CMD:
         pMSGpkt = (afIncomingMSGPacket_t *) pMsg;
         SAPI_ReceiveDataIndication(pMSGpkt->srcAddr.addr.shortAddr,pMSGpkt->clusterId,
                                   pMSGpkt->cmd.DataLength,pMSGpkt->cmd.Data);//协调器在此函数中进行数据的接收工作。
         break;

 

查看此函数:

 

void SAPI_ReceiveDataIndication( uint16 source, uint16 command,uint16 len, uint8 *pData  )
{
#if defined ( MT_SAPI_CB_FUNC )
 
  if ( SAPICB_CHECK( SPI_CB_SAPI_RCV_DATA_IND ))
  {
   zb_MTCallbackReceiveDataIndication( source, command, len,pData  );
  }
  else
#endif  //MT_SAPI_CB_FUNC
  {
#if ( SAPI_CB_FUNC )//编译通过
   zb_ReceiveDataIndication( source, command, len,pData  );
#endif
  }
}

 

查看源代码:

 

oid zb_FindDeviceConfirm( uint8 searchType, uint8 *searchKey,uint8 *result )
{
}

CONST uint8 strDevice[] = "Device:0x";
CONST uint8 strTemp[] = "Temp: ";
CONST uint8 strBattery[] = "Battery: ";
void zb_ReceiveDataIndication( uint16 source, uint16 command,uint16 len, uint8 *pData  )
{
  uint8 buf[32];
  uint8 *pBuf;
  uint8 tmpLen;
  uint8 sensorReading;

  if (command ==SENSOR_REPORT_CMD_ID)//条件成立
  {
    // Receivedreport from a sensor
   sensorReading = pData[1];

    // Iftool available, write to serial port

    tmpLen =(uint8)osal_strlen( (char*)strDevice );
    pBuf =osal_memcpy( buf, strDevice, tmpLen );
    _ltoa(source, pBuf, 16 );
    pBuf +=4;
    *pBuf++ = '';

    if (pData[0] == BATTERY_REPORT )//如果是电压传送,执行下面函数
    {
     tmpLen = (uint8)osal_strlen( (char*)strBattery );
     pBuf = osal_memcpy( pBuf, strBattery, tmpLen );

     *pBuf++ = (sensorReading / 10 ) +'0';    //convent msb to ascii
     *pBuf++ ='.';                           // decimal point ( battery reading is in units of 0.1 V
     *pBuf++ = (sensorReading % 10 ) +'0';    //convert lsb to ascii
     *pBuf++ = ' ';
     *pBuf++ = 'V';
    }
   else//如果是温度传送,执行下面函数
    {
     tmpLen = (uint8)osal_strlen( (char*)strTemp );
     pBuf = osal_memcpy( pBuf, strTemp, tmpLen );

     *pBuf++ = (sensorReading / 10 ) +'0';    //convent msb to ascii
     *pBuf++ = (sensorReading % 10 ) +'0';    //convert lsb to ascii
     *pBuf++ = ' ';
     *pBuf++ = 'C';
    }

    *pBuf++ ='\r';
    *pBuf++ ='\n';
    *pBuf ='\0';

#if defined( MT_TASK)//若定义了MT_TASK ,则执行下面函数即串口函数,发送到PC机上显示。
    debug_str((uint8 *)buf );
#endif

    // canalso write directly to uart

  }
}

到此为止,终端节点向协调器发送数据,协调器接收数据并发送到串口 

完成。。。


07-22
Git Bash 是一个强大的命令行工具,用于在 Windows 系统上运行 Git 命令。它不仅支持 Git 本身的功能,还提供了类 Unix 环境的命令行操作支持。以下是一些 Git Bash 的使用教程及常用命令。 ### 设置 Git 用户信息 在使用 Git Bash 进行版本控制之前,需要配置用户信息,包括用户名和邮箱地址。这些信息会用于提交记录。 ```bash git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址" ``` ### 常用 Git Bash 命令 以下是一些常见的 Git Bash 命令,可以帮助你在 Git Bash 中进行基本的文件管理和 Git 操作: #### 文件管理命令 - `cd`:切换目录。例如,`cd dir` 进入名为 `dir` 的目录。 - `cd ..`:返回上一级目录。 - `pwd`:显示当前工作目录的路径。 - `ls`:列出当前目录下的所有文件和文件夹。 - `mkdir dir`:创建一个新的文件夹 `dir`。 - `touch file`:创建一个名为 `file` 的新文件。 - `rm file`:删除名为 `file` 的文件。 - `rm -r dir`:删除名为 `dir` 的文件夹及其内容。 - `clear`:清空终端屏幕。 - `reset`:重置终端。 - `exit`:退出 Git Bash。 - `help`:显示帮助信息。 - `history`:查看命令历史记录。 #### Git 操作命令 - `git clone <仓库地址>`:克隆远程仓库到本地。 - `git init`:初始化一个新的 Git 仓库。 - `git add <文件名>`:将文件添加到暂存区。 - `git commit -m "提交信息"`:提交暂存区的更改,并添加提交信息。 - `git status`:查看当前仓库的状态,包括未提交的更改。 - `git log`:查看提交历史记录。 - `git diff`:显示工作区和暂存区之间的差异。 - `git diff --staged`:显示暂存区和最后一次提交之间的差异。 - `git show <提交ID>`:显示某次提交的详细信息。 - `git remote -v`:查看当前配置的远程仓库地址。 - `git remote add <远程仓库名称> <仓库地址>`:添加一个新的远程仓库。 - `git remote remove <远程仓库名称>`:删除一个远程仓库。 - `git fetch`:从远程获取更新,但不自动合并到本地。 - `git push <远程仓库名称> <分支名称>`:将本地提交推送到远程仓库的指定分支。 - `git pull`:从远程仓库拉取更新并合并到本地。 #### 版本回退与标签操作 - `git reset --hard HEAD^`:回退到上一个版本,`--hard` 参数表示丢弃工作区和暂存区的所有更改。 - `git reset --soft HEAD^`:回退到上一个版本,但保留工作区和暂存区的更改。 - `git reset --mixed HEAD^`:回退到上一个版本,保留工作区的更改,但清空暂存区。 - `git tag`:列出所有标签。 - `git tag <标签名>`:创建一个新的标签。 - `git tag -a <标签名> -m "标签说明"`:创建一个带有说明的标签。 - `git push origin <标签名>`:推送指定标签到远程仓库。 - `git push origin --tags`:推送所有本地标签到远程仓库。 - `git tag -d <标签名>`:删除本地标签。 - `git push origin --delete <标签名>`:删除远程仓库中的标签。 #### 其他常用命令 - `git commit -am "提交信息"`:直接提交已修改的文件(不包括新添加的文件)。 - `git stash`:暂存当前的改动(未提交的改动),然后恢复到清理后的状态。 - `git stash pop`:恢复上一次暂存的改动。 - `git rebase`:变基操作,用于整理提交记录,保持提交历史的整洁。 ### 示例代码 以下是一个简单的 Git Bash 操作示例,展示了如何初始化仓库、添加文件、提交更改并推送到远程仓库: ```bash # 初始化一个新的 Git 仓库 git init # 创建一个新文件 touch README.md # 将文件添加到暂存区 git add README.md # 提交更改 git commit -m "Initial commit" # 添加远程仓库 git remote add origin https://github.com/yourusername/yourrepository.git # 推送更改到远程仓库 git push -u origin master ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值