zigbee通讯技术复习笔记

2023-05-16

这门课对于我一个学嵌入式的来说,还是比较重要的,所以我还是以老师给出的大纲为主体,好好复习一下!

题型:选择题24x1.5 判断10x1 填空15x1 简答4x5 程序1x5 另外一个设计题1x14

每个标题前半部分是老师的提纲知识点,补充下面是我看到的可能比较重要的或者可以了解的。

WPAN及ZigBee基础

  1. Zigbee、蓝牙、IEEE802.11b(WiFi)标准都是工作在2.4G频段的无线通信标准;Zigbee主要用在短距离无线控制系统,传输少量的控制信息;(P2)
  2. 短距离无线网络主要分为:无线局域网(WLANs)和无线个域网(WPANs)(P3)
  3. 无线个域网所对应的通信协议:(P3)
    HR-WPANS:802.15.3
    MR-WPANS:蓝牙
    LR-WPANS(低速率无线个域网):802.15.4
  4. Zigbee最大传输速率:250kbps。 ZigBee可工作在2.4GHz(全球流行)、868MHz(欧洲流行) 和915 MHz(美国流行)3个频段上,分别具有最高250kbit/s、20kbit/s和40kbit/s的传输速率,它的传输距离在10-75m的范围内, 但可以继续增加 。
  5. Zigbee无线网络分层: 物理层(PHY) 介质访问控制(MAC)网络层(NWK)应用程序支持子层(APS) 应用层(APL)(P4)
    其中802.15.4 定义了物理层和介质访问控制层Zigbee协议定义了网络层、应用程序支持子层和应用层(具体介绍见下面的补充)
  6. Zigbee特点:(自组网)(P5)
    高可靠性:采取了碰撞避免策略;MAC层采用了完全确认的数据传输模式;
    低成本、低功耗 :ZigBee模块的复杂度不高,ZigBee协议免专利费,再加之使用的频段无需付费,所以它的成本较低;ZigBee的传输速率低,发射功率仅为1mW,而且采用了休眠模式,功耗低
    高安全 :采用高级加密标准(AES 128) 的对称密码;
    低数据速率
  7. Zigbee设备类型:(P5)
    协调器(ZC Coordinator):主要负责无线网络的建立与维护;(每个ZigBee网络必须有一个)
    路由器(ZR Router):主要负责无线网络的路由;( (1)允许其他网络设备加入 (2)多跳路由 (3)协助电池供电的子节点通信(4)自己作为终端节点应用)
    终端节点(ZED End-device):主要负责无线网络数据的采集。(1)向路由节点传递数(2)没有路由功能(3)低功耗(Zigbee的低功耗主要体现在这里)(4)可选择睡眠与唤醒。(路由因不断转发数据需电源供电,终端节点电池供电))
  8. Zigbee工作在ISM(工业、科学和医疗)频带,共规定了27个信道:(P7)
    2.4GHz频段 共16个信道,通信速率为250kbps
    915MHz频段 共10个信道,通信速率为40kbps
    896MHz频段 共1个信道,通信速率为20kbps
  9. Zigbee网络拓扑结构:星型;网络型;簇状;(P8)
  10. Zigbee应用为:周期性 ;反复; 间断数据采集应用
  11. Zigbee模块开发一般包括两个文件:.h头文件和.c文件(P)
    .h文件可理解为一份接口描述文件;
    .c文件主要功能是对.h文件中声明的外部函数进行具体实现。

