GE监护仪B850、B650、B450协议解析

近期在项目需要对接一些医疗设备,成功解析Mindary ,GE,Philipes 监护仪各型号数据,mark一下。

GEB850\650\450,IPM10,PM8000,PM9000,GEDAsh4000,Philips 等

如有技术问题可联系 QQ:2568885920  分享交流经验。

function getData() {
     //console.log(_buffer.length)
     // if(!_buffer.length<_headsize){ //缓冲区长度小于头部长度
     //     return ;
     // }
     //读取数据长度

     while(_buffer.length>=_headsize){
         //console.log('while')
         // console.log(_buffer)
         const headLenBuf=Buffer.alloc(2)    //数据长度四个字节

         _buffer.copy(headLenBuf,0,6,8)
         // console.log(headLenBuf)
         let totallen=headLenBuf.readUInt16BE()
         // let buflen=headLenBuf.readUInt32BE()-_headsize  //实际数据长度
         // console.log(totallen+'/'+_buffer.length)
         // console.log(_buffer)
         if(totallen>_buffer.length-_headsize){
             break;
         }
         //完事帧数据
         let rawData=_buffer.slice(0,totallen+_headsize)
          // parseDataEx(rawData)
         // console.log(rawData)
        // console.log('bz:'+bzValue+",len:"+totallen)/console.log(rawData)

         // parsePackage(rawData)
         // console.log('---------------')
         _event.emit('data',rawData)
         // console.log('buflen:'+_buffer.length)
         parsePackage(_buffer)
         _buffer=_buffer.slice(totallen+_headsize)

         if(_buffer.length>40960) {
             _buffer=_buffer.slice(_buffer.length)
         }

     }

     //console.log('getData')

 }

 function CheckPollPacketActionType(packetbuff) {
     const actionBuf=Buffer.alloc(2)
     packetbuff.copy(actionBuf,0,20,22)
     let action_type=actionBuf.readUInt16BE()
     switch (action_type) {
         case ActionType.NOM_ACT_POLL_MDIB_DATA:
             PollPacketDecoder(packetbuff,44)
             break
         case ActionType.NOM_ACT_POLL_MDIB_DATA_EXT:
             PollPacketDecoder(packetbuff,46)
             break
         default:
             break
     }
 }

 //解析数据
 function PollPacketDecoder(buffer,offset) {
     // let packetbuffer=Buffer.alloc(buffer.length-headsize)
     let head=buffer.slice(0,offset)
     const actionBuf=Buffer.alloc(2)
     buffer.copy(actionBuf,0,20,22)
     let action_type=actionBuf.readUInt16BE()
     let timestamp=getTimeStamp(action_type,head)
     console.log('timestamp:'+timestamp)
     let packetbuffer=buffer.slice(offset,buffer.length)

     DecodePollObjects(packetbuffer,function (count,pollobjects) {
         if(count>0){
             let binReader=pollobjects.scpollarray
             let offset=0
             for(let i=0;i<count;i++){
                 //DecodeSingleContextPollObjects
                 let scpoll=new SingleContextPoll()
                 scpoll.context_id=binReader.readUInt16BE()
                 scpoll.count=binReader.readUInt16BE(2)
                 if(scpoll.count>0)
                     scpoll.length=binReader.readUInt16BE(4)
                 if(scpoll.length>0)
                     scpoll.obpollobjectsarray=binReader.slice(6,scpoll.length+6)

                 binReader=binReader.slice(6+scpoll.length)

                 if(scpoll.count>0){
                     let binReader3=scpoll.obpollobjectsarray
                     //DecodeObservationPollObjects
                     for(let j=0;j<scpoll.count;j++){
                         let obpollobject=new ObservationPoll()

                         obpollobject.obj_handle=binReader3.readUInt16BE()
                         let attributeliststruct=new AttributeList()
                         attributeliststruct.count=binReader3.readUInt16BE(2)

                         if(attributeliststruct.count>0)
                             attributeliststruct.length=binReader3.readUInt16BE(4)
                         if(attributeliststruct.length>0)
                             obpollobject.avaobjectsarray=binReader3.slice(6,6+attributeliststruct.length)
                         binReader3=binReader3.slice(6+attributeliststruct.length)
                         // fs.writeFile('./philips_attributeliststruct.txt', bytesToHex(obpollobject.avaobjectsarray)+'\r\n\r\n', { 'flag': 'a' }, function(err) {
                         //     if (err) {
                         //         throw err;
                         //     }
                         // })

                         if(attributeliststruct.count>0){
                             let binreader4=obpollobject.avaobjectsarray
                             //DecodeAvaObjects
                             for(let k=0;k<attributeliststruct.count;k++){
                                 let avaObject=new Ava()
                                 avaObject.attribute_id=binreader4.readUInt16BE()
                                 avaObject.length=binreader4.readUInt16BE(2)
                                 if(avaObject.length>0){
                                     let avaattribobjects=binreader4.slice(4,4+avaObject.length)
                                     binreader4=binreader4.slice(4+avaObject.length)
                                     switch ( avaObject.attribute_id) {
                                         case AttributeType.NOM_ATTR_ID_LABEL:
                                             break;
                                         case AttributeType.NOM_ATTR_NU_CMPD_VAL_OBS:
                                             ReadCompoundNumericObsValue(avaattribobjects)
                                             break;
                                         case AttributeType.NOM_ATTR_NU_VAL_OBS:
                                             ReadNumericObservationValue(avaattribobjects)
                                             break;
                                         case AttributeType.NOM_ATTR_METRIC_SPECN:
                                             break;
                                         case AttributeType.NOM_ATTR_ID_LABEL_STRING:
                                             // ReadIDLabelString(avaattribobjects)
                                             break;
                                         default:
                                             break;
                                     }
                                 }
                             }
                         }
                     }
                 }


             }
         }
     })
 }
