zigbee按键控制灯程序
时间: 2023-11-19 19:11:19 浏览: 155
以下是一个基于 Zigbee 的按键控制灯的程序代码示例,使用的是 TI 的 CC2530 芯片和 Z-Stack 协议栈:
```c
#include "ZComDef.h"
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "OnBoard.h"
#include "SampleApp.h"
#include "DebugTrace.h"
#include "ZDProfile.h"
#include "ZDConfig.h"
// LED灯的IO口定义
#define LED_PIN P0_0
// 按键的IO口定义
#define KEY_PIN P0_1
// 群组ID
#define GROUP_ID 0x1234
// 节点角色定义
#define ROLE_COORDINATOR 1
#define ROLE_ROUTER 2
#define ROLE_ENDDEVICE 3
// 保存设备角色
uint8 deviceRole = ROLE_COORDINATOR;
// 保存设备状态
bool ledOn = false;
// 定义回调函数
void processZigbeeMessages(zdoIncomingMsg_t *msg);
void SampleApp_HandleKeys(uint8 shift, uint8 keys)
{
if (keys & HAL_KEY_SW_1)
{
// 按键按下
ledOn = !ledOn;
if (ledOn)
{
// LED点亮
LED_PIN = 1;
// 发送ON命令到群组
afAddrType_t destAddr;
destAddr.addr.shortAddr = 0xFFFF; // 广播到所有节点
destAddr.endPoint = 1; // 目标节点的端口号
destAddr.addrMode = afAddr16Bit;
uint8 data[2] = {0x01, GROUP_ID}; // ON命令和群组ID
AF_DataRequest(&destAddr, &SampleApp_epDesc, 1, data, NULL, AF_ACK_REQUEST, AF_DEFAULT_RADIUS);
}
else
{
// LED熄灭
LED_PIN = 0;
// 发送OFF命令到群组
afAddrType_t destAddr;
destAddr.addr.shortAddr = 0xFFFF; // 广播到所有节点
destAddr.endPoint = 1; // 目标节点的端口号
destAddr.addrMode = afAddr16Bit;
uint8 data[2] = {0x00, GROUP_ID}; // OFF命令和群组ID
AF_DataRequest(&destAddr, &SampleApp_epDesc, 1, data, NULL, AF_ACK_REQUEST, AF_DEFAULT_RADIUS);
}
}
}
void SampleApp_Init(uint8 task_id)
{
// 初始化LED灯和按键的IO口
P0SEL &= ~(BV(0) | BV(1));
P0DIR |= BV(0);
P0DIR &= ~BV(1);
// 注册回调函数
ZDO_RegisterForZDOMsg(task_id, End_Device_Bind_rsp);
ZDO_RegisterForZDOMsg(task_id, Match_Desc_rsp);
ZDO_RegisterForZDOMsg(task_id, Active_EP_rsp);
// 设置设备角色
if (deviceRole == ROLE_COORDINATOR)
{
// 初始化协调器
ZDOInitDevice(0);
}
else if (deviceRole == ROLE_ROUTER)
{
// 初始化路由器
ZDOInitDevice(1);
}
else if (deviceRole == ROLE_ENDDEVICE)
{
// 初始化终端设备
ZDOInitDevice(2);
}
}
uint16 SampleApp_ProcessEvent(uint8 task_id, uint16 events)
{
if (events & SYS_EVENT_MSG)
{
zdoIncomingMsg_t *msg;
while ((msg = ZDO_MsgQueueGet()) != NULL)
{
processZigbeeMessages(msg);
// 释放消息内存
osal_msg_deallocate((uint8 *)msg);
}
// 消息已经处理了,清空事件标志
return (events ^ SYS_EVENT_MSG);
}
return 0;
}
void processZigbeeMessages(zdoIncomingMsg_t *msg)
{
if (msg->clusterID == 0x0006) // 绑定请求
{
// 接受绑定请求
End_Device_Bind_rsp_t *bindRsp = ZDP_EndDeviceBindReq(&msg->srcAddr, msg->asdu);
}
else if (msg->clusterID == 0x8016) // 命令
{
if (msg->asdu[0] == 0x01 && msg->asdu[1] == GROUP_ID) // ON命令
{
// 点亮LED灯
LED_PIN = 1;
}
else if (msg->asdu[0] == 0x00 && msg->asdu[1] == GROUP_ID) // OFF命令
{
// 熄灭LED灯
LED_PIN = 0;
}
}
}
void main(void)
{
// 初始化系统
InitBoard();
InitZStack();
// 注册设备类型
SampleApp_epDesc.endPoint = 1;
SampleApp_epDesc.simpleDesc = &SampleApp_SimpleDesc;
SampleApp_SimpleDesc.AppProfId = 0x0104;
SampleApp_SimpleDesc.AppDeviceId = 0x0001;
SampleApp_SimpleDesc.AppDevVer = 1;
SampleApp_SimpleDesc.AppNumInClusters = 0;
SampleApp_SimpleDesc.AppNumOutClusters = 1;
SampleApp_SimpleDesc.AppOutClusterList[0] = 0x8016;
// 启动系统
osal_start_system();
}
```
这个程序中,我们在 `SampleApp_HandleKeys` 函数中处理按键事件,并通过 Zigbee 网络发送 ON/OFF 命令到群组。当接收到命令时,我们在 `processZigbeeMessages` 函数中处理命令并控制 LED 灯的开关。注意,我们使用了 Zigbee 的群组功能,将所有设备都加入到了同一个群组中,这样就可以通过广播命令的方式控制所有设备的开关。
阅读全文
相关推荐


















