再谈ZigBee中的绑定机制

ZigBee四种绑定方式 立即下载
再谈ZigBee中的绑定机制  2012-05-22 16:38:23

分类:

原文地址:再谈ZigBee中的绑定机制 作者:frankzfz

这里主要再讨论一下绑定的机制,绑定是ZigBee中应该是比较重要的一个部分。前面的几篇文章也对绑定有了具体的分析,主要分析了两种绑定方式,介绍了绑定的流程,源代码方面。这里主要是理清整个绑定在组网中的概念。绑定是和EndPoint紧密联系在一起的,其中很多是自己通过看资料,自己的一些理解,当中肯定有不正确的地方,欢迎有兴趣的一起讨论。

ZigBee中还有一个重要的概念端点,理解的不是很清楚,现在再一次总结分析一下,端点是应用对象存在的地方,ZigBee允许多个应用同时位于一个节点上,例如一个节点具有控制灯光的功能,又具有感应温度的功能,又具有收发文本消息的功能,这种设计有利于复杂ZigBee设备的出现。我们可以从ZigBee的体系结构图中可以看到可以有240个应用,也就是说一个物理的ZigBee设备的话,可以有240个具体的应用,例如上面提到的其中的三种具体的应用。

一共有二个特殊的端点,即端点0和端点255。端点0用于整个ZigBee设备的配置和管理。应用程序可以透过端点0与ZigBee堆栈的其它层通讯,因而实现对这些层的初始化和配置。附属在端点0的对象被称为ZigBee设备对象(ZDO)。端点255用于向所有端点的广播。端点241到254是保留端点。 
    
所有端点都使用应用支持子层(APS)提供的服务。APS透过网络层和安全服务提供层与端点相接,并为数据传送、安全和固定服务,因此能够适配不同但兼容的设备,如带灯的开关。 下面是终端的描述符的结构体定义。

typedef struct
{

byte endPoint; //EP号
byte *task_id; // 
指向任务编号的指针.
SimpleDescriptionFormat_t *simpleDesc; //
设备的简单描述
afNetworkLatencyReq_t latencyReq;      //
枚举类型
} endPointDesc_t;

//设备的简单描述结构
typedef struct

{
byte    EndPoint;             //EPID
uint16 AppProfId;            // Profile ID
uint16 AppDeviceId;          // Device ID
byte    AppDevVer:4;         // Device Version
byte    Reserved:4; //AF_V1_SUPPORT uses for AppFlags:4. Reserved
byte    AppNumInClusters;    //输入命令个数
cId_t   *pAppInClusterList;    //
输入命令列表
byte    AppNumOutClusters;   //
输出命令个数
cId_t   *pAppOutClusterList;   //
输出命令列表
} SimpleDescriptionFormat_t;

下面是在SerialApp程序中简单描述符的定义。

const SimpleDescriptionFormat_t SerialApp_SimpleDesc =

{

  SERIALAPP_ENDPOINT,              //  int   Endpoint;

  SERIALAPP_PROFID,                //  uint16 AppProfId[2];

  SERIALAPP_DEVICEID,              //  uint16 AppDeviceId[2];

  SERIALAPP_DEVICE_VERSION,        //  int   AppDevVer:4;

  SERIALAPP_FLAGS,                 //  int   AppFlags:4;

  SERIALAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;

  (cId_t *)SerialApp_ClusterList,  //  byte *pAppInClusterList;

  SERIALAPP_MAX_CLUSTERS,          //  byte  AppNumOutClusters;

  (cId_t *)SerialApp_ClusterList   //  byte *pAppOutClusterList;

};

 

const endPointDesc_t SerialApp_epDesc =

{

  SERIALAPP_ENDPOINT,

 &SerialApp_TaskID,

  (SimpleDescriptionFormat_t *)&SerialApp_SimpleDesc,

  noLatencyReqs

};

     在TI给的例子中都只是定义了一个端点,猜想是不是每一个应用中都必须有一个相应的端点,也就会有一个相应的端点描述符。例如这里的三个应用,一个节点具有控制灯光的功能,又具有感应温度的功能,又具有收发文本消息的功能,那么需要占用三个端点号,也就会需要三个端点的描述符,因为在发送数据的函数中会用到这个端点的描述符。

