最近应公司需求,学习Zigbee组网,网上教学鱼目混珠,质量参差不齐,新手入门苦于找资料,特此写一篇博客。
环境搭建以及一些基本准备事项在此不过多赘述,只讲在工程实际应用中我们应该添加的代码。
Zstack协议包安装:ZStack-CC2530-2.5.1a.rar
链接: https://pan.baidu.com/s/1yy2lpKbg35rlDv9hltTLag?pwd=7maz 提取码: 7maz
第一步:
按照路径ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB打开SampleApp.eww工程
打开SampleApp.c文件
第二步:
找到SampleApp_MessageMSGCB(接收数据函数)在里面添加如下:
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
byte buf[3];
switch ( pkt->clusterId ) //判断簇ID
{
case SAMPLEAPP_PERIODIC_CLUSTERID: //收到广播数据
osal_memset(buf, 0 , 3);
osal_memcpy(buf, pkt->cmd.Data, 2); //复制数据到缓冲区中
if(buf[0]=='D' && buf[1]=='1') //判断收到的数据是否为"D1"
{
HalLedBlink(HAL_LED_1, 0, 50, 500);//如果是则Led1间隔500ms闪烁
#if defined(ZDO_COORDINATOR) //协调器收到"D1"后,返回"D1"给终端,让终端Led1也闪烁
SampleApp_SendPeriodicMessage();
#endif
//上面这段#if #endif是编译器区分你是协调器还是终端的重要代码,
//该代码含义为:如果定义了协调器这个宏定义,那么就处理协调器的逻辑,否则不做处理
}
else
{
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
}
break;
case SAMPLEAPP_FLASH_CLUSTERID: //收到组播数据
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
}
}
我们的应用层代码直接在收到广播数据判断下写就好。
定义的LED1灯需要在hal_board_cfg.h文件下注册,HalLedBlink函数是HAL库封装好的闪烁函数,还有很多LED灯操作的函数可以自己去阅读源码调用。
HAL库封装的硬件抽象层,打开hal_board_cfg.h文件按照自己的开发板修改。
例如您的LED灯定义在P1_2端口,需要修改为:LED1_BV BV(2) LED1_SBIT P1_2。
第三步:
找到SampleApp_SendPeriodicMessage(发送周期信息函数)在里面添加:
void SampleApp_SendPeriodicMessage( void )
{
byte SendData[3]="D1";
// 调用AF_DataRequest将数据无线广播出去
if( AF_DataRequest( &SampleApp_Periodic_DstAddr,//发送目的地址+端点地址和传送模式
&SampleApp_epDesc,//源(答复或确认)终端的描述(比如操作系统中任务ID等)源EP
SAMPLEAPP_PERIODIC_CLUSTERID, //被Profile指定的有效的集群号
2, // 发送数据长度
SendData,// 发送数据缓冲区
&SampleApp_TransID, // 任务ID号
AF_DISCV_ROUTE, // 有效位掩码的发送选项
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) //传送跳数,通常设置为AF_DEFAULT_RADIUS
{
}
else
{
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
// Error occurred in request to send.
}
}
一个开发板下载协调器,一个开发板下载终端。
当两个开发板的LED1闪烁说明发送数据是正常的