针对Simplicity Studio 4,EmberZNet协议栈Zigbee3.0设备入网流程

Platform:Simplicity Studio 4、EmberZNet SDK 6.4.1.0

【SPP】Content:

Zigbee3.0设备自定义ZCL数据包发送数据

1、借助zcl-cli.c文件定义的一些变量,构建ZCL数据buffer,在自己的c文件下引用以下几个变量

extern int8u appZclBuffer[EMBER_AF_MAXIMUM_SEND_PAYLOAD_LENGTH];
extern int16u appZclBufferLen;extern int16u mfgSpecificId;
extern int8u disableDefaultResponse;
extern EmberApsFrame globalApsFrame;

2、使用zclBufferSetup函数填充appZclBuffer特殊数据区

void zclBufferSetup(uint8_t frameType, uint16_t clusterId, uint8_t commandId)
{uint8_t index = 0;emAfApsFrameClusterIdSetup(clusterId);appZclBuffer[index++] = (frameType| ZCL_FRAME_CONTROL_CLIENT_TO_SERVER| (mfgSpecificId != EMBER_AF_NULL_MANUFACTURER_CODE? ZCL_MANUFACTURER_SPECIFIC_MASK: 0)| (disableDefaultResponse? ZCL_DISABLE_DEFAULT_RESPONSE_MASK: 0));if (mfgSpecificId != EMBER_AF_NULL_MANUFACTURER_CODE) {appZclBuffer[index++] = (uint8_t)mfgSpecificId;appZclBuffer[index++] = (uint8_t)(mfgSpecificId >> 8);}appZclBuffer[index++] = emberAfNextSequence();appZclBuffer[index++] = commandId;appZclBufferLen = index;
}

例如:(其中 ZCL_XXX_CLUSTER_ID与ZCL_XXX_COMMAND_ID为发送端的cluster与command)

zclBufferSetup(ZCL_CLUSTER_SPECIFIC_COMMAND|ZCL_FRAME_CONTROL_CLIENT_TO_SERVER |ZCL_DISABLE_DEFAULT_RESPONSE_MASK,ZCL_XXX_CLUSTER_ID,ZCL_XXX_COMMAND_ID);

3、使用zclBufferAddByte、zclBufferAddWord、zclBufferAddInt32...函数填充appZclBuffer自定义数据区

void zclBufferAddByte(uint8_t byte)
{appZclBuffer[appZclBufferLen] = byte;appZclBufferLen += 1;
}void zclBufferAddWord(uint16_t word)
{zclBufferAddByte(LOW_BYTE(word));zclBufferAddByte(HIGH_BYTE(word));
}void zclBufferAddInt32(uint32_t value)
{uint8_t i;for (i = 0; i < 4; i++) {zclBufferAddByte(LOW_BYTE(value));value = value >> 8;}
}void zclBufferAddBuffer(const uint8_t *buffer, uint8_t length)
{MEMMOVE(appZclBuffer + appZclBufferLen, buffer, length);appZclBufferLen += length;
}// Made non-to remove warnings
void zclBufferAddString(const uint8_t *buffer)
{zclBufferAddBuffer(buffer, emberAfStringLength(buffer) + 1);
}

4、使用emAfApsFrameEndpointSetup函数设置源与目的端点

void emAfApsFrameEndpointSetup(uint8_t srcEndpoint,uint8_t dstEndpoint)
{globalApsFrame.sourceEndpoint = (srcEndpoint == 0? emberAfPrimaryEndpointForCurrentNetworkIndex(): srcEndpoint);globalApsFrame.destinationEndpoint = dstEndpoint;
}

5、使用组播、广播、单播三种方式其中一种将自定义的appZclBuffer数据发送出去

EmberStatus emberAfSendMulticast(EmberMulticastId multicastId,EmberApsFrame *apsFrame,uint16_t messageLength,uint8_t *message)
{return emberAfSendMulticastWithCallback(multicastId,apsFrame,messageLength,message,NULL);
}EmberStatus emberAfSendBroadcast(EmberNodeId destination,EmberApsFrame *apsFrame,uint16_t messageLength,uint8_t *message)
{return emberAfSendBroadcastWithCallback(destination,apsFrame,messageLength,message,NULL);
}EmberStatus emberAfSendUnicast(EmberOutgoingMessageType type,uint16_t indexOrDestination,EmberApsFrame *apsFrame,uint16_t messageLength,uint8_t *message)
{return emberAfSendUnicastWithCallback(type,indexOrDestination,apsFrame,messageLength,message,NULL);
}

6、应用实例(实现将0x55、0xABCD两个数据单播到协调器)

