Java-Android WebSockets开发:解析CryptoCompare流数据
解析CryptoCompare WebSocket实时数据流格式
嘿,我来帮你拆解下这段CryptoCompare WebSocket流数据的格式和含义,我之前研究过他们的实时数据接口,刚好能给你捋清楚~
首先先把你收到的原始响应贴出来,方便对照:
5~CCCAGG~XRP~USD~4~1521460342~1000~651.6800000000001~214344993~61477290.44395565~40404715.58782694~204630354.90428987~125295222.52928983~Bitfinex~40fe8 5~CCCAGG~BTC~USD~1~8345.49~1521460342~1~8330.5~214344994~73285.13728421592~609108591.9429483~199960.38011137667~1585164124.8472543~fe9 5~CCCAGG~ETH~USD~1~537.41~355733.2471545533~190548675.34079295~1348542.794115353~679086434.31...
核心规则
这段数据是多个独立行情更新条目用空格分隔而成,每个条目内部的字段用~符号拆分,所有条目都以5~CCCAGG~开头——这里的5是CryptoCompare定义的「实时行情更新」消息类型,CCCAGG是他们的聚合数据源(把多个交易所的行情数据合并后的结果)。
逐个字段拆解(以第一个XRP条目为例)
我们把第一个条目5~CCCAGG~XRP~USD~4~1521460342~1000~651.6800000000001~214344993~61477290.44395565~40404715.58782694~204630354.90428987~125295222.52928983~Bitfinex~40fe8拆分后,每个位置的字段含义如下:
- 索引0:
5→ 消息类型,固定为5表示这是实时行情更新(还有其他类型比如0是心跳包,2是订阅确认) - 索引1:
CCCAGG→ 数据源,这里是CryptoCompare的聚合数据源;如果订阅单个交易所,会显示交易所名称(比如Bitfinex) - 索引2:
XRP→ 基础币种(你关注的加密货币) - 索引3:
USD→ 报价币种(计价的法定货币/加密货币) - 索引4:
4→ 更新类型,不同数字对应不同的更新维度:1:简单更新,包含最新成交价、基础成交量等核心数据4:全面更新,包含24h成交量、累计成交额等更多深度数据
- 索引5:
1521460342→ Unix时间戳(秒级),转Java的Date需要乘以1000转成毫秒级 - 索引6:
1000→ 本次更新的基础币种成交量(XRP的数量) - 索引7:
651.6800000000001→ 最新成交价(XRP/USD的当前价格) - 索引8:
214344993→ CryptoCompare内部的更新序号/计数,一般不需要处理 - 索引9:
61477290.44395565→ 24小时内基础币种总成交量(XRP的累计数量) - 索引10:
40404715.58782694→ 24小时内报价币种总成交额(美元计价的累计金额) - 索引11:
204630354.90428987→ 从统计开始至今的基础币种累计成交量 - 索引12:
125295222.52928983→ 从统计开始至今的报价币种累计成交额 - 索引13:
Bitfinex→ 该条行情数据的原始来源交易所 - 索引14:
40fe8→ 内部校验标识,不需要业务处理
快速解析示例(Java-Android)
在Android里可以用字符串拆分快速解析每个字段,比如:
// 假设收到的单条行情数据 String singleEntry = "5~CCCAGG~XRP~USD~4~1521460342~1000~651.6800000000001~214344993~61477290.44395565~40404715.58782694~204630354.90428987~125295222.52928983~Bitfinex~40fe8"; String[] fields = singleEntry.split("~"); // 解析核心字段 int messageType = Integer.parseInt(fields[0]); String baseCoin = fields[2]; String quoteCoin = fields[3]; double lastPrice = Double.parseDouble(fields[7]); long updateTime = Long.parseLong(fields[5]) * 1000; // 转成Java毫秒时间戳 // 其他字段按需解析即可
内容的提问来源于stack exchange,提问作者Aftab Safdar
相关产品推荐
相关产品推荐