补充:

  1. Zigbee网络中传输的三类数据:
    周期性数据:如家庭中水、电、气三表数据的传输;
    间断性数据:如电灯、家用电器的控制等数据的传输;
    反复性的低反应时间的数据:如鼠标、操作杆传输的数据。
  2. ZigBee设备分类
    全功能设备(FFD):可以担任网络协调者,形成网络,让其它的FFD或是精简功能装置(RFD)连结,FFD具备控制器的功能,可提供信息双向传输
    ~附带由标准指定的全部 802.15.4 功能和所有特征
    ~更多的存储器、计算能力可使其在空闲时起网络路由器作用。
    ~也能用作终端设备
    精简功能设备(RFD):RFD只能传送信息给FFD或从FFD接收信息。
    ~附带有限的功能来控制成本和复杂性
    ~在网络中通常用作终端设备。
    ~ZigBee相对简单的实现自然节省了费用。RFD由于省掉了内存和其他电路,降低了ZigBee部件的成本,而简单的8位处理器和小协议栈也有助于降低成本。

Zigbee设备类型与角色对应关系
在这里插入图片描述
3. ZigBee协议架构
物理层功能:PHY层由射频收发器以及底层的控制模块构成;
1. 激活和休眠射频收发器;
2. 信道能量检测(energy detect);
3. 检测接收数据包的链路质量指示(link quality indication , LQI);
4. 空闲信道评估(clear channel assessment, CCA);
5. 收发数据。
数据链路层功能:MAC子层为高层访问物理信道提供点到点通信的服务接口
1. 协调器产生并发送信标帧,普通设备根据协调器的信标帧与协议器同步;
2. 支持PAN网络的关联(association)和取消关联(disassociation)操作;
3. 支持无线信道通信安全;
4. 使用CSMA-CA(载波侦听多路访问/冲突避免)机制访问信道;
5. 支持时槽保障(guaranteed time slot, GTS)机制;
6. 支持不同设备的MAC层间可靠传输。
网络层功能:
1. ZigBee网络层的主要功能就是提供一些必要的函数,确保ZIgBee的MAC层(IEEE 802.15.4-2003)正常工作,并且为应用层提供合适的服务接口。为了向应用层提供其接口,网络层提供了两个必须的功能服务实体,它们分别为数据服务实体管理服务实体
2. 网络层数据实体(NLDE)通过网络层数据服务实体服务接入点(NLDE-SAP)提供数据传输服务
3. 网络层管理实体(NLME)通过网络层管理实体服务接入点(NLME-SAP)提供网络管理服务。网络层管理实体利用网络层数据实体完成一些网络的管理工作,并且,网络层管理实体完成对网络信息库(NIB)的维护和管理。
应用会聚层功能:该层主要负责把不同的应用映射到ZigBee网络上,具体而言包括:
1. 安全与鉴权
2. 多个业务数据流的会聚
3. 设备发现
4. 服务发现

4.TCP/IP结构对应OSI结构: 在这里插入图片描述
5. Z-Stack协议栈文件组织结构介绍
在这里插入图片描述