function ReadIDLabelString(buffer) {
     let strmp = new StringMP()
    strmp.length=buffer.readUInt16BE()
    strmp.value1=buffer.slice(2,strmp.length+2).toString()

    // console.log('STRMP:')
    // console.log(strmp)
}

 function  ReadNumericObservationValue(buffer) {
     // console.log('bufferlen:'+buffer.length)
     if(buffer.length<10)
         return
     let NumObjectValue=new NuObsValue()
     NumObjectValue.physio_id=buffer.readUInt16BE()
     NumObjectValue.state=buffer.readUInt16BE(2)
     NumObjectValue.unit_code=buffer.readUInt16BE(4)
     NumObjectValue.value=buffer.readUInt32BE(6)

     let valuestr='-'
     if(NumObjectValue.value!=FLOATTYPE_NAN){
         NumObjectValue.value=FloattypeToValue(NumObjectValue.value)
     }
     else{
         NumObjectValue.value=-1
     }

     switch (NumObjectValue.physio_id) {
         case 19384:{
             datavalue.spo2=NumObjectValue.value
             // console.log(datavalue)
             break
         }
         case 18466:{
             datavalue.ecg=NumObjectValue.value
             // console.log(datavalue)
             break
         }
         case 20490:{
             datavalue.resp=NumObjectValue.value
             break
         }
         case 18949:{
             datavalue.nibp_max=NumObjectValue.value
             // console.log(datavalue)
             break
         }
         case 18950:{
             datavalue.nibp_min=NumObjectValue.value
             // console.log(datavalue)
             break
         }
         default:
             break


     }

     _event.emit('package',datavalue)

     // // console.log('NumObjectValue:')
     //  console.log(NumObjectValue)

 }

 function ReadCompoundNumericObsValue(avaattribobjects){
     let NumObjectValueCmp=new NuObsValueCmp()

     let binreader6 =avaattribobjects;
     NumObjectValueCmp.count=binreader6.readUInt16BE()
     NumObjectValueCmp.length=binreader6.readUInt16BE(2)
     binreader6=binreader6.slice(4)
     if(NumObjectValueCmp.count>0){

         for(let j=0;j<NumObjectValueCmp.count;j++){
             let cmpnumericarrayobject=binreader6.slice(0,10)
             binreader6=binreader6.slice(10)
             ReadNumericObservationValue(cmpnumericarrayobject)
         }
     }
 }

 function DecodePollObjects(packetbuffer,callback) {
     pollObject.count=packetbuffer.readUInt16BE()
     if(pollObject.count>0)
         pollObject.length=packetbuffer.readUInt16BE(2,4)

     if(pollObject.count>0)
         pollObject.scpollarray=packetbuffer.slice(4)
     callback(pollObject.count,pollObject)
 }
 function CheckLinkedPollPacketActionType(packetbuff) {
     const actionBuf=Buffer.alloc(2)
     packetbuff.copy(actionBuf,0,22,24)
     let action_type=actionBuf.readUInt16BE()
     switch (action_type) {
         case ActionType.NOM_ACT_POLL_MDIB_DATA:
             PollPacketDecoder(packetbuff,46)
             break
         case ActionType.NOM_ACT_POLL_MDIB_DATA_EXT:
             PollPacketDecoder(packetbuff,48)
             break
         default:
             break
     }
 }
 function ParseMDSCreateEventReport(packetbuff){

 }
 function parsePackage(buffer) {


     let obj={
         dataType: -1,
         dataLen: buffer.length,
         dataJson: JSON.stringify(Buffer.from(buffer)),
         waveType: -1, //默认为非波形
         //dataJsonAfter:JSON.stringify(data)
     }

     _event.emit('dataCms',obj)

     const data=Buffer.from(buffer)
     // fs.writeFile('./philips2.txt', bytesToHex(data)+'\r\n\r\n', { 'flag': 'a' }, function(err) {
     //     if (err) {
     //         throw err;
     //     }
     // })
     const ropdu_type=Buffer.alloc(2)    //数据长度四个字节
     data.copy(ropdu_type,0,4,6)
     let pdutype=ropdu_type.readUInt16BE()

     switch (pdutype) {
         case ROType.ROIV_APDU:
             //sendmdscreateevent
             ParseMDSCreateEventReport(data)
             break
         case ROType.RORS_APDU:
             CheckPollPacketActionType(data)
             break
         case ROType.ROLRS_APDU:
             CheckLinkedPollPacketActionType(data)
             break
         case ROType.ROER_APDU:
             break
         default:
             break
     }

    
 }
 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值