Tri*_*y92 6 c networking packet z-wave
(在我提出问题之前;我不知道是否允许任何人回答我的问题,因为Z波协议应该是机密信息,但如果它确实违反了任何类型的规则,那么随意删除这个帖子.)
我目前正在尝试编写一个C程序,它只是构造一个由原始二进制数据组成的Z波消息,然后将该消息发送到连接Z波控制器的USB接口(我正在使用AEOTEC Z-Stick USB加密狗由Aeon Labs提供).我也使用本指南作为参考,并试图在简单C中重写示例代码.但是,如果你看一下指南,特别是他试图发送给USB控制器的消息:
/*
0x01, 0x09, 0x00, 0x13, nodeId, 0x03, 0x20, 0x01, state, 0x05, checksum
*/
Run Code Online (Sandbox Code Playgroud)
...也许只是我,但似乎缺少来自通常的Z波框架的一些信息.我的猜测是前4个字节代表Home ID后跟节点ID,但是我无法弄清楚'0x03'之后的含义,假设该字节后面的其余部分代表"Basic"命令类(' 0x20',1字节)和相应的"Set"应用程序命令('0x01',1字节).在校验和位之前'0x05'代表什么?那传输头信息呢,为什么不包含它?看起来他不需要包含它......或者我只是在解释数据包完全错误.有人可以开导我吗?
另外,如果您从USB端口读取应用程序层信息(f.ex.中带有open()&read()命令,那么它是否正确无法检索应用程序层信息?)
先感谢您!
我认为通过研究OpenZWave的源代码可以节省大量的时间和精力.这是一个用于处理ZWave的开源C++库,它非常成熟且功能齐全.你可以从平原C轻松使用它.
您可以在Msg类构造函数中看到您要求的部分内容,该构造函数构造帧的开始(0x01),后跟消息长度(0x09 == 9字节),消息类型(0x00 == REQUEST)和函数(FUNC_ID_ZW_SEND_DATA) == 0x013),然后是目标nodeID,然后是实际的命令体,我想这是一个基本的命令:
./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;
}
Run Code Online (Sandbox Code Playgroud)
找到了我要找的东西。如果有人感兴趣,这是我经过几天的谷歌搜索后发现的......
该页面的稍下方(直接在 Z-Wave 帧描述下方)是用于直接与 USB 控制器通信的帧结构的描述。