CC2530芯片相关

  1. CC2530单片机是一款完全兼容8051内核,支持802.15.4协议的无线射频单片机(P30)
    CC2530的Flash(非易失性存储器)容量可选: 32KB 64KB 128KB 256KB
    CC2530有两个晶振: 32MHz 晶振 32.768KHz(无线通信时必须采用外部32M晶振
  2. I/O口控制
    CC2530内部自带温度传感器:
    使用步骤:
    1、使能温度传感器
    2、连接温度传感器到ADC
    3、初始化ADC,确定参考电压、分辨率等,启动ADC读取温度数据
    补充:

Zigbee地址相关

  1. 设备地址:(P134)
    64位IEEE地址:长地址又称 MAC地址扩展地址(全球唯一)
    16位网络地址:短地址 又称逻辑地址(协调器地址为0x0000,其他设备入网时由协调器分配)(1)在网络中标识不同设备;(2)在网络数据传输时指定目的地址和源地址;

  2. 网络地址:唯一标示网络中的一个节点(用网络地址来区分不同的节点);(P135)

  3. 网络地址最多可以分配65536个节点,地址分配取决于整个网络的架构,整个网络的架构由一下3个值决定:1、网络最大深度 2、每个父节点拥有的孩子节点最大数目 3、每个父节点拥有的孩子节点路由器的最大数目
    同一父节点相连的终端节点的网络地址是连续的
    同一父节点相连的路由器节点的网络地址通常是不连续的

  4. 端口:每个节点上最多支持240(1-240)个端口,每个节点上的所有端口共用一个发射/接收天线(用端口来区分同一节点的端口);

  5. PANID:Zigbee网络号 可手动设置(或自动随机生成),如果指定的PANID被占用则自动加1。
    ~PANID范围是0X0001----0XFFFF;
    ~可以通过给不同的网络指定不同的网络ID号来区分网络,避免干扰;
    ~如果设置为0XFFFF,那么协调器则随机产生一个值作为自己的PANID;

    非易失性闪存条目ID号(NV操作用到的ID则定义在0x0201~0x0FFF 范围内!) 在这里插入图片描述

  6. 数据发送:调用**AF_DataRequest()**函数通过天线发送数据(P139)

afStatus_t  AF_DataRequest( afAddrType_t *dstAddr, 
												endPointDesc_t *srcEP,
                          						uint16 cID, 
                          					    uint16 len, 
                          						uint8 *buf, 
                          						uint8 *transID,
                          						uint8 options,
                          						uint8 radius )
  1. 数据接收:调用**osal_msg_receive()**函数从消息队列中接收一个消息(包含事件与数据)
    uint8 *osal_msg_receive( uint8 task_id )

  2. 数据存储位置(结构):(P130)

typedef struct
{
  osal_event_hdr_t hdr;     /* OSAL Message header */
  uint16 groupId;           /* Message's group ID - 0 if not set */
  uint16 clusterId;         /* Message's cluster ID */
  afAddrType_t srcAddr;     /* Source Address, if endpoint is STUBAPS_INTER_PAN_EP,
                              				 it's an InterPAN message */
  uint16 macDestAddr;       /* MAC header destination short address */
  uint8 endPoint;           /* destination endpoint */
  uint8 wasBroadcast;       /* TRUE if network destination was a broadcast address */
  uint8 LinkQuality;        /* The link quality of the received data frame */
  uint8 correlation;        /* The raw correlation value of the received data frame */
  int8  rssi;               /* The received RF power in units dBm */
  uint8 SecurityUse;        /* deprecated */
  uint32 timestamp;         /* receipt timestamp from MAC */
  afMSGCommandFormat_t cmd; /* Application Data */
} afIncomingMSGPacket_t;

typedef struct
{
  byte   TransSeqNumber;
  uint16 DataLength;               // Number of bytes in TransData
  byte  *Data;
} afMSGCommandFormat_t;
  1. OSAL(系统抽象层)是一种支持多任务运行的系统资源分配机制(P72)
    OSAL主要功能:
    任务注册、初始化和启动
    任务间的同步、互斥
    中断处理
    存储器分配和管理

补充:

  1. IEEE802.15.4网络的建立过程
    在这里插入图片描述
  2. int main( )主函数实现硬件的初始化其中包括
    在这里插入图片描述

事件驱动

  1. 首先记住 任务轮询、事件驱动 必考;

  2. Zigbee将事件和任务的事件处理函数联系方法:(P74)
    1、建立一个事件表,保存各个任务的对应事件
    2、建立另一个函数表,保存各个任务事件处理函数地址
    3、将两张表建立某种对应关系

  3. OSAL工作原理(轮询)osal_start_system(void)
    通过tasksEvents指针访问事件表的每一项,如果有时间发生,则查找函数表找到事件处理函数进行处理,处理完后,继续访问事件表,查看是否有事件发生,无限循环;(P75)

  4. 协议栈定义的事件成为系统强制事件:(P80)
    AF_INCOMING-MSG-CMD
    ZDO_STATE_CHANGE
    ZDO_CB_MSG
    AF_DATA_CONFIRM_CMD

  5. Zigbee协议栈为半开源

  6. Zigbee协议栈串口操作(P85)
    串口基本操作步骤:
    1、初始化串口,包括设置波特率、中断等
    2、向发送缓冲区发送数据或从接收缓冲区读取数据
    操作函数:

 uint8    HalUARTOpen(uint8 port,halUARTCfg_t *config); //初始化串口(设置波特率、中断等)
 uint16  HalUARTRead(uint8 port,uint8 *buf,uint16 len); //从接受缓冲区读取数据
 uint16  HalUARTWrite(uint8 port,uint8* buf,uint16  len);// 向缓冲区发送数据
  1. 串口回调函数:回调函数不是由该函数实现方直接调用的,而是在特定的事件或条件发生的,由另外的一方调用,用于对该事件或条件进行响应。因此,串口回调函数是在有串口操作(事件)发生时(自动触发)调用的;(P89)

  2. 当应用有串口操作时,应该对应用程序模块的工程属性的编译预处理的Definedsymbols下拉列表框中输入“HAL_UART=TRUE”。(即用条件编译来控制是否编译与该模块相关的程序,目的是为了节约存储资源);(P93)

  3. 程序中波特率的设置要与上位机(如串口助手)一致;

  4. Zigbee协议栈NV操作(P120)
    NV(Non Volatile),即非易失性存储器(Flash存储器),即系统掉电,存储器中的数据不掉失。主要用途保存网路的配置参数,或掉电后,上电该节点还是加入原来的网络并且该节点的网络地址就可以从NV读取。
    NV存储器主要的操作有初始化NV存储器、读NV存储器、写NV存储器。这些都在OSAL文件夹下中的OSAL_Nv.h和OSAL.h文件中定义和实现。
    下面三个操作函数分别是:
    NV初始化函数:uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf ),NV存储器将该存储器分成多个条目,每个条目都有一个ID号。 条目的分类见OSAL文件夹中的ZcomDef.h文件,其中要知道的是:用户应用程序定义的条目地址范围为是0x0201到0x0FFF;
    NV写操作函数:uint8 osal_nv_write( uint16 id, uint16 ndx, uint16 len, void *buf );
    NV读取函数:uint8 osal_nv_read( uint16 id, uint16 ndx, uint16 len, void *buf );
    第一个参数:uint16:NV条目ID号
    第二参数:举例条目开始的偏移量
    第三参数:要写入的数据长度
    第四参数:执行要存放写入或读取数据函数缓冲区的指针

  5. 用户只能使用条目ID范围0x0201~0x0FFF
    可在OSAL文件夹下的ZcomDef.h文件中添加自己的条目
    如:#define Test_NV 0x0201

  6. **函数名要考:**
    **事件添加函数**:osal_set_event()
    			函数原型:osal_set_event(  taskID, SYS_EVENT_MSG );
    			参数说明:  taskID:任务
    							 SYS_EVENT_MSG :事件
    **定时器函数**:osal_start_timerEx() (具有开启和停止一个定时器的功能,定时器能用**1毫秒**的增量进行设置)
    			函数原型: uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value);
    			参数说明:taskID:任务
    							  event_id:事件
    							  timeout_value:定时毫秒数
    
    **内存拷贝函数**:osal_memcpy()
    **内存比较函数**:osal_memcmp()
    **字符串长度函数**:osal_strlen()
    
    **无线发送函数**:AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,
                       uint16 cID, uint16 len, uint8 *buf, uint8 *transID,
                       uint8 options, uint8 radius )
    **消息接收函数**:uint8 *osal_msg_receive( uint8 task_id )
    

