[Ember Zigbee]Zigbee3.0设备自定义ZCL数据包发送数据
针对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数据包发送数据相关推荐
- 修改我的世界服务器数据包,发送数据包到我的世界服务器:目标c
我一直在尝试从我的自定义Cocoa应用程序(写在Objective-C当然)发送数据包到我的世界服务器.尽管如此,但我有点困惑.我是用Java做的.这很容易.尽管这样做是客观的,但事实证明它更具挑战性 ...
- Linux内核网络数据包发送(二)——UDP协议层分析
Linux内核网络数据包发送(二)--UDP协议层分析 1. 前言 2. `udp_sendmsg` 2.1 UDP corking 2.2 获取目的 IP 地址和端口 2.3 Socket 发送:b ...
- 分析udp数据报_Linux内核网络udp数据包发送(二)——UDP协议层分析
1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...
- Linux内核网络协议栈:udp数据包发送(源码解读)
<监视和调整Linux网络协议栈:接收数据> <监控和调整Linux网络协议栈的图解指南:接收数据> <Linux网络 - 数据包的接收过程> <Linux网 ...
- Linux内核网络udp数据包发送(二)——UDP协议层分析
1. 前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调 ...
- Linux内核网络数据包发送(四)——Linux netdevice 子系统
Linux内核网络数据包发送(四)--Linux netdevice 子系统 1. 前言 2. `dev_queue_xmit` and `__dev_queue_xmit` 2.1 `netdev_ ...
- Linux内核网络数据包发送(三)——IP协议层分析
Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...
- Linux内核网络数据包发送(一)
Linux内核网络数据包发送(一) 1. 前言 2. 数据包发送宏观视角 3. 协议层注册 4. 通过 socket 发送网络数据 4.1 `sock_sendmsg`, `__sock_sendms ...
- Windows下底层数据包发送实战
为什么80%的码农都做不了架构师?>>> 1.简介 所谓"底层数据包"指的是在"运行"于数据链路层的数据包,简单的说就是"以太 ...
最新文章
- python语言入门pdf-Python语言及其应用 中文pdf完整版[13MB]
- php-fpm 没有启动脚本,php-fpm服务启动脚本
- 软件构造第三章 第五部分
- 科大星云诗社动态20210818
- java8安装_JMeter必知必会系列(2) JMeter安装部署
- Jquery 日历控件
- java number string_java基础系列(一):Number,Character和String类及操作
- lambda函数+map函数的结合使用 list(map(lambda x: list(x)[0], X))
- oracle每季度补丁,Oracle 2020 年第四季度补丁发布
- 08_提升方法Boosting1_统计学习方法
- SPF,DSPF,RDPF,SPEF and SBPF.
- DirectFB 之 FillRectangle 绘制矩形
- Excel单个单元格内逗号分割的字符串去重
- 计算机显示器模糊,Win10系统下电脑显示器模糊的解决方法
- wdf中的两个宏WDF_DECLARE_CONTEXT_TYPE WDF_DECLARE_CONTEXT_TYPE_WITH_NAME
- 书名带冒号_冒号_冒号的用法和作用_冒号怎么打_标点符号网
- [前端积累]--响应式布局(二)
- 元宇宙来了,用好名字好概念赋能中国制造国际营销的初步构想
- 2--STM32+USB移植+HID 与AUDIO类MIDI设备组成的复合设备
- 姬魔恋战纪送衣服显示服务器繁忙,姬魔恋战纪新手有哪些问题-姬魔恋战纪萌新常见问题汇总_手心游戏...