【ZigBee协议栈简介】

【ZigBee协议栈简介】1、Zigbee协议栈简介  协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据收发。  如图1所示:Zigbee协议分为两部分,IEEE802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范;Zigbee联盟定义了NWK(网络…

大家好,又见面了,我是你们的朋友全栈君。

1、Zigbee协议栈简介

  协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据收发。

  如图1所示:Zigbee协议分为两部分,IEEE 802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范;Zigbee联盟定义了NWK(网络层)、APS(应用程序支持层)、APL(应用层)技术规范。Zigbee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供API(应用层),用户可以直接调用。

【ZigBee协议栈简介】

            图1 ZigBee无线网络协议层的架构图

 

2、如何理解Zigbee协议栈

  协议栈是协议的实现,可以理解为代码,库函数,供上层应用调用,协议较底下的层与应用是相互独立的。商业化的协议栈只提供你接口(其实和互联网行业的API模式很像)。就像你调用地图API时不需要关心底层地图是怎么根据位置或坐标绘制的,你也不用关心协议栈底层的实现,除非你想做协议研究。每个厂家的协议栈是有区别的,比如TI的BLE协议栈和nordic的BLE协议栈就有很大的不同(多说一点,TI的BLE协议栈更像是安卓的BLE结构,所以会安卓蓝牙的人可能能看懂TI的代码)。

 

3、如何使用Zigbee协议栈

  以简单的无线数据通信为例,其一般步骤为:

① 组网:调用协议栈组网函数、加入网络函数,实现网络的建立和节点的加入

② 发送:发送节点调用协议栈的发送函数,实现数据无线发送

③ 接收:接收节点调用协议栈的无线接收函数,实现无线数据接收

  由于协议栈都把这些函数都封装好了,因此我们用起来比较方便。下面是协议栈无线发送函数:

【ZigBee协议栈简介】

  如果想更好的应用协议栈就需要对协议栈提供的这些函数及其参数的具体作用和意义进行细致的了解,这个在接下来中会详细介绍。

 

4、安装Zigbee协议栈

  从我百度共享的所有本系列资料中下载004解压并安装:

【ZigBee协议栈简介】

               图2 ZigBee协议栈下载路径

 

安装好之后在win7开始按钮下会有如下文件结构:

【ZigBee协议栈简介】

                  图3 ZigBee协议安装完成后的文件结构

  其中:

【ZigBee协议栈简介】

 

5、基于协议栈的无线收发控制LED工程讲解(一)

  从网盘下载ZStack-2.3.1a压缩文件:

【ZigBee协议栈简介】

                             图4 工程源码所在云盘目录

  

  用IAR打开.. \ZStack-2.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB目录下的工程文件,注意不要把001Stack-2.5.1a放在比较深的文件夹内,否则IAR打开工程时可能一直卡打不开,也最好不要有中文!打开后工程及结构如下:(有点眼花缭乱,不要紧,后面会结合源码一步步分析)

【ZigBee协议栈简介】

                  图5 工程整体架构

 

6、基于协议栈的无线收发控制LED工程讲解(二)

  在IAR中选择XXXXEB,第一遍要rebuild all,下载好协调器之后,再切换到EndDeviceEB编译下载到另一个板子做终端设备:

【ZigBee协议栈简介】

          图6 编译工程

 

两个节点程序下载好之后上电会看到:组网成功后D1闪烁。

【ZigBee协议栈简介】

                图7 实验现象

 

7、基于协议栈的无线收发控制LED工程讲解(三)

main code:

复制代码

 1 int main( void )
 2 {
 3     osal_int_disable( INTS_ALL );// Turn off interrupts         关中断
 4     HAL_BOARD_INIT();// Initialization for board related stuff such as LEDs
 5     zmain_vdd_check();// Make sure supply voltage is high enough to run   检查芯片是否上电正常
 6     InitBoard( OB_COLD );// Initialize board I/O  初始化I/O,LED,Timer等
 7     HalDriverInit();// Initialze HAL drivers 初始化硬件抽象层驱动模块
 8     osal_nv_init( NULL );// Initialize NV System 初始化flash存储器
 9     znpTestRF();// Initialize and check the ZNP RF Test Mode NV items. 
10     ZMacInit();// Initialize the MAC  初始化MAC层
11     zmain_ext_addr();// Determine the extended address  确定IEEE64位地址
12 
13 #if defined ZCL_KEY_ESTABLISH
14     zmain_cert_init();// Initialize the Certicom certificate information.
15 #endif
16 
17     zgInit();// Initialize basic NV items  初始化非易失变量
18 
19 #ifndef NONWK
20     afInit();// Since the AF isn't a task, call it's initialization routine
21 #endif
22 
23     osal_init_system();// Initialize the operating system     初始化OS(重点介绍1)
24     osal_int_enable( INTS_ALL );// Allow interrupts       使能中断
25     InitBoard( OB_READY );// Final board initialization      最终板载初始化
26     zmain_dev_info();// Display information about this device     显示设备信息(这里有LCD屏幕)
27 
28 #ifdef LCD_SUPPORTED/* Display the device info on the LCD 将信息显示在LCD上*/
29     zmain_lcd_init();      
30 #endif
31 
32 #ifdef WDT_IN_PM1
33     WatchDogEnable( WDTIMX );/* If WDT is used, this is a good place to enable it. */
34 #endif
35 
36     osal_start_znp(); // No Return from here    执行操作系统(重点介绍2)
37 
38     return 0;  // Shouldn't get here.
39 } // main()

复制代码

代码有点难懂,核心是执行初始化工作,包括硬件抽象层、网络层、任务等。然后执行osal_start_znp() ,进入一个死循环,不断对任务进行遍历执行。这里我们需要重点了解两个函数:

【ZigBee协议栈简介】

 

① 操作系统初始化函数

【ZigBee协议栈简介】

在操作系统初始化中需重点关注的是操作系统任务初始化osalInitTasks函数,操作系统初始化函数中主要来创建任务,taskID是任务ID,每增加一个任务ID++,同时ID越小表示该任务优先级越高!其中蓝框内的函数是要根据系统想完成的任务做修改的地方,其他都是官方提供的基本不用变的任务。

 

② 操作系统启动函数

【ZigBee协议栈简介】

执行OS的函数就是个大循环,不断取出当前优先级最高的待处理事件进行处理,处理的核心思想在osal_run_task函数内:通过调用一个函数指针来远程调用一个事件处理函数

 

8、小结

  至此,我们讲到任务如何建立、如何处理等,其中有一个环节没有讲——如何从events=(tasksArr[idx])(idx,event)关联到每个具体任务的事件处理函数的?这个其实我在CC2540/CC2541的前两篇中已有详细介绍:[接下来会针对具体通信梳理流程!]

1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解

2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

3、CC2541芯片中级教程-OSAL操作系统(ADC光敏电阻和修改串口波特率)

4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)