补充:

  1. SYS_EVENT_MSG是系统事件,也是协议栈已经定义好的系统事件。
    在文件ZcomDef.h中,事件号是一个16bit的常量,使用叫作独热码(one-hot code)编码,也是一个位表示一个事件,方便进行event的提取,这样一个task最多可以有16个event,SYS_EVENT_MSG已经占用了0x8000,故自定义的事件只能有15个
  2. 事件的提取和清除可以用简单的位操作指令实现,事件的提取可以用位操作 events & SYS_EVENT_MSG,事件的清除可以用异或操作实现,evets ^ SYS_EVENT_MSG;

Zigbee通信相关

  1. Zigbee协议栈中的规范(Profile)和簇(Cluester)
    Zigbee网络中进行数据收发都是建立在应用规范基础上的。每个应用规范都有一个ID来标示。在一个规范(Profile)下又提出了簇(Cluester)的概念,这个Cluester要理解为一个应用领域下的一个特定对象。簇是由命令组成的。

  2. 同一规范下的发送命令(簇号)和接受命令(簇号)要相同才能通信;

  3. Zigbee网络通信必须建立在具体设备节点的具体通信端口:
    网络地址可以描述一个节点,用户可使用简单描述符来描述一个端口。(用户可用的端口号是1-240)

  4. Zigbee通信模式:点播 广播 组播(这一点重点,我觉得可能考设计题和程序题,所以我会在下面着重补充)
    点播
    发送模式:Addr16Bit
    发送目的端口:目的节点的简单描述符设定的工作端口
    发送地址:目的节点的网络地址
    广播
    发送模式:AddrBroadcast
    发送目的端口:目的节点的简单描述符设定的工作端口
    发送地址: 0xFFFF 全网发送 包括休眠节点
    0xFFFD 只发往休眠节点
    0xFFFC 发往所有路由节点
    组播(同一组的节点才能通信)
    发送模式:AddrGroup
    发送目的端口:目的节点的简单描述符设定的工作端口
    发送地址:组ID

  5. #include “aps_groups.h”
    1、设置组对象(ID 和 name)
    2、加入对象组 aps_AddGroup()
    3、退出组

  6. Zigbee协议栈网络管理
    Zigbee协议栈实现网络管理的函数:
    获得该节点的网络地址:uint16 NLME_GetShortAddr(void)
    获得该节点的MAC地址:byte * NLME_GetExtAddr(void)

     	获得该节点的父节点网络地址:uint16 NLME_GetCoordShortAddr(void)
     	获得该节点的父节点MAC地址:void NLME_GetCoordExtAddr(byte *buf)
    