AF_DataRequest( &SerialApp_RspDstAddr,

               (endPointDesc_t *)&SerialApp_epDesc,

               SERIALAPP_CLUSTERID2,

               SERIAL_APP_RSP_CNT, rspBuf,

               &SerialApp_MsgID, 0, AF_DEFAULT_RADIUS );

    在绑定的应用中必须要用到端点的描述符,可不可以这样理解就是说,在绑定时其实并不是两个设备之间的绑定,其实质是在这两个设备上两个端点之间的绑定,再进一步说就是两个应用之间的绑定,因为在一个终端中可能有很多的应用,也就是端点,可不以在一个端点中只和其中的一个应用进行绑定,也就是只和其中的一个端点进行绑定,其他的端点可以使用别的地址方式,如直接地址模式,或者是广播地址的方式,进行数据的处理。虽然和同一个设备进行了绑定,但是其中的应用并不相同。描述符匹配是不是就是这个意思。如果两个设备没有相同的描述符是不会绑定成功的。

case Match_Desc_rsp:

      {

        ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );

        if ( pRsp )

        {

          if ( pRsp->status == ZSuccess && pRsp->cnt )

          {

            SerialApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;

            SerialApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;

            // Take the first endpoint, Can be changed to search through endpoints

            SerialApp_DstAddr.endPoint = pRsp->epList[0];

           

            // Light LED

            HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );

          }

          osal_mem_free( pRsp );

        }

      }

      Break;

    在下面的函数中是绑定必须要执行一个处理函数,这个函数就是处理和回应对Match_Desc_req 消息。这个函数在绑定的第三篇文章中也有分析到。

void ZDO_ProcessMatchDescReq( zdoIncomingMsg_t *inMsg )

