近期在项目需要对接一些医疗设备,成功解析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
}
}