蓝牙

  1. 采用高速跳频扩展,实现语音和数据在短距离上的稳定无缝无线连接
    在2.4GHz的ISM频带上设立79个带宽为GHz的信道,用每秒钟切换1600次的频率的跳频(Hobbing)扩展技术实现信息的收发。
    蓝牙系统中的功能模块分为:无线射频单元、链路控制单元、链路管理单元、软件结构
  2. 微微网: 1主设备 7从设备
  3. 蓝牙技术采用了全开放的框架结构
  4. 蓝牙技术的系统结构分为三大部分:
    1.底层硬件模块
    2.中间协议层
    3.高层应用
  5. 蓝牙协议分为四层:
    1.核心协议:BaseBand、LMP、L2CAP、SDP;
    2.电缆替代协议:RFCOMM;
    3.电话传送控制协议:TCS-Binary、AT 命 令 集;
    4.选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、 WAE。
  6. 近场通信NFC 及WIFI(了解一下,不考)

下面我整理了一下实验的一些核心代码,大家可以结合教材一起看,应该会在代码题和设计题里面考:

温度的采集:
1、协调器源代码(串口初始化后闪红灯并向上位机发送”init ok“,协调器收到终端发的温度传到上位机,上传一次闪一次蓝灯):
串口初始化:
  uartcnf.configured=TRUE;
  uartcnf.baudRate=HAL_UART_BR_115200;
  uartcnf.flowControl=FALSE;
  HalUARTOpen(1,&uartcnf);
  HalUARTWrite(1,"init ok",7);
  HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH );
收到信息处理函数:
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  unsigned char buffer[2]={0x0A,0x0D};
  TEMPERATURE temp;
  osal_memcpy(&temp,pkt->cmd.Data,sizeof(temp));
  HalUARTWrite(1,(uint8 *)&temp,sizeof(temp));
  HalUARTWrite(1,buffer,2);
  HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
}

