CMessageHeader

视频监控设备(NVR、IPC等)如何通过国标GB28181接入到视频监控平台,以及接入过程如何测试视频接入是否成功 GB/T28181标准广泛的应用,视频监控设备通过国标GB28181接入视频监控平台的过程变成程序化、标准化的互联过程,确保了视频监控设备能够在不同系统、不同网络环境下实现远程、跨区域、跨级别的访问和控制。版本有GB28181-2011、2016、2022几个常用版本,威迪斯特的视频监控平台完全支持GB28181的这几个版本,能够实现不同品牌视频监控设备的国标视频接入(国标视频监控接入),或者为国标28181视频接入(国标28181视频监控接入),也为国标281818接入(国标GB/T28181接入。 阅读详情

CMessageHeader

 

消息头包含的内容:

class CMessageHeader {
 public:
 enum {
 MESSAGE_START_SIZE = 4,
 //消息开始字符串,长度4字节,就是告诉你是属于哪种消息标识,在UTF-8中无效
 //主类型(MAIN): 0xd9b4bef9
 //测试网络(TESTNET):0x0709110b
 //回归测试(REGTEST):0xdab6bffa
 COMMAND_SIZE = 12,
 //定义了通信中的各种命令,由0x20~0x7F之间的字 符串构成,
 MESSAGE_SIZE_SIZE = 4,
 //最大值是32M (0x02000000)。 不包含消息头的大小
 CHECKSUM_SIZE = 4,
 //把消息数据经过2次SHA256算法运算得到校验和
 };

 

Message Headers

 

网络传输中,所有消息的消息头格式是一样的,下面解释一下每一个消息头具体包含哪些内容:

1

 

GetDataMsg

 

getdata / inv消息类型。这些号码由协议定义。

enum GetDataMsg {
 UNDEFINED = 0,
 MSG_TX = 1,
 MSG_BLOCK = 2,
 // The following can only occur in getdata. Invs always use TX or BLOCK.
 //!< Defined in BIP37
 MSG_FILTERED_BLOCK = 3,
 //!< Defined in BIP152
 MSG_CMPCT_BLOCK = 4,
 //!< Extension block
 MSG_EXT_TX = MSG_TX | MSG_EXT_FLAG,
 MSG_EXT_BLOCK = MSG_BLOCK | MSG_EXT_FLAG,
 };

消息类型大致分为:

MSG_TX 交易信息
MSG_BLOCK 区块
MSG_FILTERED_BLOCK 过滤的区块
MSG_CMPCT_BLOCK 紧凑区块 //bip152

 

NetMsgType

 

namespace NetMsgType {
 const char *VERSION = "version";//获取版本信息
 const char *VERACK = "verack";//版本信息回应
 const char *ADDR = "addr";//网络节点的地址
 const char *INV = "inv";//库存清单
 const char *GETDATA = "getdata";//获取数据
 const char *MERKLEBLOCK = "merkleblock";//merkle块
 const char *GETBLOCKS = "getblocks";//获取区块
 const char *GETHEADERS = "getheaders";//获取区块头
 const char *TX = "tx";//交易信息
 const char *HEADERS = "headers";//区块头
 const char *BLOCK = "block";//区块
 const char *GETADDR = "getaddr";//获取地址
 const char *MEMPOOL = "mempool";//内存池
 const char *PING = "ping";//判断网络是否连通
 const char *PONG = "pong";//ping消息回应
 const char *NOTFOUND = "notfound";//没有获取相匹配的数据
 const char *FILTERLOAD = "filterload";//加载过滤器
 const char *FILTERADD = "filteradd";//添加过滤交易信息
 const char *FILTERCLEAR = "filterclear";//清理过滤器
 const char *REJECT = "reject";//拒绝
 //======================网络协议版本号为70002之前======================//
 const char *SENDHEADERS = "sendheaders"; //bip130 发送块头信息
 const char *FEEFILTER = "feefilter";//BIP133 feefilter
 const char *SENDCMPCT = "sendcmpct";// BIP152 发送紧凑区块
 const char *CMPCTBLOCK = "cmpctblock";// BIP152 紧凑区块
 const char *GETBLOCKTXN = "getblocktxn";// BIP152 获取紧凑区块交易
 const char *BLOCKTXN = "blocktxn";// BIP152 紧凑区块交易
 };

 

Inv

 

当需要获取inventory时,发送此命令,发送时,需要指定范围。接收到此命令后,按指定范围获取inventory数据(PushGetBlocks)。

2

Inv 消息的示例:

02 ................................. Count: 2
 01000000 ........................... Type: MSG_TX
 de55ffd709ac1f5dc509a0925d0b1fc4
 42ca034f224732e429081da1b621f55a ... Hash (TXID)
 01000000 ........................... Type: MSG_TX
 91d36d997037e08018262978766f24b8
 a055aaf1d872e94ae85e9817b2c68dc7 ... Hash (TXID)

getdata:

getdata消息请求来自另一个节点的一个或多个数据对象。这些对象由一个 inventory 请求,请求节点通常通过inv消息预先接收这些对象。

对 getdata 消息的响应可以是 tx 消息,阻塞消息,merkleblock 消息或未找到的消息。

getdata 不能用于请求任意数据,例如不再存在于内存池中的一些历史交易。如果全节点已经从其block数据库中打包了先前的交易,这时全节点可能无法提供这些block。 出于这个原因,getdata消息通常只能通过发送inv消息向先前通告它的节点请求数据。

getdata消息的格式和最大大小限制与inv消息相同,但是消息标题不同。

merkleblock:

如BIP37所述,在协议版本70001中添加。

merkleblock 消息是对使用 inventory 类型 MSG_MERKLEBLOCK 请求块的 getdata 消息的回复。这只是答复的一部分:如果找到任何匹配的交易,它们将作为tx消息单独发送。

如果之前已经使用过滤器加载消息设置了过滤器,则merkleblock消息将包含所请求块中与过滤器匹配的所有事务的TXID以及将这些事务连接到块头的必要块所需的块merkle树的任何部分 merkle根。 该消息还包含块头的完整副本,以允许客户端对其进行 hash 并确认其工作证明。

merkleblock消息示例:

01000000 ........................... Block version: 1
 82bb869cf3a793432a66e826e05a6fc3
 7469f8efb7421dc88067010000000000 ... Hash of previous block's header
 7f16c5962e8bd963659c793ce370d95f
 093bc7e367117b3c30c1f8fdd0d97287 ... Merkle root
 76381b4d ........................... Time: 1293629558
 4c86041b ........................... nBits: 0x04864c * 256**(0x1b-3)
 554b8529 ........................... Nonce
 07000000 ........................... Transaction count: 7
 04 ................................. Hash count: 4
 3612262624047ee87660be1a707519a4
 43b1c1ce3d248cbfc6c15870f6c5daa2 ... Hash #1
 019f5b01d4195ecbc9398fbf3c3b1fa9
 bb3183301d7a1fb3bd174fcfa40a2b65 ... Hash #2
 41ed70551dd7e841883ab8f0b16bf041
 76b7d1480e4f0af9f3d4c3595768d068 ... Hash #3
 20d2a7bc994987302e5b1ac80fc425fe
 25f8b63169ea78e68fbaaefa59379bbf ... Hash #4
 01 ................................. Flag bytes: 1
 1d ................................. Flags: 1 0 1 1 1 0 0 0

getblocks

getblocks消息请求一个inv消息,该消息提供从块链中的特定点开始的块头hash。区块同步时,发送此命令,发送时需要指定区块范围(PushGetBlocks)。接收到此命令后,根据区块范围,获取相应的区块,反馈回去。接收的数据中包含区块范围的开始区块的定位信息(CBlockLocator)、结束区块的索引,从开始区块的下一个区块开始。每次最多获取500个区块信息。满500个时,记录获取的最后一个区块的hahs值,保存到源节点的hashContinue中。

3

示例如下:

71110100 ........................... Protocol version: 70001
 02 ................................. Hash count: 2
 d39f608a7775b537729884d4e6633bb2
 105e55a16a14d31b0000000000000000 ... Hash #1
 5c3e6403d40837110a2e8afb602b1c01
 714bda7ce23bea0a0000000000000000 ... Hash #2
 00000000000000000000000000000000
 00000000000000000000000000000000 ... Stop hash

getheaders

getheaders消息请求 headers 消息,该消息提供从块链中的特定点开始的块 header。接收到此命令后,获取指定的范围的区块的头,将 headers消息发送给源节点。

getheaders消息几乎与getblocks消息相同,只有一点区别:对getblocks消息的inv回复将包含不超过500个块头hash; headers 回复 getheaders 消息将包含多达2000个块 headers。

tx

tx 消息以原始交易格式传输单个交易。它可以在各种情况下发送;

- 交易响应:Bitcoin Core 和 BitcoinJ 将发送它以响应getdata消息,该消息请求 inventory 类型为MSG_TX的交易。
- MerkleBlock响应:Bitcoin Core 将发送它以响应getdata消息,该消息请求inventory类型为MSG_MERKLEBLOCK的merkle块。 (这是发送merkleblock消息的补充。)在这种情况下,每个tx消息提供该块的匹配交易。
- Unsolicited:BitcoinJ会发送一个tx消息来主动发起它的交易。

headers

headers 消息将 block message 发送到先前用getheaders消息请求特定 headers 的节点。headers 消息可以是空的。

4

示例如下:

01 ................................. Header count: 1
 02000000 ........................... Block version: 2
 b6ff0b1b1680a2862a30ca44d346d9e8
 910d334beb48ca0c0000000000000000 ... Hash of previous block's header
 9d10aa52ee949386ca9385695f04ede2
 70dda20810decd12bc9b048aaab31471 ... Merkle root
 24d95a54 ........................... Unix time: 1415239972
 30c31b18 ........................... Target (bits)
 fe9f0864 ........................... Nonce
 00 ................................. Transaction count (0x00)

block

block message以 serialized blocks section 描述的格式发送单个 serialized block。

- 获取数据响应:节点将始终发送它以响应一个getdata消息,该消息请求存储类型为MSG_BLOCK的块(假设该节点具有可用于发送的该块)。
- 主动提供:一些矿工会发送未经请求的block信息,将他们新挖掘的块块广播给他们的所有同行。 许多矿池做同样的事情,虽然有些可能被错误地配置为从多个节点发送块,可能不止一次地将同一块发送给别的节点。

notfound

notfound 的消息是对getdata消息的回复,该消息请求接收节点没有可用于发送的对象。 (预计节点不会传递不再存在于内存池或发送集中的历史事务,节点也可能从较旧的块中删除已用完的事务,使它们无法发送这些块。)

notfound消息的格式和最大大小限制与inv消息相同,只有消息的headers不同。

mempool

mempool消息请求接收节点已验证为有效但尚未出现在块中的交易的TXID。 也就是说,在接收节点的内存池中的交易。 对mempool消息的响应是一个或多个包含 inventory 格式的TXID的inv消息。

当程序首次连接到网络时,发送mempool消息非常有用。 全节点可以使用它来快速收集网络上可用的大部分或全部未确认的交易; 这对试图收取交易费用的矿工尤其有用。 SPV客户端可以在发送mempool之前设置过滤器,以仅接收与该过滤器匹配的交易; 这允许最近开始的客户获得与其钱包有关的大部分或全部未确认的交易。

对mempool消息的inv响应充其量只是一个节点的网络视图 – 而不是网络上未经确认的交易的完整列表。以下是列表可能不完整的一些其他原因:

- 在Bitcoin Core 0.9.0之前,对mempool消息的响应只有一个inv消息。 inv消息被限制为50,000个库存,所以具有大于50,000个条目的内存池的节点不会发送所有内容。 Bitcoin Core 的更新版本根据需要发送尽可能多的inv消息以引用其完整的内存池。
- mempool消息当前不与filterload消息的BLOOM_UPDATE_ALL和BLOOM_UPDATE_P2PUBKEY_ONLY标志完全兼容。 Mempool交易不像块内交易那样排序,因此一个消耗输出的交易(tx2)可以出现在包含该输出的交易(tx1)之前,这意味着自动过滤器更新机制将不会运行,直到第二次出现的交易 tx1) – 缺少首次出现的交易(tx2)。 在Bitcoin Core issue #2381中已经提出,交易在被过滤器处理之前应该被排序。

以上是对 Data Messages 的描述,其关系图如下:

5

version:

version 消息在连接开始时向接收节点提供关于发送节点的信息。在这两个节点交换 version 消息之前,不会接受其他消息。

当接收节点收到version消息之后,会回复给发送节点一个verack消息,同时把所有警告也反馈回去。但是在version消息的初始化未完成之前,是不会发送verack消息的。

发送端只能发送一次获取版本的命令,重复发送时,回应拒绝命令 (reject)。发送命令后,会把发送节点的地址信息添加到节点的地址管理器中。

示例如下:

72110100 ........................... Protocol version: 70002
 0100000000000000 ................... Services: NODE_NETWORK
 bc8f5e5400000000 ................... Epoch time: 1415483324
 0100000000000000 ................... Receiving node's services
 00000000000000000000ffffc61b6409 ... Receiving node's IPv6 address
 208d ............................... Receiving node's port number
 0100000000000000 ................... Transmitting node's services
 00000000000000000000ffffcb0071c0 ... Transmitting node's IPv6 address
 208d ............................... Transmitting node's port number
 128035cbc97953f8 ................... Nonce
 0f ................................. Bytes in user agent string: 15
 2f5361746f7368693a302e392e332f ..... User agent: /Satoshi:0.9.3/
 cf050500 ........................... Start height: 329167
 01 ................................. Relay flag: true

verack:

verack消息确认先前收到的版本消息,通知连接节点它可以开始发送其他消息。 接收到版本回应命令后,设置节点的接收版本。与此同时,设置接收版本号,节点的接收版本(nRecvVersion)、接收消息的报头流的版本号、接收消息数据流的版本号(nVersion)都要设置。

adddr:

addr(IP地址)消息用来表示网络上节点的连接信息。 每个想要接受传入连接的节点创建一个addr消息,提供其连接信息,然后将该消息发送给未经请求的节点,当接收端收到此命令后把接收到的地址添加到节点的地址管理器中,发送、接收的地址数量最多1000个。

6

Ping

ping消息有助于确认接收方仍处于连接状态(判断网络是否连通)。 如果在发送ping消息时遇到TCP / IP错误(例如连接超时),则发送节点可以假设接收节点已断开连接。 对ping消息的响应是pong消息。

在协议版本60000之前,ping消息没有 payload。从协议版本60001及所有更高版本开始,消息包含一个字段即nonce。

7

ping消息的nonce字段,示例如下:

0094102111e2af4d ... Nonce

pong

pong消息回复ping消息,向pinging节点证明ponging节点仍然存在。默认情况下,Bitcoin Core将在20分钟内断开任何未响应ping消息的客户端。接收到pong命令后,更新节点的ping花费时间(nPingUsecTime),所花费的时间为当前时间与节点的ping开始时间(nPingUsecStart)的差。

为了允许节点跟踪等待时间,pong的回复消息中所包含的nonce字段与ping消息的nonce是相同的。

pong消息的格式与ping消息相同;只有消息头不同。

reject

发生特殊情况时,reject 消息通知接收节点其先前消息之一已被拒绝。

特殊情况如下:

- 重复发送获取版本信息的命令(”version”)。
- 发送端的版本号大于最大版本号(MIN_PEER_PROTO_VERSION = 209)。
- 接收到DDoS攻击。
- 处理消息时发生异常(ProcessMessage)。

发送拒绝命令时,带上参数,表示拒绝的原因。

8

SendHeaders

sendheaders消息告诉接收方使用 headers 消息而不是inv消息发送新的块通告,具体可参照 bip130 。

GetAddr

getaddr消息请求来自接收节点的addr消息,最好是具有大量其他接收节点的IP地址的消息。 发送节点可以使用这些IP地址来快速更新其可用节点的数据库,而不是等待未经请求的addr消息随时间到达。

接收到getaddr命令后把节点的地址管理器中的地址返回给发送端。先清空源节点的发送地址数组(vAddrToSend)。再把节点的IP地址管理器 (addrman)中的地址(CAddress)发送给源节点。

FeeFilter

FeeFilter消息是对接收方的请求,不将任何交易inv消息转发给发送方,其中交易费率低于feefilter消息中指定的费率。

在Bitcoin Core 0.12.0引入mempool限制之后,feefilter在Bitcoin Core 0.13.0中引入。 Mempool限制功能可以防止费用较低的交易的攻击,并且不会将其纳入开采块中。 feefilter消息告诉其他节点,如果你的费率低于我预先设置的费率,那你的这个交易是不允许进入我的mempool的,同时,这些节点就没必要继续把低于该费率的交易的inv消息转达给该节点。

9

接收方可以选择不过滤这笔交易,直接忽略该消息。

FeeFilter与bloom过滤器相加。如果SPV客户端加载bloom过滤器并发送FeeFilter消息,则只有通过两个过滤器才能转发交易。

但请注意,feefilter对块传播或对getdata消息的响应没有影响。 例如,如果一个节点通过发送一个包含inv类型MSG_FILTERED_BLOCK的getdata消息来请求一个merkleblock,并且它先前已经向该节点发送了一个feefilter,那么即使他们低于feefilter的费率,该节点也应该响应一个包含所有匹配bloom过滤器的交易的merkleblock。

示例如下:

7cbd000000000000 ... satoshis per kilobyte: 48,508

FilterAdd

filteradd消息告诉接收方将单个元素添加到先前设置的布隆过滤器,例如新的公共hash。 该元素直接发送给接收方; 然后其它节点使用在过滤器加载消息中设置的参数来将该元素添加到布隆过滤器。

由于该元素直接发送到接收方,因此elem不会产生歧义,也不会出现布隆过滤器提供的似是而非的隐私。希望保持更高隐私性的客户端应自行重新计算布隆过滤器,并使用重新计算的布隆过滤器发送新的过滤器负载消息。

10

注意:除非先前使用的filterload消息设置了过滤器,否则节点将不接受filteradd消息。

示例如下:

20 ................................. Element bytes: 32
 fdacf9b3eb077412e7a968d2e4f11b9a
 9dee312d666187ed77ee7d26af16cb0b ... Element (A TXID)

FilterClear

filterclear消息告诉接收方删除先前设置的bloom过滤器。这也消除了将版本消息中的转发字段设置为0的效果,允许未经过滤的访问广播新交易的inv消息。

Bitcoin Core在替换过滤器加载filterload之前不需要filterclear消息。它也不需要filterclear消息之前的filterload消息。

FilterLoad

filterload消息告诉接收方需要过滤所有转发的交易,并通过提供的过滤器请求merkle块。 这允许客户接收与其钱包相关的交易。

11

示例如下:

02 ......... Filter bytes: 2
 b50f ....... Filter: 1010 1101 1111 0000
 0b000000 ... nHashFuncs: 11
 00000000 ... nTweak: 0/none
 00 ......... nFlags: BLOOM_UPDATE_NONE

sendcmpct and cmpctblock、getblocktxn、blocktxn参照BIP152.

以上是对Control Messages的描述,其关系如下:

12

下表列出了一些值得注意的P2P网络协议版本,其中最新版本列在第一位:

13

14

版权声明: bync'sa 作者保留权利。文章为作者独立观点,不代表巴比特立场。
Keil AC6编译器独立安装与配置指南:不升级Keil MDK也能用上新工具链 本文详细介绍了如何在不升级Keil MDK的情况下独立安装和配置Arm Compiler 6(AC6),帮助嵌入式开发者充分利用AC6的编译速度、代码密度和现代语言支持优势。通过零侵入式解决方案,开发者可以在现有环境中灵活切换编译器版本,提升开发效率。 阅读详情

相关推荐

Miniconda3迁移(附图详细过程)

服务器上目录占满,想要将conda迁移到其他目录下的操作方法,详细教程。

2301_77554343的博客 6942

Spring Integration学习笔记:Message

本文是自己的学习笔记,主要参考资料如下 Spring Integration官方文档:https://docs.spring.io/spring-integration/docs/current/reference/html/index-single.html#message 1、Message的基本结构1.1 MessageHeader的结构1.1.1、MessageHeaders中重要的成员变量1.1.2、MessageHeaders使用的注意事项1.2、Message的常用实现类1.3、Mess

sinat_38393872的博客 1567

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中设置 RGP 表的技巧,以优化仿真精度和效率。

jkh920184196的博客 1664

添加复杂类型 在 message header

         public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)        {                      requestMessage = request.ToStri

zhongjie的专栏 2445

JLINK/SWD/STLINK下载选项区别

摘要: 本文对比了JLINK/SWD/STLINK的6种下载模式:Normal(硬件复位)、Hot plug(无复位)、Under reset(持续复位后连接)、Software reset(软件复位)、Hardware reset(全复位)和Core reset(内核复位)。重点分析了各模式的操作逻辑、适用场景及注意事项,其中Under reset模式是解决SWD禁用/程序异常的首选方案。通过对比表归纳了复位范围、NRST操作等核心差异,并给出场景选择建议:排查连接问题优先选Under reset,常规调

亚洲程序员盟主得博客 395

UCIE Specification详解(五)

Logical Physical Layer(逻辑物理层)

Crazzy_M的博客 1221

WCF身份验证之二:使用MessageHeader进行验证

关于这个主题, 还有一篇 WCF身份验证之一:使用证书进行验证. 关于使用SoadHeader验证Robin已经有一篇十分精彩的文章: WCF进阶:为每个操作附加身份信息, 不过我的思维方式总是跟别人有点不太一样, 还是把类似的内容用我的方式重新组织一下. 使用Header验证最直接的想法就是不要使用证书, 证书在很多场合都显得太过于复杂了, 而我们对安全性的要求并没有那么高, 毕竟我们周围的...

weixin_30454481的博客 326

用 SAP HANA SDA 访问 PostgreSQL:从可行性到落地实践的完整指引

摘要:SAP HANA可通过SDA/SDI技术访问PostgreSQL数据库,支持数据虚拟化和实时复制。主要实现路径包括:1)使用Camel JDBC适配器创建虚拟表进行联邦查询;2)利用PostgreSQL Log Reader适配器实现变更数据捕获(CDC)。实施时需配置Data Provisioning Agent,注意权限和网络要求。官方文档指出,通过SDI+DP Agent的方式比直接SDA连接更稳定可靠。虚拟化查询时,HANA会自动将SQL下推到PostgreSQL执行,优化性能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 253

