天天看点

Zstack home 1.2.2a兼容对接ZHA标准设备和2.5.1a私有设备

关注嘉友创科技公众号

前言

  • 写不归路前,先鸣谢各位大哥:专哥,龙哥,怪兽哥,临哥,安联德哥等各位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[] =

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杂症。

争取早日走完这条不归路。