2、终端源代码(检测温度后向协调器发,发一次闪一次蓝灯):
点播初始化:
  GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
  GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_DstAddr.addr.shortAddr = 0x0000;


发送函数:
void GenericApp_SendTheMessage( void )
{
  int8 tvalue;
  TEMPERATURE temp;
  temp.BUF.Head='&';
  tvalue=readTemp();
  temp.BUF.value[0]=tvalue/10+'0';
  temp.BUF.value[1]=tvalue%10+'0';
  temp.BUF.Tail='C';
  AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       sizeof(temp),
                       (uint8 *)&temp,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) ;
  HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
  
}
NV操作:
串口初始化:
  halUARTCfg_t uartcfg;
  uartcfg.configured=TRUE;
  uartcfg.baudRate=HAL_UART_BR_115200;
  uartcfg.flowControl=FALSE;
  uartcfg.callBackFunc=rxcb;
  HalUARTOpen(1,&uartcfg);
  HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH );

回调函数(上位机发送nvread,协调器执行NV操作之后向上位机发送20):
  static void rxcb(uint8 port,uint8 event ){
  uint8 value_read;
  uint8 value=63;
  uint8 uartbuf[2];
  uint8 cmd[6];
  HalUARTRead(1,cmd,6);
  if(osal_memcmp(cmd,"603nb",5))
  {
    osal_nv_item_init(TEST_NV,1,NULL);
    osal_nv_write(TEST_NV,0,1,&value);
    osal_nv_read(TEST_NV,0,1,&value_read);
    uartbuf[0]=value_read/10+'0';
    uartbuf[1]=value_read%10+'0';
    HalUARTWrite(1,uartbuf,2);
  }
  HalLedSet( HAL_LED_1, HAL_LED_MODE_FLASH );
  
}
组播
初始化串口,组播代码:
  halUARTCfg_t mycfg;
  mycfg.configured=TRUE;
  mycfg.baudRate=HAL_UART_BR_115200;
  mycfg.flowControl=FALSE;
  mycfg.callBackFunc=NULL;
  HalUARTOpen(1,&mycfg);
  HalUARTWrite(1,"ok",2);
aps_Group_t G1;(定义为全局变量);

  G1.ID=0x0001;
  G1.name[0]=2;
  osal_memcpy(&(G1.name[1]),"G1",2);

入组函数:
aps_AddGroup(GENERICAPP_ENDPOINT ,&G1);

消息发送函数代码:
void GenericApp_SendTheMessage( void )
{
  char theMessageData[] = "zb";
   afAddrType_t myaddr;
  myaddr.addrMode=(afAddrMode_t)AddrGroup;
  myaddr.endPoint=GENERICAPP_ENDPOINT;
  myaddr.addr.shortAddr=G1.ID;
  AF_DataRequest( &myaddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); 
  HalUARTWrite(1,"send to G1",10);
}

消息处理函数:
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
   char buf[17];
   osal_memcpy(buf,pkt->cmd.Data,17);
   HalUARTWrite(1,buf,17);
}


路由器代码(入网后亮红灯并入组“G1”,收到消息包将红灯状态翻转,并向协调器发送“router received”):

状态变化代码:
        case ZDO_STATE_CHANGE:
          GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
          if ( (GenericApp_NwkState == DEV_ROUTER) )
          {
           aps_AddGroup(GENERICAPP_ENDPOINT,&G1);
           HalLedSet(HAL_LED_2,HAL_LED_MODE_ON);
          }
  
消息处理函数:
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE);
  GenericApp_SendTheMessage();
}