WCF messageheader校验头

客户端 ServiceTokenValidation.DinoTechDataSyncServiceClient client = new ServiceTokenValidation.DinoTechDataSyncServiceClient();  using (OperationContextScope scope = new OperationContextScope(client.I

waydesmith的博客 803

ComfyUI 本地部署指南:概念、部署过程、生成图片、共享 WebUI 模型

ComfyUI 是一个基于节点的 Stable Diffusion 图形化用户界面。您可以通过将不同的节点连接在一起来构建生成图像的工作流程。一些常用的节点包括加载检查点模型(Load Checkpoint)、输入提示词(CLIP Text Encode)、指定采样器(KSampler)等。ComfyUI 将工作流程分解为可重新排列的元素,以便您可以轻松创建自己的元素。

水滴的博客 5032

RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络

本文记录的是利用颈部结构优化RT-DETR的目标检测网络模型。利用改进后的颈部网络,通过跳层连接,避免了在进行反向传播时的梯度消失问题,并且引入跨尺度连接,可以实现不同级别和层次的特征充分融合,获取足够的高层语义信息和低层空间信息交换,从而在大规模变化场景下提高检测性能。GIRAFFEDET: A HEAVY-NECK PARADIGM FOR OBJECT DETECTION-GFPN包含了上述的跳层连接(dense-link和log2nlog _{2} nlog2​n-link)以及跨尺度连接(Quee

Limiiiing的博客 2228

三十四.区块链网络(5)--消息处理

另:关于ProcessMessage函数,tx消息下的孤儿交易,就是在当前节点,引用的交易还未找到,数据库,包括临时池都没有,它会有着相应的处理方法。然后这个nDropMessagesTest的值是测试用的,当这个值大于0时,会根据nDropMessagesTest的值(概率)丢弃一段收到消息,模拟节点在比较差的网络环境中(丢包)的健壮性。然后,这里我们不仅处理消息,还需要维护一下数据缓冲区,就是这段消息,如果这个标志头,不在这段消息的起始处,那是不是前面的数据我们要把它去掉,我们是用不上的。

d3582077的专栏 281

3D打印机控制系统设计:基于MATLAB的3D打印机运动学建模、轨迹规划和控制

控制实现:在控制实现中,需要将轨迹规划的结果转化为实际的控制指令,控制3D打印机按照规划的轨迹进行运动。3D打印机的运动学建模:3D打印机的运动学建模是指将3D打印机的机械结构、传动系统和运动控制部件等抽象成数学模型,以便于进行控制系统的设计和分析。轨迹规划:轨迹规划是指根据3D模型的几何形状和打印机的运动学模型,计算出打印机需要执行的运动轨迹,以便于实现所需的打印效果。控制实现:控制实现是指将轨迹规划的结果转化为控制指令,控制3D打印机按照规划的轨迹进行运动。

走向CTO的路上... 2473

三十.区块链网络(1)--网络发送tx

COPY_DEPTH=3,限制了引用的深度,3个深度,也就是说引用的tx超过了3个深度,它就不会把这个tx加入到vtxPrev里面,注意这个3个深度,并不是前面三个区块的意思,关于是什么,因为涉及到默克尔树,而我们现在重点是网络部分,所以这里的算法现在不分析了。这个函数就是计算消息的长度,然后将长度写入进去,注意这里写入的长度并不是在末尾,而是在消息头里,因为构建消息头时,还没有数据,所以无法计算总长度,所以放在EndMessage里计算,然后再补上。我们看到,到现在,还没涉及到网络发头,只是在打包消息。

d3582077的专栏 257

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java中如何设置HTTP协议的头信息(header)

首先,我们先看一下http的头信息到底是什么:HTTP(HyperTextTransferProtocol) 即超文本传输协议,目前网页传输的的通用协议。HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应。就整个网络资源传输而 言,包括message-header和message-body两部分。首先传递message- header,即http header消息。htt

嘻哈包袱铺 专栏 4万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WCF 关于自定义MessageHeader支持

我们在项目中有些公共信息可以不通过方法参数提供,将这些信息封装到MessageHeader,通过客户端提交给Server。这种情况下我们需要注意WCF不同的实例模式、会话模式对Header的支持情况:实力模式(InstanceContextMode)PerCall、PerSession支持Header,但是Single不支持自定义header,表现是服务器无法获取Header内容另外如果在

CNet的专栏 804

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C可变参数用法以及自己的Message()函数

首先,关于可变参数,实际上,也就是未知参数个数,在调用的时候再解析。我的理解是C总会把参数放到函数堆栈,那么,虽然声明函数 的时候不知道参数个数,但可以在使用时指明,并根据指出的参数进行解析,操作。 解析这种参数使用va_list宏,用法如下:  1. 声明va_list,  2. 使用va_start()取得参数"..."地址

wdt3385的专栏 1443

C语言:Message类

message.h #ifndef MESSAGE_H #define MESSAGE_H #define TRUE 1 #define FALSE 0 typedef struct { int sender; int isSend; int isCharge; char date[8]; }Message; Message *...

weixin_34290631的博客 1545

c语言message函数,C语言:Message类

message.h#ifndef MESSAGE_H#define MESSAGE_H#define TRUE 1#define FALSE 0typedef struct {int sender;int isSend;int isCharge;char date[];}Message;Message * makeMessage(const int sender, const char *date...

weixin_29789925的博客 3121

CMessage(提示)

// // CMessage.h // myGame1 // // Created by zctech on 14-2-26. // // #ifndef __myGame1__CMessage__ #define __myGame1__CMessage__ #include #include "cocos2d.h" #include "CResource.h" class CMes

zwcwu31的专栏 2002

【BlockChain】go实现区块链7:网络

【BlockChain】go实现区块链7:网络 引言 到目前为止,我们所构建的原型已经具备了区块链所有的关键特性:匿名,安全,随机生成的地址;区块链数据存储;工作量证明系统;可靠地存储交易。尽管这些特性都不可或缺,但是仍有不足。能够使得这些特性真正发光发热,使得加密货币成为可能的,是网络(network)。如果实现的这样一个区块链仅仅运行在单一节点上,有什么用呢?如果只有一个用户,那么这些基于密码学的特性,又有什么用呢?正是由于网络,才使得整个机制能够运转和发光发热。 你可以将这些区块链特性认为是规则(ru

qq_40392981的博客 721

INV:事物处理开发接口

当向接口表:mtl_transactions_interface 插入数据的时候,可以在事物处理开发接口 界面查看到数据; 接口管理器中的物料事物处理(下图)在启动的情况下,会在计划好的时间定期运行从而将接口表中的数据进行处理; 当然,也可以手工提交请求来处理接口表中的数据: 请求名称:工作流后台流程,其中的参数——项目类型:选择库 存处理状态

zhanzhibo的专栏 1157

c语言怎么加header文件,Header头文件原型C语言.doc

/*alloc.hmemory management functions and variables.*/#if __STDC__#define _Cdecl#else#define _Cdeclcdecl#endif#ifndef _STDDEF#define _STDDEF#ifndef _PTRDIFF_T#define _PTRDIFF_T#ifdefined(__LARGE__) || ...

weixin_42298209的博客 989
上一篇: boost::signal
下一篇: Merkle Tree(默克尔树)算法解析
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值