static EmberStatus zclBufferSendToCoor(void) //发送到协调器
{emAfApsFrameEndpointSetup(1, 1);return emberAfSendUnicast(EMBER_OUTGOING_DIRECT,COORDINATER_NETWORK_ID,&globalApsFrame,appZclBufferLen,appZclBuffer);
}void UnicastFunction(int16u data)
{mfgSpecificId = EMBER_AF_MANUFACTURER_CODE;zclXDefaultRespCommand = TRUE;zclBufferSetup(ZCL_CLUSTER_SPECIFIC_COMMAND,ZCL_XXX_CLUSTER_ID,ZCL_XXX_COMMAND_ID);mfgSpecificId = EMBER_AF_NULL_MANUFACTURER_CODE;zclBufferAddWord(data);if (zclBufferSendToCoor() == EMBER_SUCCESS) //成功{}
}

[Ember Zigbee]Zigbee3.0设备自定义ZCL数据包发送数据相关推荐

  1. 修改我的世界服务器数据包,发送数据包到我的世界服务器:目标c

    我一直在尝试从我的自定义Cocoa应用程序(写在Objective-C当然)发送数据包到我的世界服务器.尽管如此,但我有点困惑.我是用Java做的.这很容易.尽管这样做是客观的,但事实证明它更具挑战性 ...

  2. Linux内核网络数据包发送(二)——UDP协议层分析

    Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...

  3. 分析udp数据报_Linux内核网络udp数据包发送(二)——UDP协议层分析

    1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...

  4. Linux内核网络协议栈:udp数据包发送(源码解读)

    <监视和调整Linux网络协议栈:接收数据> <监控和调整Linux网络协议栈的图解指南:接收数据> <Linux网络 - 数据包的接收过程> <Linux网 ...

  5. Linux内核网络udp数据包发送(二)——UDP协议层分析

    1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...

  6. Linux内核网络数据包发送(四)——Linux netdevice 子系统

    Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...

  7. Linux内核网络数据包发送(三)——IP协议层分析

    Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...

  8. Linux内核网络数据包发送(一)

    Linux内核网络数据包发送(一) 1. 前言 2. 数据包发送宏观视角 3. 协议层注册 4. 通过 socket 发送网络数据 4.1 `sock_sendmsg`, `__sock_sendms ...

  9. Windows下底层数据包发送实战

    为什么80%的码农都做不了架构师?>>>    1.简介 所谓"底层数据包"指的是在"运行"于数据链路层的数据包,简单的说就是"以太 ...

最新文章

  1. python语言入门pdf-Python语言及其应用 中文pdf完整版[13MB]
  2. php-fpm 没有启动脚本,php-fpm服务启动脚本
  3. 软件构造第三章 第五部分
  4. 科大星云诗社动态20210818
  5. java8安装_JMeter必知必会系列(2) JMeter安装部署
  6. Jquery 日历控件
  7. java number string_java基础系列(一):Number,Character和String类及操作
  8. lambda函数+map函数的结合使用 list(map(lambda x: list(x)[0], X))
  9. oracle每季度补丁,Oracle 2020 年第四季度补丁发布
  10. 08_提升方法Boosting1_统计学习方法
  11. SPF,DSPF,RDPF,SPEF and SBPF.
  12. DirectFB 之 FillRectangle 绘制矩形
  13. Excel单个单元格内逗号分割的字符串去重
  14. 计算机显示器模糊,Win10系统下电脑显示器模糊的解决方法
  15. wdf中的两个宏WDF_DECLARE_CONTEXT_TYPE WDF_DECLARE_CONTEXT_TYPE_WITH_NAME
  16. 书名带冒号_冒号_冒号的用法和作用_冒号怎么打_标点符号网
  17. [前端积累]--响应式布局(二)
  18. 元宇宙来了,用好名字好概念赋能中国制造国际营销的初步构想
  19. 2--STM32+USB移植+HID 与AUDIO类MIDI设备组成的复合设备
  20. 姬魔恋战纪送衣服显示服务器繁忙,姬魔恋战纪新手有哪些问题-姬魔恋战纪萌新常见问题汇总_手心游戏...

热门文章

  1. html实现在线展示PDF,html展示 pdf 利器
  2. 牛奶包装袋上的秘密:震惊!喝牛奶的一定看看
  3. 聚焦健康零食?趣拿带你玩转营销!
  4. 五年java开发面经分享,注意这些细节让你offer拿到手软
  5. 发明专利的审查流程及在不同研发场景下何时进入重要节点
  6. GPS报文中经度纬度的表示方法,以及GGA报文的解析
  7. 【Luat-air551G】4 air551G连接esp32获取GGA数据
  8. [编程题]大富翁游戏 美团2017 JAVA
  9. 光耦继电器和普通继电器的区别概述
  10. Dynamic CRM工作流流程实战