消息发送函数:
void GenericApp_SendTheMessage( void )
{
  unsigned char theMessageData[17]= "router received!";
  afAddrType_t myaddr;
  myaddr.addrMode=(afAddrMode_t)Addr16Bit;
  myaddr.endPoint=GENERICAPP_ENDPOINT;
  myaddr.addr.shortAddr=0x0000;
  AF_DataRequest( &myaddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
}
广播:
串口初始化代码:
  halUARTCfg_t mycfg;
  mycfg.configured=TRUE;
  mycfg.baudRate=HAL_UART_BR_115200;
  mycfg.flowControl=FALSE;
  mycfg.callBackFunc=NULL;
  HalUARTOpen(1,&mycfg);
  HalUARTWrite(1,"ok",2);

广播代码:
void GenericApp_SendTheMessage( void )
{
  char theMessageData[] = "send";
  afAddrType_t myaddr;
  myaddr.addrMode=(afAddrMode_t)AddrBroadcast;
  myaddr.endPoint=GENERICAPP_ENDPOINT;
  myaddr.addr.shortAddr=0xFFFF;
  AF_DataRequest( &myaddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );  
HalUARTWrite(1,"send",4);
}

收到消息包的处理函数:
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
 HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
 char buf[4];
 unsigned char buffer[2]={0x0A,0x0D};
 osal_memcpy(buf,pkt->cmd.Data,4);
 HalUARTWrite(1,buf,4);
 HalUARTWrite(1,buffer,2);
 
}

终端代码(终端入网后亮蓝灯,在收到消息包之后将蓝灯状态翻转,并向协调器发送“end1”或“end2”):

消息处理函数代码:
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
    HalLedSet(HAL_LED_2,HAL_LED_MODE_ON);
    
  GenericApp_SendTheMessage();
}

