# zigbee-zstack
.
├── Projects/zstack # 用户自定义
│ ├── Samples/ZigbeeZstack/Source # 源代码
│ │ └── App # Zstack协议(应用层)
│ │ ├── Lock # 门锁应用
│ | | ├── Drivers # 门锁驱动层
│ | | ├── Devices # 门锁设备层
│ | | ├── AppsL # 门锁应用低层
│ | | └── AppsH # 门锁引用高层
│ │ └── Base # 基站应用
│ ├── Tools # 配置文件
│ └── ZMain # 启动程序
└── Components # Ti公司定义
├── hal # 硬件驱动
├── mac # MAC层
├── mt # 串口通信
├── osal # 操作系统
├── services # 地址处理
├── stack # Zstack协议(网络层、AF射频、ZDO等)
└── zmac # MAC层
预编译项 | 说明 |
---|---|
BASE | 基站程序的编译项 |
BASE_UART | 使用基站自己编写的uart驱动,去掉则使用Z-Stack的uart驱动(自带的可以当作串口调试用) |
LOCK | 门锁程序的编译项 |
提示:由于使用了一个工程,除了Zstack协议(应用层)不同,Components都使用了同一个,所以对于基站和门锁都在Components修改了不一样的LED等驱动,所以需要根据预编译项进行驱动。
端口或定时器 | 普通IO口或外设 | 方向 | 说明 | Z-Stack |
---|---|---|---|---|
P1_5 | GPIO | 输出 | LED | 修改了LED配置,默认三个LED,都配置成P1_5 |
P2_0 | GPIO | 上拉输出 | 蜂鸣器引脚 | 在Z-Stack中默认是摇杆按键,这里配置修改 |
P0_1 | GPIO | 上拉输入 | 钥匙开门 | 修改了BUTTON配置,默认轮询扫描按键,配置成下降沿触发中断 |
P0_4 | GPIO | 上拉输入 | 锁扣 | 修改了BUTTON配置,默认轮询扫描按键,配置成下降沿触发中断 |
P0_5 | GPIO | 上拉输入 | 反锁 | - |
P0_6、P0_7、P1_0、P1_1 | GPIO | 输出或输入 | 电机H桥 | - |
P1_2、P1_3 | GPIO | 输出或输入 | EEPROM、时钟 | - |
P1_2、P1_3、P0_2、P0_3、P1_7 | GPIO | 输出或输入 | RFID读卡器 | 这里有端口和串口的外设端口冲突,覆盖了Z-Stack串口配置 |
T4定时器 | 外设 | 输出 | 蜂鸣器引脚 | 覆盖了默认的Z-Stack定时器配置 |
Adc | 模拟外设 | AIN0输入 | 电池电量检测 | - |
类型 | 配置 | 说明 |
---|---|---|
-DDEFAULT_CHANLIST=0x00008000 // 15 - 0x0F | 信道配置 | 所有的设备包括协调器(基站)和终端设备(门锁)都配置成15信道,该信道还可以避免与Wi-Fi信号频段的冲突 |
-DZDAPP_CONFIG_PAN_ID=0xFFF1 | PAN ID | 一个网络的唯一标识符,由于多个楼层可能会组建多个星型网络,所以每一个网络的PAN ID标识符可以设置不同,需要注意的是,基站和门锁最好一层楼一个PAN ID(一层楼一个网络) |
-DBEACON_REQUEST_DELAY=10000 | 信标请求帧发送周期 | 终端设备(门锁)在未找到合适的网络协调器(基站)时,也就是未入网时,会不停的周期性发送信标请求帧,这个时间不应该很短,这个参数对低功耗设计有很大作用 |
-DBEACON_REQ_DELAY_MASK=0x0FFF | 信标请求帧周期随机码 | 配合DBEACON_REQUEST_DELAY可以使信标请求帧的发送周期在10000ms-140095ms内的随机数 |
-DRFD_RCVC_ALWAYS_ON=FALSE | MAC层休眠关闭 | 这个参数对于终端设备的休眠非常重要,如果要配置成休眠模式,必须设置为FLASE,使协议栈的MAC层在休眠时也关闭 |
-DPOLL_RATE=1000 | 数据请求帧发送周期 | 当终端设备成功请求入网后,由于可能出在休眠模式导致协调器发送的数据无法接受,所以会主动发送数据请求帧告诉协调器当前处在可以接收射频消息的活跃状态,需要注意的是这个值变大可以降低功耗,但是消息接收的灵敏度下降,默认设置1s寻求一次数据。 |
-DQUEUED_POLL_RATE=100 | 暂时不清楚 | 使用默认设置 |
-DRESPONSE_POLL_RATE=100 | 暂时不清楚 | 使用默认设置 |
-DREJOIN_POLL_RATE=440 | 暂时不清楚 | 使用默认设置 |
提示:配置大部分都在Tools/f8wConfig.cfg文件中。
问题类型 | 说明 |
---|---|
Flash | Z-Stack配置的spi_flash.c经常阻塞程序运行等待什么东西,HalFlashWriteTrigger()被我注释。 |
EEPROM | EEPROM在存储和读取数据的时,需要注意在Z-Stack中不能存储后立马读取,需要一定的延时,具体原因未知。追加:进行for循环轮询读取连续地址的数据或写入连续地址的数据时候要在每一条操作后面跟一个5ms的延时! |
RFID | 需要注意在Z-Stack里有些端口被用作外设功能,如果要覆盖掉Z-Stack的配置,应该将端口用作普通IO或者外设功能的端口设置一下,这里模拟SPI时序一直出不来,就是因为有端口被用作外设而不是普通IO口,所以一直出问题,对于问题,可以先裸机跑,然后用排除法看是哪里出了问题。 |
LED(门锁) | 门锁作为终端节点,在加入网络并离开网络成为孤儿设备后,会不停的闪烁LED灯,这里将LED灯闪烁去掉,在HalLedSet设置,需要注意的是后期如果还有不明的闪烁LED情况,可以注释掉这个函数查看报错的地方,这样可以知道所有调用这个函数的地方。 |
LED(基站) | 基站在启动的时候LED3灯亮,表明协调器启动,这里注释不用,如果以后在遇到灯的问题可以注释HAL_LED_3查看哪里对灯做了操作(报错的地方都是使用了HAL_LED_3的地方) |
低功耗设置 | 低功耗设置好像有问题,需要深入了解 |
日期 | 进度 |
---|---|
2016/12/13 | Z-Stack工程的建立,加入了基站和门锁的应用层程序。 |
2016/12/14 | 门锁低功耗模式,设计为PM2功耗模式,采用休眠-唤醒-休眠的工作模式。每1s向基站发送data request,获取基站的命令数据。 |
2016/12/15 | 设置门锁离线定时程序,每隔1s启动离线程序,修改了LED底层驱动,目前只是实现了LED 1s闪烁,后期需要加入RFID读卡程序。 |
2016/12/16 | 修改底层按键硬件驱动,测试了按键的轮询扫描模式和中断触发模式成功,最后使用中断模式,轮询扫描模式每隔100ms扫描按键有无按下,效率低反应慢。 |
2016/12/17 | 添加了延时函数和蜂鸣器应用。 |
2016/12/18 | 添加了i2c驱动程序,添加了电机端口驱动程序,添加了电机设备程序,添加了EEPROM存储和读取程序,可以做到开门电机正反转和蜂鸣器LED提示音效果,配置了锁扣的中断触发初始化程序,可以做到检测开门动作并及时关门处理。 |
2016/12/19 | 添加了门锁反锁识别,添加了RFID刷卡读写卡程序,可以利用RFID卡开门。 |
2016/12/20 | 修改了EEPROM读取数据的BUG,添加了RFID卡的权限功能,包括普通进出卡,授权卡,删权卡,总卡等,可以对门锁进行离线的授权和删权以及初始化处理,增加了普通卡列表存储,保存在EEPROM中。对Z-Stack中信道的修改和信标帧的请求周期做了测试,并利用Packet Sniffer抓包工具对网络的建立过程进行了深入分析。 |
2016/12/21 | 改写了基站的LED驱动,增加了基站的串口驱动,实现了基站和门锁之间的广播和点播通信,利用串口助手增加了点对点通信数据丢包率的测试,明天可以根据地形、距离和电池电量进行丢包率测试。 |
2016/12/22 | 使用两把门锁点对点通信的方式实现和基站的通信,进行了丢包率测试,分别测试了10,15,20,25,30,35,40米平均三次,每次发送100帧数据,每帧数据3s发送一次,丢包率测试情况,正对的测试效果好,侧对的效果略差,误差率一般都在2%以内。 |
2016/12/23 | 基站添加了关联表用来关联连接的门锁设备信息,基站实现了通过网络地址点对点发送数据给门锁,基站添加了串口驱动程序,实现了TCP客户端和上位机Node的Tcp服务端通信。 |
2016/12/26 | 基站通讯串口通讯协议程序实现,添加了新的应用层任务,用于触发接收到正确的上位机数据帧命令。 |
2016/12/27 | 通过tcp命令获取基站关联列表 |
2016/12/28 | 反馈基站的门锁关联列表数据给tcp服务器,通过接接收上位机的命令发送点播信息给门锁,门锁开门并通过点播信息给协调器(基站)反馈开门命令信息 |
2016/12/29 | 添加Adc配置,检测电池电量,上传给上位机,开门时上传电池电量和信号强度 |
2017/01/04 | 低功耗开启?需要强化设计低功耗! |