{

  uint8 epCnt = 0;

  uint8 numInClusters;

  uint16 *inClusters = NULL;

  uint8 numOutClusters;

  uint16 *outClusters = NULL;

  epList_t *epDesc;

  SimpleDescriptionFormat_t *sDesc = NULL;

  uint8 allocated;

  uint8 *msg;

  uint16 aoi;

  uint16 profileID;

 

  // Parse the incoming message

  msg = inMsg->asdu;

  aoi = BUILD_UINT16( msg[0], msg[1] );

  profileID = BUILD_UINT16( msg[2], msg[3] );

  msg += 4;

 

  if ( ADDR_BCAST_NOT_ME == NLME_IsAddressBroadcast(aoi) )

  {

    ZDP_MatchDescRsp( inMsg->TransSeq, &(inMsg->srcAddr), ZDP_INVALID_REQTYPE,

                          ZDAppNwkAddr.addr.shortAddr, 0, NULL, inMsg->SecurityUse );

    return;

  }

  else if ( (ADDR_NOT_BCAST == NLME_IsAddressBroadcast(aoi)) && (aoi != ZDAppNwkAddr.addr.shortAddr) )

  {

    ZDP_MatchDescRsp( inMsg->TransSeq, &(inMsg->srcAddr), ZDP_INVALID_REQTYPE,

                             ZDAppNwkAddr.addr.shortAddr, 0, NULL, inMsg->SecurityUse );

    return;

  }

 

  numInClusters = *msg++;

  if ( numInClusters )

  {

    inClusters = (uint16*)osal_mem_alloc( numInClusters * sizeof( uint16 ) );

    msg = ZDO_ConvertOTAClusters( numInClusters, msg, inClusters );

  }

  numOutClusters = *msg++;

  if ( numOutClusters )

  {

    outClusters = (uint16 *)osal_mem_alloc( numOutClusters * sizeof( uint16 ) );

    msg = ZDO_ConvertOTAClusters( numOutClusters, msg, outClusters );

  }

 

 /* First count the number of endpoints that match.

typedef struct

{

  endPointDesc_t *epDesc;

  eEP_Flags flags;

  pDescCB  pfnDescCB;     // Don't use if this function pointer is NULL.

  void *nextDesc;

} epList_t;

*/

  epDesc = epList;

  while ( epDesc )//扫描本节点的全部EP,看是否有匹配的?这个是一个链表的形式存储的。

  {

    // Don't search endpoint 0 and check if response is allowed //不扫描端点0

    if ( epDesc->epDesc->endPoint != ZDO_EP && (epDesc->flags&eEP_AllowMatch) )

    {

      if ( epDesc->pfnDescCB )

      {

        sDesc = (SimpleDescriptionFormat_t *)epDesc->pfnDescCB( AF_DESCRIPTOR_SIMPLE, epDesc->epDesc->endPoint );

        allocated = TRUE;

      }

      else

      {

        sDesc = epDesc->epDesc->simpleDesc;

        allocated = FALSE;

      }

 

      if ( sDesc && sDesc->AppProfId == profileID )//如果profileID相同,这里也就说明了为什么会在绑定的时候要求profileID相同了。sDesc不为空的话,     

 {                                                                      

      {

        uint8 *uint8Buf = (uint8 *)ZDOBuildBuf;

        // If there are no search input/ouput clusters – respond

/在这里对EP中的输入/输出簇列表进行了比较,也就是ZDP_MatchDescReq发送来的,SerialApp_ClusterList

        if ( ((numInClusters == 0) && (numOutClusters == 0))

            // Are there matching input clusters?

             || (ZDO_AnyClusterMatches( numInClusters, inClusters,

                  sDesc->AppNumInClusters, sDesc->pAppInClusterList ))

            // Are there matching output clusters?

             || (ZDO_AnyClusterMatches( numOutClusters, outClusters,

                  sDesc->AppNumOutClusters, sDesc->pAppOutClusterList ))     )

        {

          // Notify the endpoint of the match. 通知终端匹配

          uint8 bufLen = sizeof( ZDO_MatchDescRspSent_t ) + (numOutClusters + numInClusters) * sizeof(uint16);

          ZDO_MatchDescRspSent_t *pRspSent = (ZDO_MatchDescRspSent_t *) osal_msg_allocate( bufLen );

 

          if (pRspSent)

          {

            pRspSent->hdr.event = ZDO_MATCH_DESC_RSP_SENT;

            pRspSent->nwkAddr = inMsg->srcAddr.addr.shortAddr;

            pRspSent->numInClusters = numInClusters;

            pRspSent->numOutClusters = numOutClusters;

 

            if (numInClusters)

            {

              pRspSent->pInClusters = (uint16*) (pRspSent + 1);

              osal_memcpy(pRspSent->pInClusters, inClusters, numInClusters * sizeof(uint16));

            }

            else

            {

              pRspSent->pInClusters = NULL;

            }

 

            if (numOutClusters)

            {

              pRspSent->pOutClusters = (uint16*)(pRspSent + 1) + numInClusters;

              osal_memcpy(pRspSent->pOutClusters, outClusters, numOutClusters * sizeof(uint16));

            }

            else

            {

              pRspSent->pOutClusters = NULL;

            }

            osal_msg_send( *epDesc->epDesc->task_id, (uint8 *)pRspSent );

          }

          uint8Buf[epCnt++] = sDesc->EndPoint;// 匹配EndPoint列表,这个就是Match_Desc_rsp回传的内容之一

        }

      }

      if ( allocated )

        osal_mem_free( sDesc );

    }

    epDesc = epDesc->nextDesc;

  }

 

  // Send the message only if at least one match found. 如果发现至少有一个匹配的以后,发送匹配消息

  if ( epCnt )

  {

    if ( ZSuccess == ZDP_MatchDescRsp( inMsg->TransSeq, &(inMsg->srcAddr), ZDP_SUCCESS,

              ZDAppNwkAddr.addr.shortAddr, epCnt, (uint8 *)ZDOBuildBuf, inMsg->SecurityUse ) )

    {

#if defined( LCD_SUPPORTED )

      HalLcdWriteScreen( "Match Desc Req", "Rsp Sent" );

#endif

    }

  }

  else

  {

#if defined( LCD_SUPPORTED )

    HalLcdWriteScreen( "Match Desc Req", "Non Matched" );

#endif

  }

 

  if ( inClusters )

    osal_mem_free( inClusters );

  if ( outClusters )

    osal_mem_free( outClusters );

}

     从上面的代码内容中也可以看到,当两个节点绑定时,进行的匹配实质是描述符之间的匹配。当然绑定时可能有多个的描述符的匹配,不知道我这样的理解是否正确,如果网友有这方面的经验欢迎讨论一下!!

这里还有一点就是绑定服务只能在“互补”设备之间建立。那就是,只有分别在两个节点的简单描述结构体(simple descriptor structure)中,同时注册了相同的命令标识符(command_id)并且方向相反(一个属于输出指令“output”,另一个属于输入指令“input”),才能成功建立绑定。

通过查看TI给我例子程序中,只有开头的例程才算是真正意义上的一个是输出,一个是输入。

对于灯结点是输入,

const cId_t zb_InCmdList[NUM_IN_CMD_CONTROLLER] =

{

  TOGGLE_LIGHT_CMD_ID

};

 

// Define SimpleDescriptor for Switch device

const SimpleDescriptionFormat_t zb_SimpleDesc =

{

  MY_ENDPOINT_ID,             //  Endpoint

  MY_PROFILE_ID,              //  Profile ID

  DEV_ID_CONTROLLER,          //  Device ID

  DEVICE_VERSION_CONTROLLER,  //  Device Version

  0,                          //  Reserved

  NUM_IN_CMD_CONTROLLER,      //  Number of Input Commands

  (cId_t *) zb_InCmdList,     //  Input Command List

  NUM_OUT_CMD_CONTROLLER,     //  Number of Output Commands

  (cId_t *) NULL              //  Output Command List

};

对于开关结点是输出。

const cId_t zb_OutCmdList[NUM_OUT_CMD_SWITCH] =

{

  TOGGLE_LIGHT_CMD_ID

};

 

// Define SimpleDescriptor for Switch device

const SimpleDescriptionFormat_t zb_SimpleDesc =

{

  MY_ENDPOINT_ID,             //  Endpoint

  MY_PROFILE_ID,              //  Profile ID

  DEV_ID_SWITCH,              //  Device ID

  DEVICE_VERSION_SWITCH,      //  Device Version

  0,                          //  Reserved

  NUM_IN_CMD_SWITCH,          //  Number of Input Commands

  (cId_t *) NULL,             //  Input Command List

  NUM_OUT_CMD_SWITCH,         //  Number of Output Commands

  (cId_t *) zb_OutCmdList               //  Output Command List

};

     可以在GenericApp和 SerialApp的例程中看到,并没有严格的按照这样的命令来。例如下面的SampleApp例程中,当然这样也是两个设备中的命令也是相反的,只是没有开关那个例程中更加直观,

const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =

{

  GENERICAPP_CLUSTERID

};

 

const SimpleDescriptionFormat_t GenericApp_SimpleDesc =

{

  GENERICAPP_ENDPOINT,              //  int Endpoint;

  GENERICAPP_PROFID,                //  uint16 AppProfId[2];

  GENERICAPP_DEVICEID,              //  uint16 AppDeviceId[2];

  GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;

  GENERICAPP_FLAGS,                 //  int   AppFlags:4;

  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;

  (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;

  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;

  (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList;

};

       APS绑定表是在静态RAM中定义的一张表,定义在nwk_globals.c中。表的大小可以通过f8wConfig.cfg中的

/* Maximum number of entries in the Binding table. */

-DNWK_MAX_BINDING_ENTRIES=10

 

/* Maximum number of cluster IDs for each binding table entry. */

-DMAX_BINDING_CLUSTER_IDS=5

只有定义了REFLECTOR或者COORDINATOR_BINDING才能包含此表,用REFLECTOR编译选项来支持APS层的源绑定。

邦定表结构 – BindingEntry_t

typedef struct

{

  uint16 srcIdx;        // Address Manager index

  uint8 srcEP;

  uint8 dstGroupMode;   // Destination address type; 0 - Normal address index, 1 -  

                        // Group address

  uint16 dstIdx;        // This field is used in both modes (group and non-group) to 

                        // save NV and RAM space                         

                        // dstGroupMode = 0 - Address Manager index

                        // dstGroupMode = 1 - Group Address

  uint8 dstEP;

  uint8 numClusterIds;

  uint16 clusterIdList[MAX_BINDING_CLUSTER_IDS];

                      // Don't use MAX_BINDING_CLUSTERS_ID when

                      // using the clusterIdList field.  Use

                      // gMAX_BINDING_CLUSTER_IDS

} BindingEntry_t;

srcIdx –源地址(绑定记录的源地址)的地址管理器索引,地址管理器保存着源地址的IEEE地址和短地址。

srcEP -源终端

dstGroupMode    -目的地址类型。

    0   普通地址

    1   组地址

dstIdx  -若dstGroupMode为0,则包含目的地址的地址管理器索引,若dstGroupMode为1,则包含目的组地址

dstEP   -目的终端

numClusterIds   -clusterIdList中的入口数目

clusterIdList   -簇ID列表。列表的最大数目定义由MAX_BINDING_CLUSTER_IDS [f8wConfig.cfg]指定

           还有一点就是绑定设备之间的通信方式更加的灵活,这主要体现在那里呢我想可能有下面几个原因,一是在前面也有介绍绑定有四种方式,主要介绍了两种一种是通过协调器,另一种是不通过协调器的绑定,这样可选择性多,但使用点对点的通信时,必须要通过IEEE地址得到网络中的短地址,也必须借助协调器进行,协调器的短地址是知道。第二个原因时:绑定也可以实现一对多的绑定,也就是相当于了组广播了,第三,绑定有较多的API操作进行,当终端结点离开或者有一个新的设备加入网络时,可以主动完成绑定过程,

绑定的分析就到这里吧。如果有什么不对的地方,欢迎一起讨论。

基于Java+SpringBoot+Vue的中小企业设备管理系统的设计与开发(源码+lw+部署文档+讲解等) 💗博主介绍:✌新人博主,工作经验两年+、专注于Java、小程序技术领域和毕业项目实战✌💗🌟文末获取源码+数据库🌟 阅读详情

相关推荐

4D 毫米波雷达:智驾普及的新路径(一)

总体而言,4D 毫米波雷达具有更佳的探测能力,更高的分辨率和精度,在人工智能技术的加持下,能够实现更加智能化的感知和跟踪,从而为自动驾驶、智能交通等领域提供更加可靠的数据支持。博世的第五代引入了俯仰维度,但其角度分辨率较差,且最大探测距离为。车载毫米波雷达的尺寸受限,我们认为通过算法的优化、天线内置等方式可以在保障性能的前提下,压缩尺寸,便于车企进行灵活的设计安装。在物理设计、天线性能设计、电连接、封装工艺和材料、散热处理、可靠性与自动化测试等方面进行持续优化,推出可大规模量产的高性能毫米波雷达解决方案。

奔袭的算法工程师 3954

重谈Zigbee的绑定问题

重谈Zigbee的绑定问题         注:本文档以TI的2.3.1协议栈和CC2530为基础。 绑定是Zigbee中非常重要的一个概念,想必大家都看了很多文章,其中以“Zigbee四种绑定方式在TI_Z-Stack

tanqiuwei的专栏 7352

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 89

绑定

http://download.youkuaiyun.com/detail/yichenfeixue/6014261 一、绑定(Binding) 绑定是一种控制两个或者多个设备应用层之间信息流传递的机制。在ZigBee2006发布版本中,它被称为源绑定,所有的设备都可以执行绑定机制。 绑定允许应用程序发送一个数据包而不需要知道目标设备的短地址(此时将目标设备的短地址设置为无效地址0xFFFE

诺尔曼 864

CORS(跨域资源共享)漏洞解决方法

最近,测试环境上的项目被360测试人员检测出来有一个CORS漏洞,以下记录下漏洞问题与解决方法。 一、低危漏洞:CORS漏洞问题 测试人员访问某个url,将请求头中的Origin字段修改为任意值,结果仍然能获得正确的响应报文,就说明有CORS漏洞。 当CORS的设置不正确时,就会带来安全问题;当响应头中的Access-Control-Allow-Origin设置为null或*时,表示信任任何域,这时候就可能引入安全问题。 修复方法是合理配置CORS,判断Origin是否合法;具体说就是不让在nginx或t

BHSZZY的博客 3万+

《统计学习方法》——李航 学习大纲

最近在学习李航写的统计学习方法概论, 每一章都用xmind理清了思路,括号里是书里的公式,第一次写博文,敬请指教~~~~ 第一章 统计学习方法论 第二章 感知机 每个方法其实只需要着重掌握三要素和输入输出就可以了,主要看模型、策略和算法。 感知机主要是二类分类的线性分类模型。 看到后面会注意感知机和支持向量机的区别。 第三章 k近

wjy619251334的博客 1万+

学习zigbee入门-7

【转】学习zigbee入门-7 --------------Z-Stack 指导 2        上节介绍了很大一部分 Z-Stack 的基础知识,这里接着忽悠。虽然说的不是很专业也不是很通俗,但是我尽力了,希望有人能看明白!本人英文水平有限,翻译的不好请谅解!  3、绑定         绑定是控制信息从一个应用层到另一个应用层流动的一种机制。在 zigbee06 版本中,

xiao11xiang123的专栏 760

5个IO口驱动188数码管:查理复用算法在TM52F1363上的极致应用

本文深入解析了如何利用查理复用算法,在TM52F1363单片机上仅用5个IO口驱动188数码管。通过精密的硬件连接与软件时序控制,结合高阻态和动态扫描策略,实现了在极致资源限制下的稳定显示,为成本敏感型嵌入式产品提供了高效的IO复用解决方案。

numpy6sculptor的博客 477

绑定机制(转自天运科技)

一、绑定(Binding) 绑定是一种控制两个或者多个设备应用层之间信息流传递的机制。在ZigBee2006发布版本中,它被称为源绑定,所有的设备都可以执行绑定机制。 绑定允许应用程序发送一个数据包而不需要知道目标设备的短地址(此时将目标设备的短地址设置为无效地址0xFFFE)。应用支持子层(APS)从它的绑定表中确定目标设备的短地址,然后将数据发送给目标应用或者目标组。如果在绑定表中

doudoududu1314的博客 916

【声呐技术】基于人工智能的拖曳阵声呐声学数据处理系统 SEA公司AI辅助拖曳阵系统

KraitSense是SEA公司开发的紧凑型被动拖曳阵声呐系统,核心传感器为KraitArray细线拖曳阵列。该系统专为小型舰艇、无人水面艇(USV)和无人潜航器(UUV)设计,通过人工智能与机器学习技术实现水下声学数据的自动化采集、处理与分类。系统与Mind Foundry公司开发的软件平台深度集成,形成端到端的智能反潜战(ASW)解决方案。

u012133341的博客 957

微信小程序 - 详细解决map地图上使用自定义图标图片或自定义样式进行markers标记点,手机真机运行时安卓系统、苹果ios系统会出现不显示标记点的问题(大概率安卓正常显示标记点,但苹果就加载失败)

微信小程序,map,地图组件,安卓android,苹果ios,真机调试,marker,标记点,在地图上标记,突然就不显示白屏了没动代码,自定义标记点icon,label动态数字,小程序地图markers标记点显示不出来,微信小程序map组件,地图加载后marker标记点ios设备不显示,android正常显示,添加多个标记点。安卓能正常显示标记点图标,IOS设备不显示标记点图标,map地图白屏不显示标记,图标真机调试不显示,自定义图标,报错,页面白屏,不报错也不显示,无法加载,图片展示不出来,iconPat

✅ 精选推荐文章 5956

zigbee2mqtt设备绑定:Bind模块的实现原理与使用技巧

在Zigbee智能家居网络中,设备绑定(Binding)是一个核心功能,它允许设备之间直接通信,无需通过协调器(Coordinator)中转。想象一下这样的场景:你希望按下墙上的智能开关时,客厅的智能灯立即响应,而不是经过服务器中转——这就是绑定的价值所在。 zigbee2mqtt的Bind模块实现了这一关键功能,本文将深入解析其实现原理,并提供实用的使用技巧。 ## Bind模块架构解析 ...

gitblog_00391的博客 1212

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lesson 12 Zigbee绑定通信

最后调用发送函数,以绑定的方式发送(绑定的时候发送指定函数中的配置信息有:接收模块的接收端点、接收簇,发送模块的发送端点,发送模块的网络地址。不指定接收模块的地址相关信息)。在发送时,首先查看绑定表,如果绑定表中的内容与发送函数中指定的信息相匹配,再去查看地址管理器的MAC与绑定表中的MAC是否一致,如果一致,就将地址管理器中的网络短地址作为目标地址,最后将数据包发送过去。其中函数的第一个参数是发送方端点,第二个参数是接收方簇,第三个参数是接收模块MAC的地址相关信息结构体地址,第四个变量是接收方的端点。

qq_25218501的博客 1789

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

zigbee 绑定表的应用

一、 绑定 本文是作者根据TI Z-Stack开发文档,ZigBee Specification-2007,《Zigbee WirelessNetworking》等英文资料整合和翻译而成,采用中英双语对照方便读者理解,文中翻译不当之处,望广大同行不吝赐教。推广ZigBee技术,提高国内电子行业的国际影响力,是我们无线通讯工程师的愿景。本文欢迎转载,请保留作者信息和出处,作为支持我继续努力前行的动力,谢谢! E-mail:kuangjunbin@gmail.com ZigBee2006版本中规定,在全部节点

weixin_43150094的博客 1284

zigbee 绑定表

绑定(Binding)是一种控制两个或者多个设备应用层之间信息流传递的机制。绑定允许应用程序发送一个数据包而无需知道目标地址的16位短地址(此时目标设备短地址设置为无效地址0xFFFE),应用支持子层APS从绑定表中自动获得目标设备的短地址,从而将数据顺利发送到目标节点的一个或者多个应用服务乃至分组。   说明:绑定是基于设备应用层端点的绑定,只能在互为补充的设备间被创建。即被绑定的两个设备必须在其简单描述符结构中登记为相同的命令ID,且其中一个设备作为输入,另一个设备作为输出。 概述 1.1. 概念   

weixin_43150094的博客 857

ZigBee的 四种绑定方法简介

绑定是Zigbee中非常重要的一个概念,想必大家都看了很多文章,其中以“Zigbee四种绑定方式在TI_Z-Stack协议栈中的应用”最为典型,此文我也读过几遍,收货颇丰。此外飞比(Feibit)论坛上也有帖子讲解了EndDeviceBinding蛋疼的传来传去机理,分析的也相当透彻。我这里不在想解释具体的各种绑定方式的代码实现和机制,而是简单说明一下各种绑定机制的特点,希望大家能够从应...

aobianji2097的博客 354

zigbee绑定问题

(By   kennan, 2011.7.23) 注:本文档以TI的2.3.1协议栈和CC2530为基础。 绑定是Zigbee中非常重要的一个概念,想必大家都看了很多文章,其中以“Zigbee四种绑定方式在TI_Z-Stack协议栈中的应用”最为典型,此文我也读过几遍,收货颇丰。此外飞比(Feibit)论坛上也有帖子讲解了EndDeviceBinding蛋疼的传来传去机理,分析的也相当透彻

yeshuming的专栏 1075

绑定(Binding)——ZigBee协议栈Z-Stack开发指南

绑定是一种两个(或者多个)应用设备之间信息流的控制机制。在ZigBee2006发布版本中,它被称为资源绑定,所有的设备都必须执行绑定机制。 绑定允许应用程序发送一个数据包而不需要知道目标地址。APS层从它的绑定表中确定目标地址,然后将数据继续向目标应用或者目标组发送。 注意:

skyxfire的专栏 4187

Zigbee绑定流程

http://hi.baidu.com/lee112168/item/a4ff46adcf676f2d020a4df6 Zigbee绑定流程(一)   绑定机制允许一个应用服务在不知道目标地址的情况下向对方(应用服务)发送数据包,发送时使用的目标地址将由应用支持子层从绑定表中自动获得,从而能是消息顺利被目标节点的一个或多个应用服务乃至分组接收。 注意:由于所有绑定信息都子啊在Zigbe

tanqiuwei的专栏 1万+

ZigBee ZDP API实战:设备发现与绑定机制深度解析

在物联网无线通信领域,设备自组织网络是实现智能互联的基础技术。其核心原理在于设备能够自动发现彼此、协商服务并建立稳定的通信链路,从而构建无需人工干预的分布式系统。这一机制的技术价值在于大幅降低了大规模设备部署与维护的复杂度,是实现智能家居、工业传感等场景的关键。具体到ZigBee协议栈,ZigBee Device Profile(ZDP)层提供了一套标准化的API,封装了底层的设备发现、服务匹配与绑定管理流程。通过调用ZDP API,开发者可以高效实现设备间的“社交”协议,例如让传感器自动找到网关、开关与灯

weixin_29889665的博客 245

ZigBee四种绑定方式在TI Z-Stack中的应用

BINDING   KuangJunBin:本文是作者根据TI Z-Stack开发文档,ZigBee Specification-2007,《Zigbee Wireless Networking》等英文资料整合和翻译而成,采用中英双语对照方便读者理解,文中翻译不当之处,望广大同行不吝赐教。推广ZigBee技术,提高国内电子行业的国际影响力,是我们无线通讯工程师的愿景。本文欢迎转载,

snakel989的专栏 690

ZigBee PRO网络架构解析:ZDO、路由与绑定机制实战指南

在物联网无线通信领域,网状网络技术通过多跳中继实现了广覆盖与高可靠性。其核心原理在于分层协议栈设计,物理层负责无线信号收发,网络层实现动态路由寻址,应用层则管理设备间的逻辑连接。这种架构的技术价值在于提供了自组织、自修复的通信能力,特别适用于智能家居、工业传感等低功耗、多设备场景。ZigBee PRO作为该技术的成熟实现,其ZigBee设备对象(ZDO)充当了网络管理的核心枢纽,负责设备入网、服务发现等关键任务。同时,其智能路由机制能动态发现最优路径,而绑定机制则在应用层建立了稳定的逻辑连接,简化了设备间交

weixin_30983965的博客 241

Zigbee复习

Zigbee复习 CC2530数据帧基本结构由三部分构成:同步头、需要传输的数据、帧尾; 中国使用的Zigbee工作频段是2.4GHz,定义16信道; 在Zigbee协议架构中属于IEEE802.15.4标准定义的是**(物理层和MAC层)**; Zigbee技术特点是:低功耗、低成本、大容量、可靠、时延短、灵活的网络拓扑结构; 信息管理API函数: osal_msg_allocate(); ...

weixin_43871310的博客 4790
上一篇: ZigBee 2007中绑定的理解
下一篇: Zigbee中无线节点和端点的解释
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值