发送函数代码:
void GenericApp_SendTheMessage( void )
{
  unsigned char theMessageData[4]= "end2";
  afAddrType_t myaddr;
  myaddr.addrMode=(afAddrMode_t)Addr16Bit;
  myaddr.endPoint=GENERICAPP_ENDPOINT;
  myaddr.addr.shortAddr=0x0000;
  AF_DataRequest( &myaddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
  HalLedSet(HAL_LED_1,HAL_LED_MODE_TOGGLE);
    // Error occurred in request to send.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

zigbee通讯技术复习笔记 的相关文章

随机推荐

  • 精密单点定位技术(PPP)和RTK技术有什么区别

    首先用通俗的话来说 xff0c RTK是先架设一个基站 xff0c 基站把自己的误差是多少告诉我 xff0c 我再用这个误差项去消除自己移动站的误差 而PPP不用我们自己架设基站 xff0c 已经有一些基础的基站 xff0c 通过卫星发送的
  • ubuntu network manager 网络需要手工重启解决

    乌班图的无线和网络需要手工 sudo service network manager restart才可以搜索到 其实主要是我手工编辑了 etc network interface 修改的方法就是在 etc NetworkManager N
  • C#垃圾回收GC机制

    https www cnblogs com yzl050819 p 6245463 html 可以参考这篇文章的内容 程序员不能控制解构器何时将被执行因为这是由垃圾收集器决定的 垃圾收集器检查不在被应用程序使用的对象 它认为这些条件是符合清
  • 编译xlslib 测试写入中文

    1下载xlslib库 https sourceforge net projects xlslib source 61 directory 我下载的是 xlslib package 2 5 0 zip 解压 在xlslib xlslib bu
  • 电商API:拍立淘图片搜索

    item search img 按图搜索淘宝商品 xff08 拍立淘 xff09 查看演示 onebound taobao item search img 请求参数 xff1a imgid 61 http g search3 alicdn
  • Qt的UI布局以及控件间隔(Spacing)边距(Margins)

    替一个Widget设置布局有两种方法 1layout 构造函数传递QWidget QVBoxLayout MainQVboxLayout 61 new QVBoxLayout MainWidget 2layout构造函数传递NULL xff
  • 让Qt自定义窗口边界可以拉伸

    qt去掉外边框以后 边界不能拉伸 第一 根据mouseevent事件到达边界的时候自己处理 通过resize 来设置 这种需要写的代码较多 windows平台上有更简版的方法 处理winevent里面的 WM NCHITTEST switc
  • 最新uboot的Kbuild系统 3 .config的生成

    前面的工作产生了一个conf 关键点是由conf产生 config的过程 最后是通过执行 scripts kconfig conf defconfig 61 arch configs rpi defconfig Kconfig 生成的 Kc
  • linux下IDA安装使用

    http www hexblog com p 61 958 sudo dpkg add architecture i386 sudo apt get update sudo apt get install libc6 i686 i386 l
  • RK3288的几种USB模式

    RK3288启动后有三种模式 xff0c 可以分别进行操作 一种是normal也就是正常的启动模式 这个模式无法刷固件 一般板子通电就是这个模式 第二种是loader模式 就是刷固件模式 这个模式可以刷各种image 按住recover按键
  • (导数)微分与积分的概念

    1导数定义 2微分 微分可以看作 y在自变量增量x 处在一个极小值deta x下的变化值的线性主部 微分指的是dy dy和deta Y有一个极小的增量也就是图5 9中的Q Q 39 xff0c 这一部分可以忽略不计 所以是微分 dy 是de
  • android sdk license问题

    You have not accepted the license agreements of the following SDK components Checking the license for package CMake 3 6
  • git还原某个文件到特定的版本

    转载自 https www cnblogs com qianxinxu p 7159739 html 场景 xff1a 对于某个Git控制下的文件进行了修改 xff0c 但是改的不满意 xff0c 想退回到改之前的版本 假定该文件为 src
  • frida初探1

    frida包括客户端和服务 服务运行在windows上面 通过Pip install frida安装 安装比较慢的话 直接下载frida 12 6 13 tar 执行 python setup py install 然后会要继续下载 fri
  • 常见PCB封装图解

    常用集成电路芯片封装图 doc文档可能在WAP端浏览体验不佳 建议您优先选择TXT xff0c 或下载源文件到本机查看 PCB 元件库命名规则 2 1 集成电路 xff08 直插 xff09 用 DIP 引脚数量 43 尾缀来表示双列直插封
  • visual studio 里面解决方案资源管理器界面不见了,应该如何显示出来?并且如何将其从右边更改到左边

    1 打开visual studio 软件 出现的界面没有 解决方案资源管理器界面 xff0c 如下图所示 xff1a 2 点击顶部的 视图 菜单 xff0c 如下图所示 xff1a 3 打开 视图 后 xff0c 会出现 解决方案资源管理器
  • 雾化器工作原理

    水位控制和偏置电路 电路中的超声换能器 xff34 xff24 xff08 又称雾化头 xff09 和其上 安装的两根水位控制触针 xff0c 他们是浸没在浅水水溶液中工作的 若长期雾化 xff0c 一旦液面降低而使雾化头的水位控制触针露出
  • 数据库复习笔记(全覆盖,包括往年部分真题)

    PS xff1a 大学开始写博客 xff0c 写了三年了 xff0c 虽然大二太忙了 xff0c 专业知识学的潦草 xff0c 也没写太多博客 大三开始写专业课的复习笔记 xff0c 没想到这一篇博文浏览和点赞这么高 xff0c 心里还是挺
  • 马原复习笔记(老师勾画的重点以及相应的习题练习)

    天呐 xff0c 我竟然会来复习马原 xff1f 那必须的 xff01 一心向党 xff0c 争做社会主义好青年 xff0c 当然了 xff0c 这玩意和思修 近代史不一样 xff0c 不记点东西编都不好编是吧 xff0c 加上和之前毛概不
  • zigbee通讯技术复习笔记

    这门课对于我一个学嵌入式的来说 xff0c 还是比较重要的 xff0c 所以我还是以老师给出的大纲为主体 xff0c 好好复习一下 xff01 题型 xff1a 选择题24x1 5 判断10x1 填空15x1 简答4x5 程序1x5 另外一