fix协议介绍2-登入消息
2013-12-03 12:56
323 查看
Logon消息结构:
Logon消息故名思议就是登入用的消息.
MsgType=A(35=A);
一个封装的例子:
数据例子:
特别字段说明:
ield or Component | Field Name | FIXML name | Req'd | Comments | Depr. |
---|
Component | StandardHeader | BaseHeader | MsgType = A |
98 | EncryptMethod | (Always unencrypted) | ||||
108 | HeartBtInt | Note same value used by both sides | ||||
95 | RawDataLength | @RawDataLength | Required for some authentication methods | |||
96 | RawData | @RawData | Required for some authentication methods | |||
141 | ResetSeqNumFlag | Indicates both sides of a FIX session should reset sequence numbers | ||||
789 | NextExpectedMsgSeqNum | Optional, alternative via counterparty bi-lateral agreement message gap detection and recovery approach (see "Logon Message NextExpectedMsgSeqNum Processing" section) | ||||
383 | MaxMessageSize | Can be used to specify the maximum number of bytes supported for messages received |
Component | MsgTypeGrp | MsgTypeGrp |
464 | TestMessageIndicator | Can be used to specify that this FIX session will be sending and receiving "test" vs. "production" messages. | ||||
553 | Username | @Username | ||||
554 | Password | @Password | Note: minimal security exists without transport-level encryption. | |||
925 | NewPassword | @NewPassword | Specifies a new password for the FIX Logon. The new password is used for subsequent logons. | |||
1400 | EncryptedPasswordMethod | @EncPwdMethod | ||||
1401 | EncryptedPasswordLen | |||||
1402 | EncryptedPassword | @EncPwd | ||||
1403 | EncryptedNewPasswordLen | |||||
1404 | EncryptedNewPassword | @EncNewPwd | Encrypted new password- encrypted via the method specified in the field EncryptedPasswordMethod(1400) | |||
1409 | SessionStatus | @SessStat | Session status at time of logon. Field is intended to be used when the logon is sent as an acknowledgement from acceptor of the FIX session. | |||
1137 | DefaultApplVerID | @DefApplVerID | The default version of FIX messages used in this session. | |||
1407 | DefaultApplExtID | @DfltApplExtID | The default extension pack for FIX messages used in this session | |||
1408 | DefaultCstmApplVerID | The default custom application version (dictionary) for FIX messages used in this session | ||||
58 | Text | @Txt | Available to provide a response to logon when used as a logon acknowledgement from acceptor back to the logon initiator. | |||
354 | EncodedTextLen | @EncTxtLen | Must be set if EncodedText field is specified and must immediately precede it. | |||
355 | EncodedText | @EncTxt | Encoded (non-ASCII characters) representation of the Text field in the encoded format specified via the MessageEncoding field. |
Component | StandardTrailer |
MsgType=A(35=A);
一个封装的例子:
package cs.mina.codec.msg; import java.util.HashSet; import java.util.List; import java.util.Set; import cs.mina.exception.InValidDataException; /* *@author(huangxiaoping) *@date 2013-10-25 */ public class LogonMsg extends BaseMsg { private Tag encryptMethod=new Tag("98","int",true); private Tag heartBtInt=new Tag("108","int",true); private Tag rawDataLength=new Tag("95","Length",false); private Tag rawData=new Tag("96","data",false); private Tag resetSeqNumFlag=new Tag("141","Boolean",false); private Tag nextExpectedMsgSeqNum=new Tag("789","SeqNum",true); private Tag maxMessageSize=new Tag("383","Length",false); private Tag msgTypeGrpTag=new MsgTypeGrpTag(); private Tag testMessageIndicator=new Tag("464","Boolean",false); private Tag username=new Tag("553","String",false); private Tag password=new Tag("554","String",false); private Tag defaultApplVerID=new Tag("1137","String",true); private Tag text=new Tag("58","String",false); private Tag newPassword=new Tag("529","String",false); private Tag encryptedPasswordMethod=new Tag("1400","int",false); private Tag encryptedPasswordLen=new Tag("1401","Length",false); private Tag encryptedPassword=new Tag("1402","data",false); private Tag encryptedNewPasswordLen=new Tag("1403","Length",false); private Tag encryptedNewPassword=new Tag("1404","data",false); private Tag SessionStatus=new Tag("1409","int",false); private Tag defaultApplExtID=new Tag("1407","int",false); private Tag defaultCstmApplVerID=new Tag("1408","String",false); private Tag encodedTextLen=new Tag("354","Length",false); private Tag encodedText=new Tag("355","data",false); public LogonMsg(){ this.getHeadEntity().getMsgType().setTagValue("A"); tagIdsSet.add("98"); tagIdsSet.add("108"); tagIdsSet.add("95"); tagIdsSet.add("96"); tagIdsSet.add("141"); tagIdsSet.add("789"); tagIdsSet.add("383"); tagIdsSet.add("464"); tagIdsSet.add("553"); tagIdsSet.add("554"); tagIdsSet.add("1137"); tagIdsSet.add("372"); tagIdsSet.add("385"); tagIdsSet.add("1130"); tagIdsSet.add("1131"); tagIdsSet.add("384"); tagIdsSet.add("58"); tagIdsSet.add("529"); tagIdsSet.add("1400"); tagIdsSet.add("1401"); tagIdsSet.add("1402"); tagIdsSet.add("1403"); tagIdsSet.add("1404"); tagIdsSet.add("1409"); tagIdsSet.add("1407"); tagIdsSet.add("1408"); tagIdsSet.add("354"); tagIdsSet.add("355"); this.bodyEntity.getBodyTagList().add(encryptMethod); this.bodyEntity.getBodyTagList().add(heartBtInt); this.bodyEntity.getBodyTagList().add(rawDataLength); this.bodyEntity.getBodyTagList().add(rawData); this.bodyEntity.getBodyTagList().add(resetSeqNumFlag); this.bodyEntity.getBodyTagList().add(nextExpectedMsgSeqNum); this.bodyEntity.getBodyTagList().add(maxMessageSize); this.bodyEntity.getBodyTagList().add(msgTypeGrpTag); this.bodyEntity.getBodyTagList().add(testMessageIndicator); this.bodyEntity.getBodyTagList().add(username); this.bodyEntity.getBodyTagList().add(password); this.bodyEntity.getBodyTagList().add(defaultApplVerID); this.bodyEntity.getBodyTagList().add(text); this.bodyEntity.getBodyTagList().add(newPassword); this.bodyEntity.getBodyTagList().add(encryptedPasswordMethod); this.bodyEntity.getBodyTagList().add(encryptedPasswordLen); this.bodyEntity.getBodyTagList().add(encryptedPassword); this.bodyEntity.getBodyTagList().add(encryptedNewPasswordLen); this.bodyEntity.getBodyTagList().add(encryptedNewPassword); this.bodyEntity.getBodyTagList().add(SessionStatus); this.bodyEntity.getBodyTagList().add(defaultApplExtID); this.bodyEntity.getBodyTagList().add(defaultCstmApplVerID); this.bodyEntity.getBodyTagList().add(encodedTextLen); this.bodyEntity.getBodyTagList().add(encodedText); } private Set<String> tagIdsSet=new HashSet<String>(); @Override public void validate() { this.headEntity.validate(); List<Tag> bodyTagList=this.bodyEntity.getBodyTagList(); for(int i=0;i<bodyTagList.size();i++){ bodyTagList.get(i).validate(); } this.tailerEntity.validate(); int encryptMethodType= Integer.parseInt(encryptMethod.getTagValue()); if(encryptMethodType<0||encryptMethodType>6){ throw new InValidDataException("encryptMethod错误"); } if(!MsgUtil.applVerID.contains(defaultApplVerID.getTagValue())){ throw new InValidDataException("defaultApplVerID错误"); } if(SessionStatus.getTagValue()!=null){ if(!MsgUtil.sessionStatus.contains(SessionStatus.getTagValue())){ throw new InValidDataException("sessionStatus错误"); } } } public Tag getEncryptMethod() { return encryptMethod; } public void setEncryptMethod(Tag encryptMethod) { this.encryptMethod = encryptMethod; } public Tag getHeartBtInt() { return heartBtInt; } public void setHeartBtInt(Tag heartBtInt) { this.heartBtInt = heartBtInt; } public Tag getRawDataLength() { return rawDataLength; } public void setRawDataLength(Tag rawDataLength) { this.rawDataLength = rawDataLength; } public Tag getRawData() { return rawData; } public void setRawData(Tag rawData) { this.rawData = rawData; } public Tag getResetSeqNumFlag() { return resetSeqNumFlag; } public void setResetSeqNumFlag(Tag resetSeqNumFlag) { this.resetSeqNumFlag = resetSeqNumFlag; } public Tag getNextExpectedMsgSeqNum() { return nextExpectedMsgSeqNum; } public void setNextExpectedMsgSeqNum(Tag nextExpectedMsgSeqNum) { this.nextExpectedMsgSeqNum = nextExpectedMsgSeqNum; } public Tag getMaxMessageSize() { return maxMessageSize; } public void setMaxMessageSize(Tag maxMessageSize) { this.maxMessageSize = maxMessageSize; } public Tag getMsgTypeGrpTag() { return msgTypeGrpTag; } public void setMsgTypeGrpTag(Tag msgTypeGrpTag) { this.msgTypeGrpTag = msgTypeGrpTag; } public Tag getTestMessageIndicator() { return testMessageIndicator; } public void setTestMessageIndicator(Tag testMessageIndicator) { this.testMessageIndicator = testMessageIndicator; } public Tag getUsername() { return username; } public void setUsername(Tag username) { this.username = username; } public Tag getPassword() { return password; } public void setPassword(Tag password) { this.password = password; } public Tag getDefaultApplVerID() { return defaultApplVerID; } public void setDefaultApplVerID(Tag defaultApplVerID) { this.defaultApplVerID = defaultApplVerID; } @Override public void decodeBody() { Set<String> already=new HashSet<String>(); String[] bodyItems=this.body.split(BaseMsg.SOH); for(int i=0;i<bodyItems.length;i++){ String[]tagItems=bodyItems[i].split("="); if(tagItems.length!=2){ throw new InValidDataException("消息格式错误"); } String tagId=tagItems[0]; if(already.contains(tagId)){ throw new InValidDataException("消息格式错误"); } already.add(tagId); if(this.tagIdsSet.contains(tagId)){ if(tagId.equals("384")){ int skip=decodeGroup384(this.body); i=i+skip-1; }else{ List<Tag> tagList=this.bodyEntity.getBodyTagList(); for(int j=0;j<tagList.size();j++){ Tag tag=tagList.get(j); if(tag.getTagId().equals(tagId)){ tag.setTagValue(tagItems[1]); break; } } } }else{ throw new InValidDataException("消息格式错误,"+tagId+"不在消息体内"); } } } private int decodeGroup384(String body){ int index=body.indexOf("384="); String rest=body.substring(index); String[]tagItems=rest.split(BaseMsg.SOH); String[] numTagItems=tagItems[0].split("="); if(numTagItems.length!=2){ throw new InValidDataException("消息格式错误"); } if(!"384".equals(numTagItems[0])){ throw new InValidDataException("消息格式错误"); } int num=Integer.parseInt(numTagItems[1]); int count=1; int whileCount=0; ((MsgTypeGrpTag)this.msgTypeGrpTag).setTagValue(num+""); boolean end=false; for(int i=0;i<num;i++){ if(end){ if(i!=num){ throw new InValidDataException("消息格式错误"); }else{ break; } } MsgTypeGrp msgTypeGrp=new MsgTypeGrp(); ((MsgTypeGrpTag)this.msgTypeGrpTag).getChildren().add(msgTypeGrp); while(true){ if(whileCount>=4){ whileCount=0; break; } String[] tagIt=tagItems[count].split("="); if(tagIt.length!=2){ throw new InValidDataException("消息格式错误"); } if(whileCount==0){ if(!MsgTypeGrpTag.first.equals(tagIt[0])){ throw new InValidDataException("消息格式错误"); } } if(MsgTypeGrp.tagIdsSet.contains(tagIt[0])){ List<Tag> tagList=msgTypeGrp.getTagList(); for(int j=0;j<tagList.size();j++){ Tag groupTag=tagList.get(j); if(groupTag.getTagId().equals(tagIt[0])){ groupTag.setTagValue(tagIt[1]); break; } } if(tagItems.length>count+1){ String[] nextTagIt=tagItems[count+1].split("="); if(nextTagIt.length!=2){ throw new InValidDataException("消息格式错误"); } if(MsgTypeGrpTag.first.equals(nextTagIt[0])){ whileCount=0; count++; break; } } count++; whileCount++; }else{ end=true; break; } } } return count; } public Set<String> getTagIdsSet() { return tagIdsSet; } public void setTagIdsSet(Set<String> tagIdsSet) { this.tagIdsSet = tagIdsSet; } public Tag getText() { return text; } public void setText(Tag text) { this.text = text; } public Tag getNewPassword() { return newPassword; } public void setNewPassword(Tag newPassword) { this.newPassword = newPassword; } public Tag getEncryptedPasswordMethod() { return encryptedPasswordMethod; } public void setEncryptedPasswordMethod(Tag encryptedPasswordMethod) { this.encryptedPasswordMethod = encryptedPasswordMethod; } public Tag getEncryptedPasswordLen() { return encryptedPasswordLen; } public void setEncryptedPasswordLen(Tag encryptedPasswordLen) { this.encryptedPasswordLen = encryptedPasswordLen; } public Tag getEncryptedPassword() { return encryptedPassword; } public void setEncryptedPassword(Tag encryptedPassword) { this.encryptedPassword = encryptedPassword; } public Tag getEncryptedNewPasswordLen() { return encryptedNewPasswordLen; } public void setEncryptedNewPasswordLen(Tag encryptedNewPasswordLen) { this.encryptedNewPasswordLen = encryptedNewPasswordLen; } public Tag getEncryptedNewPassword() { return encryptedNewPassword; } public void setEncryptedNewPassword(Tag encryptedNewPassword) { this.encryptedNewPassword = encryptedNewPassword; } public Tag getSessionStatus() { return SessionStatus; } public void setSessionStatus(Tag sessionStatus) { SessionStatus = sessionStatus; } public Tag getDefaultApplExtID() { return defaultApplExtID; } public void setDefaultApplExtID(Tag defaultApplExtID) { this.defaultApplExtID = defaultApplExtID; } public Tag getDefaultCstmApplVerID() { return defaultCstmApplVerID; } public void setDefaultCstmApplVerID(Tag defaultCstmApplVerID) { this.defaultCstmApplVerID = defaultCstmApplVerID; } public Tag getEncodedTextLen() { return encodedTextLen; } public void setEncodedTextLen(Tag encodedTextLen) { this.encodedTextLen = encodedTextLen; } public Tag getEncodedText() { return encodedText; } public void setEncodedText(Tag encodedText) { this.encodedText = encodedText; } }
数据例子:
输入: 8=FIXT.1.1_9=86_35=A_49=CO99999901_56=HKEXCO_34=100_52=20131126-16:44:17.542_98=0_108=5_789=11_1137=9_10=028_ 输出: 8=FIXT.1.1_9=117_35=A_49=HKEXCO_56=CO99999901_34=13_52=20131126-08:45:59.135_1128=9_58=Session Active_98=0_108=20_789=1_1137=9_1409=0_10=166_8=FIXT.1.1_9=110_35=4_49=HKEXCO_56=CO99999901_34=11_52=20131126-08:45:59.135_1128=9_43=Y_122=20131126-08:45:59.135_36=14_123=Y_10=024_
特别字段说明:
相关文章推荐
- fix协议介绍8-Reject消息
- fix协议介绍3-登出消息
- fix协议介绍5-测试消息
- fix协议介绍6-重发消息
- ESFramework介绍之(1)――网络通信消息协议接口IContract
- fix协议封装挑战-将消息字符串解析为实体
- [中间件] 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
- fix协议介绍9-下单(NewOrderSingle)
- 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
- Fix协议介绍10-取消订单请求(OrderCancelRequest)
- fix协议介绍11-修改订单(OrderCacelReplaceRequest)
- fix协议介绍14-批量取消订单(OrderMassCancelRequest)
- 关于TCP和UDP协议消息保护边界的介绍
- fix协议介绍12-取消订单被拒(OrderCacelReject)
- fix协议介绍15-批量取消订单执行报告(OrderMassCancelReport)
- fix协议介绍13-执行报告(ExecutionReport)
- fix协议介绍16-查询叮当(quote)
- Fix协议封装挑战-消息处理
- fix协议介绍17-查询订单状态报告(QuoteStateReport)
- fix协议介绍18-取消查询订单(QuoteCancel)