zigbee协议栈应用(二)基础协议栈入门
大家好,又见面了,我是你们的朋友全栈君。
zigbee基础理论
1.协议栈
(1)协议栈定义
协议栈是指网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程: 由上层协议到底层协议,再由底层协议到上层协议。使用最广泛的是英特网协议 栈,由上到下的协议分别是:应用层(HTTP,TELNET,DNS,EMAIL 等), 运输层(TCP,UDP),网络层(IP),链路层(WI-FI,以太网,令牌环,FDDI
等),物理层。
协议栈是协议的具体实现形式,通 俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个 协议的,进而实现无线数据收发。
ZigBee 的
协议分为两部分,IEEE 802.15.4 定义了 PHY(物理层)和 MAC(介质访问层)技术规范;ZigBee
联盟定义了 NWK(网络层)、APS(应用程序支持子层)、APL(应用层)技术规范。
物理层(PHY):
物理层定义了物理无线信道和 MAC 子层之间的接口,提供物理层数据服务和 物理层管理服务。
物理层内容:
1)ZigBee 的激活;
2)当前信道的能量检测;
3)接收链路服务质量信息;
4)ZigBee 信道接入方式;
5)信道频率选择;
6)数据传输和接收
介质接入控制子层(MAC)
MAC 层负责处理所有的物理无线信道访问,并产生网络信号、同步信号;支持 PAN 连接和分离,提供两个对等 MAC 实体之间可靠的链路
MAC 层功能:
1)网络协调器产生标;
2)与信标同步;
3)支持 PAN(个域网)链路的建立和断开;
4)为设备的安全性提供支持;
5)信道接入方式采用免冲突载波检测多址接入(CSMA-CA)机制;
6)处理和维护保护时隙(GTS)机制;
7)在两个对等的 MAC 实体之间提供一个可靠的通信链路。
网络层(NWK)
ZigBee 协议栈的核心部分在网络层。网络层主要实现节点加入或离开网络、接 收或抛弃其他节点、路由查找及传送数据等功能。
网络层功能:
1)网络发现;
2)网络形成;
3)允许设备连接;
4)路由器初始化;
5)设备同网络连接;
6)直接将设备同网络连接;
7)断开网络连接;
8)重新复位设备;
9)接收机同步;
10)信息库维护。
应用层(APL)
ZigBee 应用层框架包括应用支持层(APS)、ZigBee 设备对象(ZDO)和制造商所定 义的应用对象。
应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。
网络七层协议: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层
物理层:以二进制形式在物理媒体上传输数据
数据链路层:传输有地址的帧,错误检测功能
网络层:为数据包选择路由
传输层:提供端对端的接口
会话层:解除或建立与其他接点的联系
表示层:数据格式化,代码转换,数据加密
应用层:文件传输,电子邮件,文件服务,虚拟终端
(2)怎么使用协议栈
协议栈是协议的实现,可以理解为代码,函数库,供上层应用调用,
用户实现一个简单的无线数据通信时的一般步骤
1、组网:调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。
2、发送:发送节点调用协议栈的无线数据发送函数,实现无线数据发送。
3、接收:接收节点调用协议栈的无线数据接收函数,实现无线数据接收。
协议栈很多都封装好了,下面我们大概看看无线发送函数: 1. afStatus_t AF_DataRequest( afAddrType_t *dstAddr, 2. endPointDesc_t *srcEP, 3. uint16 cID, 4. uint16 len, 5. uint8 *buf, 6. uint8 *transID, 7. uint8 options, 8. uint8 radius ) ) 用户调用该函数即可实现数据的无线数据的发送,此函数中有 8 个参数,先理解以下两个参数
4. uint16 len, // 发送数据的长度; 5. uint8 *buf, // 指向存放发送数据的缓冲区的指针。
(3)zigbee 工作流程:
Zstack 中的osal_init_system调用过程: main()—> osal_init_system()—> osalInitTasks()—> SampleApp_Init()
Zstack 中的osal_init_system调用过程:
main()->osal_start_system()-> osal_run_system()->tasksEvents->osalInitTasks( void )
重要函数
SampleApp_Init()//用户应用任务初始化程序
SampleApp_ProcessEvent() //用户应用任务的事件处理函数
//接收数据,参数为接收到的数据 void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
SampleApp_SendPeriodicMessage()//分析发送周期信息
//发送函数
AF_DataRequest( &SampleApp_Periodic_DstAddr, //发送目的地址+端点地址和传送模式 &SampleApp_epDesc, //源(答复或确认)终端的描述(比如操作系统中任务 ID 等)源 EP SAMPLEAPP_PERIODIC_CLUSTERID, //被 Profile 指定的有效的集群号 2, // 发送数据长度 SendData,// 发送数据缓冲区 &SampleApp_TransID, // 任务 ID 号 AF_DISCV_ROUTE, // 有效位掩码的发送选项 AF_DEFAULT_RADIUS ) //传送跳数,通常设置为 AF_DEFAULT_RADIUS
先来点主线源码:
int main( void ) { osal_int_disable( INTS_ALL ); //关闭所有中断 HAL_BOARD_INIT(); //初始化系统时钟 zmain_vdd_check(); //检查芯片电压是否正常 InitBoard( OB_COLD ); //初始化 I/O , LED 、 Timer 等 HalDriverInit(); //初始化芯片各硬件模块 osal_nv_init( NULL ); //初始化 Flash 存储器 ZMacInit(); //初始化 MAC 层 zmain_ext_addr(); //确定 IEEE 64 位地址 zgInit(); //初始化非易失变量 #ifndef NONWK // Since the AF isn’t a task, call it’s initialization routine afInit(); #endif osal_init_system(); //初始化操作系统 osal_int_enable( INTS_ALL ); //使能全部中断 InitBoard( OB_READY ); //最终板载初始化 zmain_dev_info(); //显示设备信息 #ifdef LCD_SUPPORTED zmain_lcd_init(); //初始化 LCD #endif #ifdef WDT_IN_PM1 /* If WDT is used, this is a good place to enable it. */ WatchDogEnable( WDTIMX ); #endif osal_start_system(); // No Return from here 执行操作系统,进去后不会返回 return 0; // Shouldn’t get here. }
实验步骤 1.选择 CoordinatorEB, 下载到板 A;作为协调器 2.选择 EndDeviceEB, 下载到板 B;作为终端设备 3.给两块开发板上电,通过观察 D3 来判断组网是否成功,协调器 D3熄灭说明组网成功,当 终 端 D3熄灭时说明连网成功,请观察 Led1 灯的变化
(4)TI协议栈说明
有四种
1、Zstack 是针对Zigbee pro协议的 正确 2、RemoTI是针对Zigbee RF4CE协议的 正确 3、Simpliciti 简单的使用TI的zigbee芯片进行无限数据收发,只是使用mac层收发数据而已,自定义非标准 4、RF4CE不属于zigbee 标准,无法兼容通信,是新一代家电遥控解标准和协议 如果要组网,扩展能力强就用zstack 家电遥控类的就用rf4ce, 最简单的几个点通信,代码量最少可以使用Simpliciti即可,非常简单
2.设备
在 ZigBee 网络中存在三种逻辑设备类型:Coordinator(协调器),Router(路 由 器)和 End-Device(终端设备)。ZigBee 网络由一个 Coordinator 以及多个 Router 和多个 End_Device 组成。
ZigBee 设备有两种类型的地址。一种是 64 位 IEEE 地址,即 MAC 地址,另一 种是 16 位网络地址。 64 位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由 制造商或者被安装时设臵。这些地址由 IEEE 来维护和分配。 16 位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络 中鉴别设备和发送数据。其中,协调器的网络地址为 0x00
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140371.html原文链接:https://javaforall.cn
相关文章
- 案例分享——低压电力线载波通信模组(借助电源线实现远距离数据传输、宽压输入、波特率范围广、应用场景多样化)
- 由中国信通院牵头编写的《应用现代化建设指南》正式发布
- 高可用 - 06 Keepalived基础功能应用实例
- Chapter 1 - 可靠、可扩展与可维护的应用系统
- 大数据必学Java基础(一百一十一):过滤器注解应用和开发案例
- GO中gjson的应用和分享
- 英语基础-状语的应用
- 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧
- 【Android 安全】使用 360 加固宝加固应用 ( 加固工具准备 | 生成签名 APK | 加固操作 | 反编译验证加固效果 )
- MySQL与PHP的基础与应用专题之数据查询语句
- Oracle DBF文件的应用实践(oracle的dbf文件)
- Linux 基础知识与实际应用(linux基础与应用)
- Linux下大数据应用基础介绍(大数据的linux基础)
- Oracle数据库中虚拟列的应用(oracle虚拟列)
- 构建一个即时消息应用(三):对话
- 深入探讨MySQL的分析函数及其应用(mysql的分析函数)
- 探索 Linux 中的 CGI 文件:Web 应用程序开发的必备基础(linuxcgi文件)
- 「MySQL详解」 从基础入门到高级应用全面解析!(mysql大全)
- MySQL中的序列实现与应用(mysql下的序列)
- Redis中的哈希表功能及其应用(什么是redis的哈希表)
- Oracle会话文件夹应用开发者的基础(oracle会话文件夹)
- Oracle中函数的实用性及其应用(oracle中函数的用途)