c - Z-wave 协议(protocol)与 C : Questions about Z-wave frame structure & programming in general

标签 c networking packet z-wave

(在我问我的问题之前;我真的不知道是否有人可以回答我的问题,因为 Z-wave 协议(protocol)应该是 secret 信息,但如果它确实违反了任何类型的法规,那么我会觉得免费删除此帖子。)

我目前正在尝试编写一个 C 程序,它简单地构造一个由原始二进制数据组成的 Z-wave 消息,然后将该消息发送到连接 Z-wave Controller 的 USB 接口(interface)(我正在使用 AEOTEC Z- Aeon Labs 的 Stick USB 加密狗)。我也在使用 this指南作为引用,并尝试用纯 C 语言重写示例代码。但是,如果您查看指南,特别是他试图发送到 USB Controller 的消息:

/*
0x01, 0x09, 0x00, 0x13, nodeId, 0x03, 0x20, 0x01, state, 0x05, checksum
*/

...也许只是我的问题,但似乎缺少来自通常 Z 波框架的一些信息。我的猜测是前 4 个字节代表 Home ID,后跟节点 ID,但我无法弄清楚之后的“0x03”是什么意思,假设该字节之后的其余部分代表“基本”命令类(' 0x20',1 字节)和相应的“设置”应用命令('0x01',1 字节)。校验和位之前的“0x05”代表什么?那么传输 header 信息呢,为什么不包括在内?似乎他不需要包含它……或者我只是完全错误地解释了数据包。谁能赐教一下?

另外,如果您从 USB 端口读取数据(例如,使用 C 中的 open() 和 read() 命令),您只能从 USB 端口检索应用层信息,这是否正确?

提前致谢!

最佳答案

我认为通过学习您可以节省大量时间和精力OpenZWave's source code .这是一个用于 ZWave 的开源 C++ 库,它非常成熟且功能齐全。您可以从纯 C 轻松使用它。

您要问的部分内容可以在 Msg class constructor 中看到它构造帧的开始(0x01),然后是消息长度(0x09 == 9 字节)、消息类型(0x00 == REQUEST)和函数(FUNC_ID_ZW_SEND_DATA == 0x013),然后是目标节点 ID,然后是实际节点 ID命令体,我想这是一个基本命令:

./src/Defs.h:#define COMMAND_CLASS_BASIC 0x20:

bool Basic::SetValue
...
            Msg* msg = new Msg( "BasicCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true );
            msg->SetInstance( this, _value.GetID().GetInstance() );
            msg->Append( GetNodeId() );
            msg->Append( 3 );
            msg->Append( GetCommandClassId() );
            msg->Append( BasicCmd_Set );
            msg->Append( value->GetValue() );
            msg->Append( GetDriver()->GetTransmitOptions() );
            GetDriver()->SendMsg( msg, Driver::MsgQueue_Send );
            return true;
    }

    return false;
}

关于c - Z-wave 协议(protocol)与 C : Questions about Z-wave frame structure & programming in general,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318960/

相关文章:

c - 为什么我不能通过设置PWD来设置当前工作目录

c - 如何在 C 预处理期间用索引交换字符串

数组的大小可以在c中运行时确定吗?

c++ - Ping "no resources"- 是什么原因造成的?

java - 向 DatagramSocket 添加超时-receive()

encoding - 串接时的 scapy 编码

c - 以下一段 C 代码的作用是什么

c++ - 编辑 QTreeWidgetItem 时捕获 ESC 键按下事件

c - WinDivert 问题 - 在 Windows 上将 DNS 重定向回自身

http - 戈朗 : how to check if an HTTP request is in the TCP payload bytes