前言
- 写不归路前,先鸣谢各位大哥:专哥,龙哥,怪兽哥,临哥,安联德哥等各位zigbee的带头大哥,带我走上了zigbee的不归路。
- 我尽量不插入图片,无线的这个论坛有限制,游客看不了。
基础
- 协议栈版本:zstack home 1.2.2a
SoC方案:CC2530F256
- 标准对接产品:小米的门磁(很多小大哥说小米的不标准,大家理解不同,小米门磁搞的是开关,说标准也是标准,说不标准也行,不逼逼)
- 非标对接产品:自己做的,基于zstack2.5.1a开发的私有协议产品。
疑问
- 我打算在1.2.2a上面注册一个任务,专门处理2.5.1a的非标准产品,我的理解是可行的。
- 新任务中注册新的端点号,因为标准的产品厂家用的是1,我自己的用的是8,这种方向对不对?
- 新任务的无线收发是跳过ZCL的,需要在1.2.2a中有特殊处理吗?还是直接注册新的事件函数就行了?
疑问解答
- 疑问1:方法不对的,因为非标的数据会通过ZCL上报。
- 疑问2:方法也是不靠谱的,因为endpoint最好相同,否则会出现绑定等大坑。
- 疑问3:无线的接收不方便跳过ZCL,无线的发送方便跳过,直接AF。不用注册新事件,直接在ZCL事件中阻止非标zigbee产品的上报。
具体实施步骤:
第一步:通信基础:端点号相同+簇包含+Profile ID相同
1.将自己做的2.5.1a的非标准的产品端点号改成和标准的一样,我这里都是1。
#define SAMPLEAPP_ENDPOINT 1 //2.5.1a的SampleApp.h里面
#define SAMPLELIGHT_ENDPOINT 1 //标准的我的是在zcl_samplelight.h里面
2.将2.5.1a里面用到的输入和输出簇,添加到标准的里面去,切记取值不要和标准的相同。
const cId_t zclSampleLight_InClusterList[] =
{
ZCL_CLUSTER_ID_GEN_BASIC,
ZCL_CLUSTER_ID_GEN_POWER_CFG,
ZCL_CLUSTER_ID_GEN_IDENTIFY,
ZCL_CLUSTER_ID_GEN_GROUPS,
ZCL_CLUSTER_ID_GEN_SCENES,
ZCL_CLUSTER_ID_GEN_ON_OFF,
ZCL_CLUSTER_ID_GEN_ALARMS,
ZCL_CLUSTER_ID_SS_IAS_ZONE,
SAMPLEAPP_PERIODIC_CLUSTERID,
SAMPLEAPP_FLASH_CLUSTERID,
SAMPLEAPP_P2P_CLUSTERID
};
const cId_t zclSampleLight_OutClusterList[] =
{
ZCL_CLUSTER_ID_GEN_BASIC,
ZCL_CLUSTER_ID_GEN_POWER_CFG,
ZCL_CLUSTER_ID_GEN_IDENTIFY,
ZCL_CLUSTER_ID_GEN_GROUPS,
ZCL_CLUSTER_ID_GEN_SCENES,
ZCL_CLUSTER_ID_GEN_ON_OFF,
ZCL_CLUSTER_ID_GEN_ALARMS,
ZCL_CLUSTER_ID_SS_IAS_ZONE,
SAMPLEAPP_PERIODIC_CLUSTERID,
SAMPLEAPP_FLASH_CLUSTERID,
SAMPLEAPP_P2P_CLUSTERID
};
3.非标的profile ID修改成标准的0x0104
#define SAMPLEAPP_PROFID 0x0104 //2.5.1a的SampleApp.h里面
注:
- 完成上面三条后就能接收到数据了,但是数据被ZCL搞去了,出现“ZCL瞎鸡巴解析”,因为你毕竟是自定义的,ZCL并不知道,他还是按照ZCL格式解析,就他妈乱了。
- 整个zigbee的入网流程不需要做任何改动,因为ZCL是应用层的规范。
第二步:自定义协议禁止ZCL解析,完成自定义解析。
待续。。。。
结束
很多初学者问,学习zigbee找谁帮忙,请在论坛发帖留言有问题请加QQ群671139854,里面装逼的zigbee大佬太多,只要能接受大佬的怼,就能解决一切zigbee杂症。