5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)

【ZigBee协议栈简介】

 

 

转自:https://www.cnblogs.com/zjutlitao/p/5722045.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140421.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用谷歌搜索攻略_Google浏览器

    使用谷歌搜索攻略_Google浏览器由于谷歌被封,无法使用谷歌搜索。但是对于研发人员来说,很多问题只有在谷歌中才能找到答案。后来一朋友推荐了archsocks代理服务1、访问https://github.com/archsocks/archsocks链接,下载windows版本安装。 如果没有,附件中有安装文件2、按照readme中的操作步骤来操作。 3、配置pac代理。 首先打开网络网络和共享中…

    2025年9月7日
    7
  • 关于struts2的error filterStart问题的解决

    关于struts2的error filterStart问题的解决eclipse下部署好项目启动的时候出现errorfilterStart错误,参考了网上的资料,发现很多人遇到。有一篇帖子帮到了我。是关于这个问题的总结。根据那个帖子的提示,我认为是我的tomcat安装路径的问题。我的tomcat安装在了d:\programfiles下,后来我将tomcat移到了D盘根目录下重新部署启动,问题就没有了。至于为什么会这样,那个帖子上有一个解释,但是我不是太明白。

    2022年7月11日
    19
  • dedecms系统后台登陆提示用户名密码不存在

    dedecms系统后台登陆提示用户名密码不存在

    2021年10月7日
    41
  • Contiki 2.7 Makefile 文件(三)

    Contiki 2.7 Makefile 文件(三)

    2022年2月22日
    44
  • java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda…

    java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda…我们都知道,java8之后增加了很多新特性,大大的简化了代码的编写、阅读的负担。先发个牢骚:今天up主根据自己的理解跟大家说说新特性之一的lambdaexpress(拉姆达表达式),每当看到新的语法改动,内心我都是拒绝的。因为又要学习、又要适应、又要改变真烦人,可是没办法现在这几乎是所有大厂必须的操作。总不能看不懂人家写的代码吧,做IT行业尤其是软件工程师必须要保证自己的知识及时更新、知识面不…

    2022年9月19日
    3
  • 突破思维的障碍

    突破思维的障碍译者的话   在众多的讲述思维及创造性的书中,这是一本普通的小册子,但它却是吸引人的。作者用妙趣横生而又日常可见的素材向我们娓娓叙说了人人都会关心的问题,即我们是否意识到自己的思维障碍,怎样克服它,让自己变得更富有创造活力。   这本书在美国一版再版,风靡一时,拥有广泛的读者,无论是从事研究工作的高级学者、研究人员,还是从事行政、工商和管理活动的人士或普通学生。相信本书与中国读者的见面

    2022年5月5日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号