我是靠谱客的博主 热情火龙果,这篇文章主要介绍[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文件下引用以下几个变量

复制代码
1
2
3
4
5
6
extern int8u appZclBuffer[EMBER_AF_MAXIMUM_SEND_PAYLOAD_LENGTH]; extern int16u appZclBufferLen; extern int16u mfgSpecificId; extern int8u disableDefaultResponse; extern EmberApsFrame globalApsFrame;

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)

复制代码
1
2
3
4
5
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自定义数据区

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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函数设置源与目的端点

复制代码
1
2
3
4
5
6
7
8
void emAfApsFrameEndpointSetup(uint8_t srcEndpoint, uint8_t dstEndpoint) { globalApsFrame.sourceEndpoint = (srcEndpoint == 0 ? emberAfPrimaryEndpointForCurrentNetworkIndex() : srcEndpoint); globalApsFrame.destinationEndpoint = dstEndpoint; }

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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两个数据单播到协调器)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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数据包发送数据的全部内容,更多相关[Ember内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部