最近做电信预付费用户话单(ASN.1格式),由于需求比较急,客户要求尽快搞定。这几天忙的焦头烂额,几乎把google上能查到的asn1相关信息都试了一下,今天终于有了一点成就,并生成了个测试话单……
初次尝试:
(Java Asn1 Compiler(JAC)):由于只支持tag值 1-127,所以放弃
例子:
/**
* 话单头部
* @author mizhao
*
*/
public class HeaderNode extends Sequence {
/**
* 记录类型
*/
IA5String recordType = new IA5String("recordType");
/**
* 拜访局代码
*/
IA5String visitBureauCode = new IA5String("visitBureauCode");
/**
* 归属局代码
*/
IA5String belongBureauCode = new IA5String("belongBureauCode");
/**
* 文件序号
*/
IA5String serialNo = new IA5String("serialNo");
/**
* 文件产生日期(YYYYMMDDHHMISS)
*/
IA5String createDate = new IA5String("createDate");
/**
* 文件版本号
*/
IA5String versionNo = new IA5String("versionNo");
public HeaderNode(){
super();
setUpElements();
}
public HeaderNode(String name){
super(name);
setUpElements();
}
protected void setUpElements() {
super.addElement(recordType);
recordType.setTagClass(Tag.APPLICATION);
recordType.setTagNumber(ASN1TagConstants.TAG_RECORD_TYPE);
super.addElement(visitBureauCode);
visitBureauCode.setTagClass(Tag.APPLICATION);
visitBureauCode.setTagNumber(ASN1TagConstants.TAG_VISIT_BUREAU_CODE);
super.addElement(belongBureauCode);
belongBureauCode.setTagClass(Tag.APPLICATION);
belongBureauCode.setTagNumber(ASN1TagConstants.TAG_BELONG_BUREAU_CODE);
super.addElement(serialNo);
serialNo.setTagClass(Tag.APPLICATION);
serialNo.setTagNumber(ASN1TagConstants.TAG_SERIAL_NO);
super.addElement(createDate);
createDate.setTagClass(Tag.APPLICATION);
createDate.setTagNumber(ASN1TagConstants.TAG_CREATE_DATE);
super.addElement(versionNo);
versionNo.setTagClass(Tag.APPLICATION);
versionNo.setTagNumber(ASN1TagConstants.TAG_VERSION_NO);
}
}
测试方法:
//create header
headerNode.recordType.setValue("10");
headerNode.visitBureauCode.setValue("46003114");
headerNode.belongBureauCode.setValue("46003114");
headerNode.serialNo.setValue("1");
headerNode.createDate.setValue("20100817142800");
headerNode.versionNo.setValue("10");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
BerOutputStream out = new BerOutputStream(stream);
headerNode.encode(out);
byte[] bytes = stream.toByteArray();
…………
最终定稿:
bouncycastle:
/**
* 话单记录
* @author mizhao
*
*/
public class BillingRecord extends DERSequence {
/**
* 计费号码
*/
DERIA5String servedNum;
/**
* 用户类型
*/
DERIA5String userType;
/**
* 呼叫类型记录类型
*/
DERIA5String callingType;
/**
* 用户拨打号码方式
*/
DERIA5String callingMeans;
/**
* 主叫号码
*/
DERIA5String callingNum;
/**
* 被叫号码
*/
DERIA5String calledNum;
/**
* 业务开始时间
*/
DERIA5String callBeginTime;
/**
* 业务结束时间
*/
DERIA5String callStopTime;
/**
* 使用时长
*/
DERIA5String callDuration;
/**
* 创建圈子数量
*/
DERInteger createCycleQuantity;
/**
* 圈子性质
*/
DERIA5String cycleAttr;
/**
* SP代码
*/
DERIA5String spCode;
/**
* 费用类型
*/
DERIA5String chargeType;
/**
* 费用
*/
DERInteger fee;
/**
* 优惠费用
*/
DERInteger discount;
public BillingRecord(String servedNum,String userType,String callingType,String callingMeans,String callingNum,String calledNum
,String callBeginTime,String callStopTime,String callDuration,int createCycleQuantity,String cycleAttr,String spCode
,String chargeType,int fee,int discount){
super();
this.servedNum = new DERIA5String(servedNum);
this.userType = new DERIA5String(userType);
this.callingType = new DERIA5String(callingType);
this.callingMeans = new DERIA5String(callingMeans);
this.callingNum = new DERIA5String(callingNum);
this.calledNum = new DERIA5String(calledNum);
this.callBeginTime = new DERIA5String(callBeginTime);
this.callStopTime = new DERIA5String(callStopTime);
this.callDuration = new DERIA5String(callDuration);
this.createCycleQuantity = new DERInteger(createCycleQuantity);
this.cycleAttr = new DERIA5String(cycleAttr);
this.spCode = new DERIA5String(spCode);
this.chargeType = new DERIA5String(chargeType);
this.fee = new DERInteger(fee);
this.discount = new DERInteger(discount);
setUpElements();
}
public void setUpElements(){
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_SERVED_NUM,servedNum));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_USER_TYPE,userType));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_TYPE,callingType));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_MEANS,callingMeans));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_NUM,callingNum));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLED_NUM,calledNum));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALLING_BEGIN_TIME,callBeginTime));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALL_STOP_TIME,callStopTime));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CALL_STOP_TIME,callDuration));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CREATE_CYCLE_QUANTITY,createCycleQuantity));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CYCLE_ATTR,cycleAttr));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_SP_CODE,spCode));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_CHARGE_TYPE,chargeType));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_FEE,fee));
super.addObject(new DERTaggedObject(ASN1TagConstants.TAG_DISCOUNT,discount));
}
}
注:ASN1TagConstants中的常量可以自定义
测试方法:
public static BillingRecord createData(String servedNum,String userType,String callingType,String callingMeans,String callingNum,String calledNum
,String callBeginTime,String callStopTime,String callDuration,int createCycleQuantity,String cycleAttr,String spCode
,String chargeType,int fee,int discount){
BillingRecord billingRecord = new BillingRecord(servedNum, userType, callingType, callingMeans, callingNum, calledNum, callBeginTime, callStopTime, callDuration, createCycleQuantity, cycleAttr, spCode, chargeType, fee, discount);
return billingRecord;
}
public static void main(String[] args) throws Exception {
//数据信息(功能费)
BillingRecord billingRecord = createData("13379035182","1","20","1","13379035182","1188913379035182","20100817142800","20100817142800","0",1,"1","10659181","2",5000,0);
// ByteArrayOutputStream bOut = new ByteArrayOutputStream();
// DEROutputStream dOut = new DEROutputStream(bOut);
// dOut.writeObject(billingRecord );
// byte[] bytes = bOut.toByteArray();
}
分享到:
相关推荐
在实际开发中,了解和掌握这些内容对于高效地利用JAC进行ASN.1解析和编码至关重要。 总之,通过JAC,Java开发者可以轻松地处理ASN.1定义的数据,无论是在网络协议实现、数据交换还是其他需要结构化数据处理的场景中...
开发者可以利用这些信息来调试自己的ASN.1 PER编码实现,确保其在各种边界条件和异常情况下的正确性。 3. 关于代码实现: "test"可能是源代码文件或测试脚本,用于实现或验证ASN.1 PER编码。这个文件可能包含C、...
在大规模系统开发中,利用JAVA等编程语言实现ASN.1编解码器,可以极大地简化通信协议的实现过程。通过ASN.1编译器,可以将ASN.1描述转换为JAVA的数据结构,再通过编解码器生成可传输的位模式,这一过程提高了系统的...
ASN.1(抽象语法标记一号)是一种在通信协议和数据表示中广泛使用的标准,它定义了一种数据结构化的方法,使得不同系统...理解ASN.1、BER和DER的概念,以及如何利用这样的库,对于提升软件的互操作性和安全性至关重要。
这样,你可以利用Java的强大功能处理ASN.1定义的数据结构,同时保持与使用其他支持ASN.1的语言的系统兼容性。 3. **使用方法**:通过命令行接口,JavaAsn1Compiler接收asn.1文件作为输入,并生成对应的Java类。通常...
ASN.1语法工具是开发人员在处理ASN.1定义时的关键助手,它们可以帮助解析、编译和生成与ASN.1定义相关的代码。这些工具通常包括以下功能: 1. **解析器**:解析ASN.1规格,将其转换为内部数据结构,便于进一步处理...
ASN.1的源文件可以被预处理器映射成C、C++或Java等语言的数据结构,供应用程序代码使用,并可以利用支持的运行时库进行编码和解码操作。同时,ASN.1的描述还可以支持XML或TLV格式,以及更为紧凑的压缩编码格式。 ...
总结来说,asn1compiler是一个强大的工具,它利用ANTLR的强大功能,帮助开发者将ASN.1规格转换为可操作的编程语言代码,从而简化了处理ASN.1数据的复杂性,特别是在Java和JavaScript环境中。通过理解和使用asn1...
2. **代码生成**:根据ASN.1规范,生成对应的Java源代码,这些代码包含了解析和编码ASN.1数据的类。 3. **编译支持**:将生成的Java源代码自动编译成可执行的.class文件。 4. **JAR打包**:将编译后的Java类打包成...
总之,这个"asnrt_javase-3.14.15.zip"压缩包提供了一个用于Java环境的ASN.1运行时库,开发者可以利用它来处理符合ASN.1标准的数据,从而在开发网络协议或其他需要高效二进制编码的系统时提升效率。
asn1c的核心功能是将ASN.1定义的模式转换为C或C++语言的源代码,从而使得开发人员可以轻松地在他们的应用中进行数据编码和解码。 ASN.1是一种表示规则的语法,它定义了数据的结构和类型,如整数、字符串、序列、...
本主题聚焦于“使用OSS_tool解析OER编码”,这涉及到ASN.1(Abstract Syntax Notation One)编码规范、JNI(Java Native Interface)以及如何通过这些技术实现跨平台的数据处理。 首先,ASN.1是一种国际标准,它...
为了更好地利用这个asn1库,开发者需要熟悉ASN.1的基本概念,理解如何定义和操作ASN.1数据结构,同时掌握TypeScript的基本语法。通过学习和实践,可以将ASN.1的强大功能整合到TypeScript项目中,实现高效、安全的...
GeoLite2和GeoIP是MaxMind公司开发的两个著名数据库,用于IP地址到地理位置的映射,以及提供网络属性信息,如 Autonomous System Number (ASN)。ASN是互联网上用于识别和管理一组网络的唯一编号,它反映了网络的运营...
4. **asn.1编码解码**:ASN.1(抽象语法标记一号)是定义数据结构的标准,常用于证书和其他安全相关的数据。`org.bouncycastle`库提供了asn.1编码和解码器,方便处理这些数据。 5. **随机数生成器**:库中包含高...
GeoLite2是由MaxMind公司开发的一个免费版本,它提供了与商业GeoIP2数据库相似的功能,但可能更新频率较低,数据精度稍有差距。GeoLite2数据库采用了二进制的mmdb格式,这种格式高效且易于解析,适用于多种编程语言...
在本压缩包“四阶段第1天资料.zip”中,我们聚焦于Java编程语言的第四阶段学习内容,这个阶段通常涵盖了高级特性和实际项目开发的关键技能。描述提及了“项目开发”和“测试五家信息内容”,这暗示我们将探讨如何在...
MIB文件通常使用ASN.1(Abstract Syntax Notation One)语法编写,可以被SNMP代理(agent)理解和执行。`java_SNMP_java-snmp-1.4.2.jar`可能是一个包含Java SNMP库的可执行JAR文件,便于开发者在Java环境中使用SNMP...