UDP网络通信OSC 协议
使用方法
OscMessage mesg;
mesg.setAddress("m");
mesg.addIntArg();
mesg.addIntArg();
mesg.addIntArg(); g_oscSend.sendMessage(mesg);
先做记录,再做程序
整个消息是放在一个数组中
前8个字符做头 为#bundle\0
下面8个字节记录时间 这里都是1, 内存中为 0 0 0 0 0 0 0 1
再下面4个字节 整数 ,这里的数字大小指的是,osc地址的地址距离数据末尾的字节数 ,(也就是接收到数据包的长度减去这个值,就是osc消息的Adrrs的位置)
再下面就是地址字符串 大小根据字符串大小 ,然后4个字节对齐,不足补到4的倍数
再下面是所有参数的类型 第一个是 逗号,不知为何这样, 下面才是类型, 这里如果数量不是4的倍数也要补
接下来是每个参数的内存
类型
enum TypeTagValues {
TRUE_TYPE_TAG = 'T',
FALSE_TYPE_TAG = 'F',
NIL_TYPE_TAG = 'N',
INFINITUM_TYPE_TAG = 'I',
INT32_TYPE_TAG = 'i',
FLOAT_TYPE_TAG = 'f',
CHAR_TYPE_TAG = 'c',
RGBA_COLOR_TYPE_TAG = 'r',
MIDI_MESSAGE_TYPE_TAG = 'm',
INT64_TYPE_TAG = 'h',
TIME_TAG_TYPE_TAG = 't',
DOUBLE_TYPE_TAG = 'd',
STRING_TYPE_TAG = 's',
SYMBOL_TYPE_TAG = 'S',
BLOB_TYPE_TAG = 'b',
ARRAY_BEGIN_TYPE_TAG = '[',
ARRAY_END_TYPE_TAG = ']'
};
其中 bool 没有内存,只有一个tag
int32 4个字节
float 4个字节
char 4个字节
int64 8 个字节
double 8个字节
timetag 8个字节
string 补到4的倍数
2018-4-28
找到了一个代码实现
enum class ArgType : char { INTEGER_32 = 'i', FLOAT = 'f', DOUBLE = 'd', STRING = 's', BLOB = 'b', MIDI = 'm', TIME_TAG = 't', INTEGER_64 = 'h', BOOL_T = 'T', BOOL_F = 'F', CHAR = 'c', NULL_T = 'N', IMPULSE = 'I', NONE = NULL_T };
void Bundle::setTimetag( uint64_t ntp_time )
{
uint64_t a = htonll( ntp_time );
ByteArray<> b;
memcpy( b.data(), reinterpret_cast<uint8_t*>( &a ), );
mDataBuffer->insert( mDataBuffer->begin() + , b.begin(), b.end() );
} void Bundle::initializeBuffer()
{
static const std::string id = "#bundle";
mDataBuffer.reset( new std::vector<uint8_t>( ) );
std::copy( id.begin(), id.end(), mDataBuffer->begin() + );
(*mDataBuffer)[] = ;
}
size_t addressLen = mAddress.size() + getTrailingZeros( mAddress.size() ); auto typesSize = mDataViews.size() + ;
std::vector<char> typesArray( typesSize + getTrailingZeros( typesSize ) , ); typesArray[] = ',';
int i = ;
for( auto & dataView : mDataViews )
typesArray[i++] = Argument::translateArgTypeToCharType( dataView.getType() ); if( ! mCache )
mCache = ByteBufferRef( new ByteBuffer() ); size_t typesArrayLen = typesArray.size();
ByteArray<> sizeArray;
int32_t messageSize = addressLen + typesArrayLen + mDataBuffer.size();
auto endianSize = htonl( messageSize );
memcpy( sizeArray.data(), reinterpret_cast<uint8_t*>( &endianSize ), ); mCache->resize( + messageSize ); std::copy( sizeArray.begin(), sizeArray.end(), mCache->begin() );
std::copy( mAddress.begin(), mAddress.end(), mCache->begin() + );
std::copy( typesArray.begin(), typesArray.end(), mCache->begin() + + addressLen );
std::copy( mDataBuffer.begin(), mDataBuffer.end(), mCache->begin() + + addressLen + typesArrayLen ); auto dataPtr = mCache->data() + + addressLen + typesArrayLen;
for( auto & dataView : mDataViews ) {
if( dataView.needsEndianSwapForTransmit() )
dataView.swapEndianForTransmit( dataPtr );
}
static uint8_t getTrailingZeros( size_t bufferSize ) { return - ( bufferSize % ); }
和我之前的解释一样,现在这个可以照着自己解析了
UDP网络通信OSC 协议的更多相关文章
- UNIX网络编程——分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...
- Java第三阶段学习(八:网络通信协议、UDP与TCP协议)
一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...
- 分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...
- 基于FPGA的光口通信开发案例|基于Kintex-7 FPGA SFP+光口的10G UDP网络通信开发案例
前言 自著名华人物理学家高锟先生提出"光传输理论",实用化的光纤传输产品始于1976年,经历了PDH→SDH→DWDM→ASON→MSTP的发展历程.本世纪初期,ASON/OADM ...
- 【RL-TCPnet网络教程】第16章 UDP用户数据报协议基础知识
第16章 UDP用户数据报协议基础知识 本章节为大家讲解UDP(User Datagram Protocol,用户数据报协议),需要大家对UDP有个基础的认识,方便后面章节UDP实战操作. ...
- Python基础教程之udp和tcp协议介绍
Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...
- 基于UDP高性能传输协议UDT doc翻译(一)
原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd UDT文档阅读理解 一. 概述 ...
- 涨知识-VI 基于TCP/UDP的应用层协议
基于TCP/UDP的应用层协议: 基于TCP: Telnet(Teletype over the Network, 网络电传),通过一个终端(terminal)登陆到网络 FTP(File Trans ...
- Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)
Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. Raknet有以下好处: 高性能 在同一台计算机 ...
随机推荐
- mongo(五)副本集
mongo(五)副本集 配置文件 1-3为三个存储节点,其实一个为Primary,两个secondary作为备份,4为仲裁节点 # mongod.conf #where to log logpath= ...
- [安卓] 4、CheckBox、RadioButton和Toast简单用法
和按钮类似,这里采用cb1.setOnCheckedChangeListener(this);方法分别对3个CheckBox进行CheckChange事件绑定,然后在onCheckedChange ...
- [ACM_水题] 不要62(hdu oj 2089, 不含62和4的数字统计)
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来, ...
- 易出错的C语言题目之二:指针
一.写出输出结果 #include<stdio.h> int main(){ ]; a[] = ; a[] = ; a[] = ; int *p,*q; p = a; q = &a ...
- Java程序员的日常 —— static的用法讲解实践
之前文章说过Java中static的作用,有朋友想看个例子.于是便抽空写了个小栗子 代码 package xing.test.thinking.chap5; class A{ public A() { ...
- 01_JavaScript简介
js用途 前端三层 结构层 HTML 从主义角度描述页面的结构 样式层 CSS 从审美的角度装饰页面 行为层 JS 从交互角度提升体验 HTML 里面的 b(加粗)/i(倾斜)/u(下划线)等标签由于 ...
- paip.环境设置 mybatis ibatis cfg 环境设置
paip.环境设置 mybatis ibatis cfg 环境设置 三部分 //////////1. 电泳.... ............2. 猪配置文件 com/mijie/homi/searc ...
- iOS-程序发布-32位和64位系统的兼容
在苹果推出iPhone5S时,64位的应用就走到了眼前.当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...
- Ubuntu 安装JDK步骤 ,提示没有那个文件或目录
作为一个程序员,配置环境是最基本的功夫,然而我却捣鼓了一下午,包括安装Ubuntu,安装JDK和配置环境变量. 简单记录下自己的安装过程: 1 下载JDK tar包,使用tar -xzvf jdk* ...
- Mybatis多参传递的四种解决方案
Mybatis多参传递的四种解决方案 代码异常:org.apache.ibatis.binding.BindingException: Parameter 'param' not found. 长时间 ...