Node People Magic

    @36node/shanghaibus-messenger
    TypeScript icon, indicating that this package has built-in type declarations

    0.7.1 • Public • Published

    @36node/shanghaibus-messenger

    基于 kafka 的消息接收 clinet

    version downloads

    Install

    yarn add @36node/shanghaibus-messenger

    使用

    import Messenger from "shanghaibus-messenger";
    
    const client = new Messenger(
      {
        "group.id": "shanghaibus-core",
        "metadata.broker.list": "localhost:9092",
      },
      ["TBOX"]
    );
    
    /** 订阅全部 rdb log */
    client.onRdbData(log => {
      console.log(log.vin, "rdb log comming");
    });
    
    /** 按照 command 订阅 rdb log */
    client.onRdbData(
      log => {
        console.log(log.command);
      },
      ["REALTIME_REPORT", "REISSUE_REPORT"]
    );
    
    /**订阅 request error 类型log */
    client.onRequestError(log => {
      console.log("Request error log comming");
    });
    
    /** 订阅 invalid log */
    client.onInvalidLog(log => {
      console.log("Invalid log comming");
    });

    messenger 解析后日志的基本格式

    {
      recordId?: string, // 由原始日志的 session + seq 组成, 对于 RDB_DATA 类型的日志才有,其他类型的日志没有这条记录
      cost?: number, // 解析日志的耗时
      data?: string, // 原始二进制日志内容(二进制字符串)
      origin?: string,  // 二进制字符串
      partial?: boolean, // 是否完全
      type: string, // 日志类型
      payload: object, // 日志的内容, 对于 REALTIME_REPORT, REISSUE_REPORT, payload 为 record
      vin?: string, // 车辆vin码, 只在 RDB_DATA 类型日志中存在
      command?: string, // 日志的命令, 只在 RDB_RATA 类型日志中存在
      error?: string, // 日志解析时发生的错误,只在 INVALID_LOG 类型中存在
      reportedAt: string, // 日志发送的时间,为 ISO string
      kafka_message: string, // kafka 传递过来的原始日志
    }

    日志类型(type)

    类型 说明
    RDB_DATA 车辆信息日志
    REQUEST_ERROR 日志产生时发生的错误
    INVALID_ERROR messenger 无法正确解析的日志

    命令(command)

    在 RDB_DATA 类型的日志中,按 command 可分为:

    类型 说明
    VEHICLE_LOGIN 车辆登入
    VEHICLE_LOGOUT 车辆登出
    HEARTBEAT 心跳
    REALTIME_REPORT 实时数据上报
    REISSUE_REPORT 数据补发

    record 格式

    将原始的车辆数据进行解析,形成 record

    {
      id:string, // 车辆vin
      at:string, // 信息采集时间
      vehicle?: object, // 整车数据, 具体数据内容见下原始日志格式说明
      montors?: [object], // 电机数据, 具体数据内容见下原始日志格式说明
      extreme?: object, // 极值数据, 具体数据内容见下原始日志格式说明
      location?: object, // 车辆位置信息,用 GCJ-02坐标系 表示
      alarm?: [string], // 警报数据, 为警报码的数组
      customExt?: object, // 自定义数据,具体数据内容见下原始日志格式说明
      adas?: [object], // 补充协议数据, item.type === "ADAS" 具体数据内容见下原始日志格式说明
      tens?: [object], // 补充协议数据,item.type === "TEN_SECONDS" 的数据
    }

    原始日志格式说明

    原始日志指从 kafka 接收到的未经处理的日志

    0 日志基本格式

    {
      level: number, // 日志级别
      time: number, // 日志产生时间,unix时间戳
      msg: string, // 日志信息 "handle rdb data", "request error", "session closed" 等
      request?: object, // 日志的信息,可选
      error?: object, // 错误信息, 可选
      session?: string, // 终端的session
      seq?: string, // 当前session下的消息编号
    }

    1 车辆实时信息日志(Handle rdb data)

    1.1 车辆登入 (command=VEHICLE_LOGIN)

    {
      level: 30, // 日志级别
      time: 1540902956033, // 日志时间戳
      msg: "handle rdb data", // 日志信息
      pid: 17,
      hostname: "d35202af7c8b-shanghaibus-v0-32960-1",
      session: "phJhOh3EiUF",
      seq: 2,
      cost: 0,
      origin:
        "232301fe4c5a595442474257364a3130313431393401001e120a1e14233600fd383938363034303231303137303031373937373901005c",
      request: { // 日志具体内容
        command: "VEHICLE_LOGIN",
        flag: "COMMAND",
        vin: "LZYTBGBW6J1014194", // 车辆vin码
        encrypt: "NONE",
        length: 30,
        body: {
          at: "2018-10-30T12:35:54.000Z", // 数据上报时间
          sn: 253,
          iccid: "89860402101700179779",
          subSysNm: 1,
          subSysNmLen: 0,
          subSysSn: [],
        },
      },
      response: "232301014c5a595442474257364a31303134313934010006120a1e1423364f",
      v: 1,
    }

    request body 格式说明:

    字段 数据表示内容 数据类型 描述及要求
    at 数据采集时间 date ISO string 数据采集的原始时间
    sn 登入流水号 integer 车载终端每登入一次登入流水号自动加 1,从 1 开始循环累加,最大值 65531,循环周期为天
    iccid ICCID string SIM 卡 ICCID 号(ICCID 应为终端从 SIM 卡获取的值,不应该人为填写或修改)
    subSysNm 可充电储能子系统数 integer 可充电储能子系统数 n,有效值范围:0~250
    subSysNmLen 可充电储能系统编码长度 integer 可充电储能系统编码长度 m,有效值范围:0~50,“0”表示不上传该编码
    subSysSn 可充电储能系统编码 [string] 可充电储能系统编码宜为终端从车辆获取的值

    1.2 车辆登出 (command=VEHICLE_LOGOUT)

    {
      level: 30,
      time: 1540902976674,
      msg: "handle rdb data",
      pid: 17,
      hostname: "d35202af7c8b-shanghaibus-v0-32960-1",
      session: "fcG8xIaC4C8",
      seq: 470,
      cost: 0,
      origin: "232304fe4c53464430333230344a43303031353935010008120a1e1424110014e9",
      request: {
        command: "VEHICLE_LOGOUT",
        flag: "COMMAND",
        vin: "LSFD03204JC001595",
        encrypt: "NONE",
        length: 8,
        body: { at: "2018-10-30T12:36:17.000Z", sn: 20 },
      },
      response: "232304014c53464430333230344a43303031353935010006120a1e1424110c",
      v: 1,
    }

    request body 格式说明:

    数据表示内容 字段 数据类型 描述及要求
    登出时间 at date ISO string 数据采集的原始时间
    登出流水号 sn integer 登出流水号和当前登入流水号一致

    1.3 实时信息上报 (command=REALTIME_REPORT)

    {
      level: 30,
      time: 1540902953574,
      msg: "handle rdb data",
      pid: 17,
      hostname: "d35202af7c8b-shanghaibus-v0-32960-1",
      session: "z2-NYoZCXXc",
      seq: 749482,
      cost: 1,
      origin:
        "232302fe4c5a59544147425732453130353434393101007f120a1e142400010103010000001b390b164925da39023e41b6000102010104284e204e2028000027100500073d270801dcda6a06013f0cbf015b0cb2010246014e400700000000000000000080003000000003e803e8ffffffffffffffffffffffffffff1649feca00000000000000000000ffff00000000ff280028282802c7",
      request: {
        command: "REALTIME_REPORT",
        flag: "COMMAND",
        vin: "LZYTAGBW2E1054491",
        encrypt: "NONE",
        length: 127,
        body: {
          at: "2018-10-30T12:36:00.000Z",
          items: [
            {
              type: "VEHICLE",
              status: "ON",
              chargeStatus: "UNCHARGED",
              mode: "ELECTRIC",
              speed: 0,
              mileage: 178407.5,
              voltage: 570.5,
              current: -31,
              soc: 0.57,
              dcStatus: "OFF",
              shift: "D",
              resistance: 16822,
              aptv: 0,
              brake: 0.01,
            },
            {
              type: "MOTOR",
              count: 1,
              motors: [
                {
                  no: 1,
                  status: "READY",
                  controlTemp: 0,
                  speed: 0,
                  torque: 0,
                  temp: 0,
                  voltage: 0,
                  current: 0,
                },
              ],
            },
            { type: "LOCATION", state: 0, lng: 121.4482, lat: 31.25105 },
            {
              type: "EXTREME",
              maxVoltageSubSysNo: 1,
              maxVoltageSingNo: 63,
              maxVoltage: 3.263,
              minVoltageSubSysNo: 1,
              minVoltageSingNo: 91,
              minVoltage: 3.25,
              maxNtcSubSysNo: 1,
              maxNtcNo: 2,
              maxNtc: 30,
              minNtcSubSysNo: 1,
              minNtcNo: 78,
              minNtc: 24,
            },
            {
              type: "ALARM",
              maxLevel: 0,
              uas: {
                ressChargeOver: 0,
                motorTemp: 0,
                highVolMuteStatus: 0,
                motorControlTemp: 0,
                dcdcStatus: 0,
                brake: 0,
                dcdcTemp: 0,
                insulation: 0,
                batteryBadConsistency: 0,
                ressNotMatch: 0,
                socJump: 0,
                socOver: 0,
                batteryLow: 0,
                batteryOver: 0,
                socLow: 0,
                ressVolLow: 0,
                ressVolOver: 0,
                batteryTempOver: 0,
                tempDiff: 0,
              },
              ressLen: 0,
              ressList: [],
              mortorLen: 0,
              mortorList: [],
              engineLen: 0,
              engineList: [],
              otherLen: 0,
              otherList: [],
            },
            {
              type: "CUSTOM_EXT",
              dataLen: 48,
              pressure1: 0,
              pressure2: 0,
              batteryVoltage: 0,
              dcov: -900,
              dcoc: -900,
              cv: 570.5,
              rc: 5522.6,
              cp: 0,
              totalCharge: 0,
              totalDischarge: 0,
              bpiRes: 0,
              bniRes: 0,
              motorContTemp: 0,
              airMode: "OFF",
              airTemp: 0,
              insideTemp: 0,
              outsideTemp: 0,
              middleDoorStatus: "CLOSE",
              frontDoorStatus: "CLOSE",
              handbrakeStatus: "OFF",
              keyPosition: "ON",
            },
          ],
        },
      },
      response: "232302014c5a595441474257324531303534343931010006120a1e14240071",
      v: 1,
    }

    request body 格式说明:

    数据表示内容 字段 数据类型 描述及要求
    登出时间 at date ISO string 数据采集的原始时间
    实时车辆数据 items [object] 车辆实时数据, 具体定义见下
    1.3.1 整车数据 (type=VEHICLE)
    {
      type: "VEHICLE",
      status: "ON",
      chargeStatus: "UNCHARGED",
      mode: "ELECTRIC",
      speed: 0,
      mileage: 178407.5,
      voltage: 570.5,
      current: -31,
      soc: 0.57,
      dcStatus: "OFF",
      shift: "D",
      resistance: 16822,
      aptv: 0,
      brake: 0.01,
    }

    数据说明:

    字段 数据内容 类型 有效值范围 分辨率 说明
    status 车辆状态 string enum "ON": 启动, "OFF": 熄火, "OTHER": 其他
    chargeStatus 充电状态 string enum "PARK_CHARGING": 停车充电, "MOVE_CHARGING": 行驶充电, "UNCHARGED": 未充电状态, "COMPETE": 充电完成
    mode 运行模式 string enum "ELECTRIC": 电动, "MIXED": 混动, "FUEL": 燃油
    speed 车速 float 0 ~220 0.1km/h
    mileage 累计里程 float 0 ~ 9999999 0.1km
    voltage 总电压 float 0 ~ 10000 0.1V
    current 总电流 float 0~20000 0.1A
    soc SOC float 0~1 0.01
    dcStatus DC-OC 状态 string "ON":工作, "OFF": 断开
    shift 档位 enum
    resistance 绝缘电阻 integer 0~60000 1kΩ
    aptv 加速踏板行程值 float 0~1 0.01
    break 制动踏板状态 float 0~1 0.01
    1.3.2 驱动电机数据 (type=MOTOR)
    {
      type: "MOTOR",
      count: 1,
      motors: [
        {
          no: 1,
          status: "READY",
          controlTemp: 0,
          speed: 0,
          torque: 0,
          temp: 0,
          voltage: 0,
          current: 0,
        },
      ],
    }

    数据说明

    字段 数据内容 类型 有效值范围
    count 驱动电机个数 integer 1~253
    motors 驱动电机总成信息列表 [object]

    每个驱动电机数据说明:

    字段 数据内容 类型 有效值范围 分辨率 说明
    no 驱动电机序号 integer 1~253
    status 驱动电机状态 enum string "CONSUMPTION": 耗电, "GENERATION": 发电, "OFF": 关闭状态, "READY": 准备
    controlTemp 驱动电机控制器温度 float 0~250 1℃
    speed 驱动电机转速 integer 0~65531 1r/min
    torque 驱动电机转矩 integer 0~65531 0.1N·m
    temp 驱动电机温度 integer 0~250 1℃
    voltage 电机控制器输入电压 integer 0~60000 0.1V
    current 电机控制器直线母线电流 integer 0~20000 0.1A
    1.3.3 车辆位置数据 (type=LOCATION)

    原始日志中的位置坐标系使用的是 WGS-84 原始坐标系, 在解析成 record 之后会转变成 GCJ-02 坐标系

    {
      type: "LOCATION",
      state: 0,
      lng: 121.4482,
      lat: 31.25105
    }

    数据说明:

    字段 数据内容 类型 说明
    state 定义状态 integer 0:有效定位;1:无效定位
    lng 经度 float 以度为单位的纬度值乘以 10^6,精度到万分之一度
    lat 纬度 float 以度为单位的纬度值乘以 10^6,精度到万分之一度
    1.3.4 极值数据 (type=EXTREME)
    {
      type: "EXTREME",
      maxVoltageSubSysNo: 1,
      maxVoltageSingNo: 63,
      maxVoltage: 3.263,
      minVoltageSubSysNo: 1,
      minVoltageSingNo: 91,
      minVoltage: 3.25,
      maxNtcSubSysNo: 1,
      maxNtcNo: 2,
      maxNtc: 30,
      minNtcSubSysNo: 1,
      minNtcNo: 78,
      minNtc: 24,
    }

    数据说明:

    字段 数据内容 类型 有效值范围 分辨率 说明
    maxVoltageSubSysNo 最高电压电池子系统号 integer 1~250
    maxVoltageSingNo 最高电压电池单体代号 integer 1~250
    maxVoltage 电池单体电压最高值 float 1~15000 0.001V
    minVoltageSubSysNo 最低电压电池子系代号 integer 1~250
    minVoltageSingNo 最低电压电池单体代号 integer 1~250
    minVoltage 电池单体最低电压值 float 1~15000 0.001V
    maxNtcSubSysNo 最高温度子系统号 integer 1~250
    maxNtcNo 最高温度探针序号 integer 1~250
    maxNtc 最高温度值 integer 1~250 1℃
    minNtcSubSysNo 最低温度子系统号 integer 1~250
    minNtcNo 最低温度探针序号 integer 1~250
    minNtc 最低温度值 integer 1~250 1℃
    1.3.5 报警数据 (type=ALARM)
    {
      type: "ALARM",
      maxLevel: 0,
      uas: {
        ressChargeOver: 0,
        motorTemp: 0,
        highVolMuteStatus: 0,
        motorControlTemp: 0,
        dcdcStatus: 0,
        brake: 0,
        dcdcTemp: 0,
        insulation: 0,
        batteryBadConsistency: 0,
        ressNotMatch: 0,
        socJump: 0,
        socOver: 0,
        batteryLow: 0,
        batteryOver: 0,
        socLow: 0,
        ressVolLow: 0,
        ressVolOver: 0,
        batteryTempOver: 0,
        tempDiff: 0,
      },
      ressLen: 0,
      ressList: [],
      mortorLen: 0,
      mortorList: [],
      engineLen: 0,
      engineList: [],
      otherLen: 1,
      otherList: [{"type":16,"code":5126,"level":2}],
    }

    数据说明:

    字段 数据内容 类型 有效值范围 说明
    maxAlarmLevel 最高报警等级 integer 0~3
    uas 通用报警标志 object 见通用报警标志位定义
    ressLen 可充电储能装置故障总数 N1 integer 0~255
    lessList 可充电储能装置故障代码列表 [object] 见故障定义
    mortorLen 驱动电机故障总数 N2 integer 0~255
    mortorList 驱动电机故障代码列表 [object] 见故障定义
    engineLen 发动机故障总数 N3 integer 0~255
    engineList 发动机故障列表 [object] 见故障定义
    otherLen 其他故障总数 N4 integer 0~255
    otherLis 其他故障代码列表 [object] 见故障定义

    通用警报位定义及解析:

    export const ALARM_FLAGS = {
      tempDiff: [0x10131101, 0x10131202, 0x10131202], // 温度差异报警
      batteryTempOver: [0x10131501, 0x10131603, 0x10131603], // 电池高温报警
      ressVolOver: [0x10131901, 0x10131901, 0x10131901], // 车载储能装置类型过压报警
      ressVolLow: [0x10131801, 0x10131801, 0x10131801], // 车载储能装置类型欠压报警
      socLow: [0x10131701, 0x10131701, 0x10131701], // SOC 低报警
      batteryOver: [0x10130b01, 0x10130c03, 0x10130c03], // 单体电池过压报警
      batteryLow: [0x10130d01, 0x10130e02, 0x10130e02], // 单体电池欠压报警
      batteryBadConsistency: [0x10131c02, 0x10131c02, 0x10131c02], // 电池单体一致性差报警
      insulation: [0x100aa602, 0x100aa602, 0x100aa703], // 绝缘报警
      dcdcTemp: [0x10120e01, 0x10120d02, 0x10120d02], //  DC-DC 温度报警
      brake: [0x10100302, 0x10100302, 0x10100302], // 制动系统报警
      dcdcStatus: [0x10110f01, 0x10111002, 0x10111002], // DC-DC 状态报警
      motorControlTemp: [0x10140901, 0x10140901, 0x10140802], // 驱动电机控制器温度报警
      highVolMuteStatus: [0x100a0a03, 0x100a0a03, 0x100a0a03], // 高压互锁状态报警
      motorTemp: [0x10140701, 0x10140602, 0x10140602], // 驱动电机温度报警
      ressChargeOver: [0x10130002, 0x10130002, 0x10130002], // 车载储能装置类型过充
    };
    
    // 解析成警报码
    
    // maxAlarmLevel 为报警信息中的 maxAlarmLevel 字段
    const tags = Object.keys(uas).filter(k => uas[k] && uas[k] > 0);
    
    // 解析为警报码
    codes.push(
      ...tags.map(t =>
        (ALARM_FLAGS[t] ? ALARM_FLAGS[t][maxAlarmLevel - 1] : -1).toString(16)
      )
    );

    故障定义及解析:

    // 将故障列表中故障解析为报警码
    
    // 故障列表中的项定义
    
    {
      type: number, // 故障类型
      code: number, // 故障编码
      level: number // 故障级别
    }
    
    // 处理 list 的警报
    const {
      ressList = [],
      mortorList = [],
      engineList = [],
      otherList = [],
    } = item;
    
    [ressList, mortorList, engineList, otherList].forEach(l => {
      codes.push(
        ...l.map(a => ((a.type << 24) + (a.code << 8) + a.level).toString(16))
      );
    });

    警报码定义:

    通过上面解析出来的故障码,找到对应的故障

    [
      { name: "整车高压互锁故障", level: 3, code: 0x100a0a03 },
      { name: "电机通讯故障", level: 2, code: 0x10c29202 },
      { name: "BMS通讯故障(ACAname:)", level: 2, code: 0x10c28902 },
      { name: "ACU通讯故障", level: 2, code: 0x10d10002 },
      { name: "ATS通讯故障", level: 2, code: 0x10c11602 },
      { name: "刹车踏板信号无效故障", level: 2, code: 0x10100302 },
      { name: "加速踏板信号无效故障", level: 2, code: 0x10100f02 },
      { name: "档位信号无效故障", level: 2, code: 0x10100e02 },
      { name: "高压绝缘一般故障", level: 2, code: 0x100aa602 },
      { name: "高压绝缘严重故障", level: 3, code: 0x100aa703 },
      { name: "整车控制器系统故障", level: 3, code: 0x10100003 },
      { name: "低压电池电压低故障", level: 2, code: 0x10102602 },
      { name: "气压低故障", level: 3, code: 0x10101003 },
      { name: "气压低报警", level: 2, code: 0x10103402 },
      { name: "气压传感器报警", level: 2, code: 0x10103502 },
      { name: "整车接触器驱动故障", level: 2, code: 0x10103702 },
      { name: "预充接触器驱动故障", level: 2, code: 0x10103802 },
      { name: "整车接触器断路故障", level: 2, code: 0x10100c02 },
      { name: "预充接触器断路故障", level: 2, code: 0x10103602 },
      { name: "整车接触器或预充接触器粘连故障", level: 3, code: 0x10100b03 },
      { name: "预充超时故障", level: 2, code: 0x10100d02 },
      { name: "仪表内部通讯故障", level: 1, code: 0x10d10801 },
      { name: "车身模块一般故障", level: 1, code: 0x10103a01 },
      { name: "胎压监测系统一般故障", level: 1, code: 0x10103b01 },
      { name: "集中润滑系统一般故障", level: 1, code: 0x10103c01 },
      { name: "ABS系统一般故障", level: 2, code: 0x10103d02 },
      { name: "ABS系统严重故障", level: 3, code: 0x10103e03 },
      { name: "ECAS系统一般故障", level: 2, code: 0x10103f02 },
      { name: "电机控制器系统故障", level: 3, code: 0x10140003 },
      { name: "编码器故障", level: 3, code: 0x10140103 },
      { name: "电机控制器过压故障", level: 2, code: 0x10140202 },
      { name: "欠压故障", level: 2, code: 0x10140302 },
      { name: "电机超速故障", level: 2, code: 0x10140402 },
      { name: "电机超速报警", level: 1, code: 0x10140501 },
      { name: "电机过温故障", level: 2, code: 0x10140602 },
      { name: "电机过温报警", level: 1, code: 0x10140701 },
      { name: "控制器过温故障", level: 2, code: 0x10140802 },
      { name: "控制器过温报警", level: 1, code: 0x10140901 },
      { name: "电机速度传感器故障", level: 2, code: 0x10140a02 },
      { name: "电机控制器过流故障", level: 2, code: 0x10140b02 },
      { name: "电机控制器通讯故障", level: 2, code: 0x10d10902 },
      { name: "充电故障", level: 2, code: 0x10130002 },
      { name: "充电插座高温报警", level: 1, code: 0x10130101 },
      { name: "充电插座高温故障", level: 2, code: 0x10130202 },
      { name: "充电继电器粘连故障", level: 3, code: 0x10130303 },
      { name: "充电继电器开路故障", level: 2, code: 0x10130402 },
      { name: "充电预充继电器粘连故障", level: 3, code: 0x10130503 },
      { name: "充电预充继电器开路故障", level: 2, code: 0x10130602 },
      { name: "电池内部高压互锁故障", level: 3, code: 0x10130703 },
      { name: "主继电器粘连故障", level: 3, code: 0x10130803 },
      { name: "主继电器开路故障", level: 2, code: 0x10130902 },
      { name: "BMS通讯故障(C CAname:)", level: 2, code: 0x10130a02 },
      { name: "单体过压报警", level: 1, code: 0x10130b01 },
      { name: "单体过压故障", level: 3, code: 0x10130c03 },
      { name: "单体欠压报警", level: 1, code: 0x10130d01 },
      { name: "单体欠压故障", level: 2, code: 0x10130e02 },
      { name: "单体压差报警", level: 1, code: 0x10130f01 },
      { name: "单体压差故障", level: 2, code: 0x10131002 },
      { name: "电池温差报警", Level: 1, code: 0x10131101 },
      { name: "电池温差故障", level: 2, code: 0x10131202 },
      { name: "电池低温报警", level: 1, code: 0x10131301 },
      { name: "电池低温故障", level: 2, code: 0x10131402 },
      { name: "电池高温报警", level: 1, code: 0x10131501 },
      { name: "电池高温故障", level: 3, code: 0x10131603 },
      { name: "电池SOC低报警", level: 1, code: 0x10131701 },
      { name: "电池总电压低报警", level: 1, code: 0x10131801 },
      { name: "电池总电压高报警", level: 1, code: 0x10131901 },
      { name: "电池放电电流超限制报警", level: 1, code: 0x10131a01 },
      { name: "电池回充电流超限制报警", level: 1, code: 0x10131b01 },
      { name: "均衡电路故障", level: 2, code: 0x10131c02 },
      { name: "电池热管理系统报警", level: 2, code: 0x10131d02 },
      { name: "电池支路断路报警", level: 2, code: 0x10131e02 },
      { name: "DCDC故障", level: 1, code: 0x10110f01 },
      { name: "严重故障", level: 2, code: 0x10111002 },
      { name: "输出欠压故障", level: 2, code: 0x10122502 },
      { name: "输出过压故障", level: 2, code: 0x10122602 },
      { name: "输入欠压警告", level: 1, code: 0x10123801 },
      { name: "输入欠压故障", level: 2, code: 0x10121d02 },
      { name: "输入过压故障", level: 2, code: 0x10121c02 },
      { name: "通讯故障", level: 2, code: 0x10d10502 },
      { name: "过温报警", level: 1, code: 0x10120e01 },
      { name: "过温故障", level: 2, code: 0x10120d02 },
      { name: "输出电流过流", level: 2, code: 0x10120202 },
      { name: "油泵故障", level: 1, code: 0x10111101 },
      { name: "严重故障", level: 2, code: 0x10111202 },
      { name: "通讯故障", level: 2, code: 0x10d10602 },
      { name: "高压输入欠压故障", level: 2, code: 0x10122402 },
      { name: "相电流过流报警", level: 1, code: 0x10123001 },
      { name: "控制器过温报警", level: 1, code: 0x10121101 },
      { name: "控制器过温故障", level: 2, code: 0x10121702 },
      { name: "电机过温报警", level: 1, code: 0x10121201 },
      { name: "电机过温故障", level: 2, code: 0x10121802 },
      { name: "控制低压欠压故", level: 2, code: 0x10123102 },
      { name: "高压输入过压故障", level: 2, code: 0x10122302 },
      { name: "相电流过流故障", level: 2, code: 0x10120602 },
      { name: "缺相故障", level: 2, code: 0x10122e02 },
      { name: "失速", level: 2, code: 0x10123202 },
      { name: "低压绕阻输入欠压", level: 2, code: 0x10123302 },
      { name: "低压绕阻输出过流", level: 2, code: 0x10123402 },
      { name: "气泵一般故障", level: 1, code: 0x10111301 },
      { name: "严重故障", level: 2, code: 0x10111402 },
      { name: "通讯故障", level: 2, code: 0x10d10702 },
      { name: "高压输入欠压故障", level: 2, code: 0x10122202 },
      { name: "相电流过流报警", level: 1, code: 0x10123501 },
      { name: "控制器过温报警", level: 1, code: 0x10120f01 },
      { name: "控制器过温故障", level: 2, code: 0x10121502 },
      { name: "电机过温报警", level: 1, code: 0x10121001 },
      { name: "电机过温故障", level: 2, code: 0x10121602 },
      { name: "控制低压欠压故障", level: 2, code: 0x10123602 },
      { name: "高压输入过压故障", level: 2, code: 0x10122102 },
      { name: "相电流过流故障", level: 2, code: 0x10120402 },
      { name: "缺相故障", level: 2, code: 0x10122f02 },
      { name: "失速", level: 2, code: 0x10123702 },
      { name: "热管理系统一般故障", level: 1, code: 0x10111501 },
      { name: "热管理系统严重故障", level: 2, code: 0x10111602 },
      { name: "空调系统一般故障", level: 1, code: 0x101f0001 },
      { name: "空调系统严重故障", level: 1, code: 0x101f0101 },
      { name: "车外温度传感器故障", level: 1, code: 0x101f0201 },
      { name: "车内温度传感器故障", level: 1, code: 0x101f0301 },
      { name: "蒸发器传感器故障", level: 1, code: 0x101f0401 },
      { name: "空调压力过压", level: 1, code: 0x101f0501 },
      { name: "空调压力欠压", level: 1, code: 0x101f0601 },
    ];
    1.3.6 用户自定义数据 (type=CUSTOM_EXT)
    {
      type: "CUSTOM_EXT",
      dataLen: 48,
      pressure1: 0,
      pressure2: 0,
      batteryVoltage: 0,
      dcov: -900,
      dcoc: -900,
      cv: 570.5,
      rc: 5522.6,
      cp: 0,
      totalCharge: 0,
      totalDischarge: 0,
      bpiRes: 0,
      bniRes: 0,
      motorContTemp: 0,
      airMode: "OFF",
      airTemp: 0,
      insideTemp: 0,
      outsideTemp: 0,
      middleDoorStatus: "CLOSE",
      frontDoorStatus: "CLOSE",
      handbrakeStatus: "OFF",
      keyPosition: "ON",
    }
    字段 数据内容 类型 分辨率 说明
    dataLen 自定义数据长度 integer 字节长度
    pressure1 气压 1 float 1hPa
    pressure2 气压 2 float 1hPa
    batteryVoltage 蓄电池电压 float 0.01V
    dcov DCDC 输出电压 float 0.01V
    dcoc DCDC 输出电流 float 0.01A
    dcTemp DCDC 散热器温度 integer 1℃
    acTemp DCAC 散热器温度 integer 1℃
    lftp 左前轮胎压力 float 1hPa
    lftt 左前轮胎温度 integer 1℃
    rftp 右前轮胎压力 float 1hPa
    rftt 右前轮胎温度 integer 1℃
    lr1tp 左后 1 轮胎压力 float 1hPa
    lr1tt 左后 1 轮胎温度 integer 1℃
    lr2tp 左后 2 轮胎压力 float 1hPa
    lr2tt 左后 2 轮胎温度 integer 1℃
    rr1tp 右后 1 轮胎压力 float 1hPa
    rr1tt 右后 1 轮胎温度 integer 1℃
    rr2tp 右后 2 轮胎压力 float 1hPa
    rr2tt 右后 2 轮胎温度 integer 1℃
    cv 充电电压 float 0.01V
    rc 充电电流 float 0.01A
    cp 充电电量 integer
    totalCharge 累积充电电量 integer
    totalDischarge 累积放电电量 integer
    instantPower 瞬时电耗 integer
    bpiRes 电池正绝缘电阻 integer 1KΩ
    apTemp 气泵扇热器温度 integer 1℃
    motorContTemp 电机控制器温度 integer 1℃
    airMode 空调模式 string WIND: "进风", OFF: "关", REFRIGERATION: "制冷", HEATING: "制热", ABNORMAL: "异常"
    airTemp 空调设定温度 integer 1℃
    insideTemp 车厢内实际温度 integer 1℃
    outsideTemp 车外温度 integer 1℃
    middleDoorStatus 中门状态 string CLOSE: "关闭", OPEN: "开启", ABNORMAL: "异常"
    frontDoorStatus 前门状态 string CLOSE: "关闭", OPEN: "开启", ABNORMAL: "异常"
    handbrakeStatus 手刹状态 string ON: "开", OFF: "关", ABNORMAL: "异常"
    keyPosition 钥匙位置 string OFF: 关, ACC: 通电, ON: 开, START: 启动

    1.4 信息补发日志(command=REISSUE_REPORT)

    补发车辆数据,request 的格式 REALTIME_REPORT 相同

    在补发数据中可能会出现 type=TEN_SECONDS 和 type=ADAS 的数据类型,为车辆 10 秒内的瞬时数据,数据内容为扩展协议 ADAS,下面做说明

    {
      level: 30,
      time: 1540902953157,
      msg: "handle rdb data",
      pid: 17,
      hostname: "d35202af7c8b-shanghaibus-v0-32960-1",
      session: "vetcULndfPe",
      seq: 7,
      cost: 0,
      origin:
        "232303fe4c5a595442474257354a3130313432323101006b120a1e0c232b810100020003000004272801000200030000042728010002000300000427280100020003000004272801000200030000042728010002000300000427290100020003000004272a0100020f03000004274b0100020003000a04276c0100020003001e042788ca",
      request: {
        command: "REISSUE_REPORT",
        flag: "COMMAND",
        vin: "LZYTBGBW5J1014221",
        encrypt: "NONE",
        length: 107,
        body: {
          at: "2018-10-30T04:35:43.000Z",
          items: [
            {
              type: "TEN_SECONDS",
              datas: [
                { accPedal: 0, brake: 0, speed: 0, totalCurrent: 9024 },
                { accPedal: 0, brake: 0, speed: 0, totalCurrent: 9024 },
                { accPedal: 0, brake: 0, speed: 0, totalCurrent: 9024 },
                { accPedal: 0, brake: 0, speed: 0, totalCurrent: 9024 },
                { accPedal: 0, brake: 0, speed: 0, totalCurrent: 9024 },
                { accPedal: 0, brake: 0, speed: 0, totalCurrent: 9025 },
                { accPedal: 0, brake: 0, speed: 0, totalCurrent: 9026 },
                { accPedal: 0, brake: 0.15, speed: 0, totalCurrent: 9059 },
                { accPedal: 0, brake: 0, speed: 1, totalCurrent: 9092 },
                { accPedal: 0, brake: 0, speed: 3, totalCurrent: 9120 },
              ],
            },
          ],
        },
      },
      response: "232303014c5a595442474257354a31303134323231010006120a1e0c232b46",
      v: 1,
    }
    1.4.1 拓展协议 ADAS 说明
    字段 数据内容 类型 有效值范围 分辨率 其他
    accPedal 加速踏板行程 integer 0~100(表示 0%~100%) 1%
    brake 制动踏板 integer 0~100(表示 0%~100%) 1% “0”表示制动关状态;在无具体值的情况下,用“0x65”即“101”表示制动有效状态。
    speed 车速 float 02200(表示 0km/h220km/h) 0.1km/h
    totalCurrent 总电流 float 020000(表示-1000A1000A) 0.1A
    overspeed 超速值 integer 0~7 5km/h
    lateralDistance 前方障碍物横向相对距离 float -12M~12M 0.1M/bit 车辆左侧为负,车辆右侧为正
    verticalDistance 前方障碍物相对纵向距离 float 0M~250M 0.1M/bit
    relativeVelocity 车辆前方障碍物相对速度 float -50~50(m/s) 0.1m/s/bit
    buzzerWarning 蜂鸣器预警 integer 0001 有效,其他无效
    wheelWarning 方向盘震动器预警 integer 0001 有效,其他无效
    cWarning 前方碰撞预警 integer 01:有,00:无
    lWarning 左车道偏离预警 integer 01:有,00:无
    rWarning 右车道偏离预警 integer 01:有,00:无
    pWarning 行人碰撞预警 integer 01:有,00:无
    cmcslevel 碰撞缓解制动系统预警等级 integer 00:无效,01:一级预警;10:二级预警
    cmcs 碰撞缓解制动系统状态 integer 00:不显示;01:CMCS 关闭;10:CMSC 故障,其他无效
    crbs 碰撞缓解制动系统开关状态 integer 00:无,01:有
    reserve 保留 integer 保留
    obstacleType 障碍物类型 integer 0:无,1:人,2:车;15:其他

    1.5 心跳(command=HEARTBEAT)

    {
      level: 30,
      time: 1540902954127,
      msg: "handle rdb data",
      pid: 17,
      hostname: "d35202af7c8b-shanghaibus-v0-32960-1",
      session: "19aCtMTzJDG",
      seq: 128,
      cost: 0,
      origin: "232307fe4c5a595442474357354a31303335373135010000b9",
      request: {
        command: "HEARTBEAT",
        flag: "COMMAND",
        vin: "LZYTBGCW5J1035715", // 车辆vin 码
        encrypt: "NONE",
        length: 0,
        body: {},
      },
      response: "232307014c5a595442474357354a3130333537313501000046",
      v: 1,
    }

    2 请求错误(Request Error)

    level 为 50 的日志,表示日志产生时发生的错误

    {
      "level": 50,
      "time": 1540902953488,
      "msg": "request error",
      "pid": 17,
      "hostname": "d35202af7c8b-shanghaibus-v0-32960-1",
      "session": "kAKkuMOQtf8",
      "error": {
        "type": "NodeError",
        "message": "Attempt to write outside buffer bounds",
        "stack": "RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to write outside buffer bounds\n    at boundsError (internal/buffer.js:51:11)\n    at Buffer.readUInt16BE (internal/buffer.js:219:5)\n    at D.len (/app/dist/cli.js:2:10203)\n    at D.deSticky (/app/dist/cli.js:2:10539)\n    at /app/dist/cli.js:2:12283\n    at dispatch (/app/node_modules/koa-compose/index.js:42:32)\n    at /app/dist/cli.js:2:12174\n    at new Promise (<anonymous>)\n    at /app/dist/cli.js:2:11918\n    at dispatch (/app/node_modules/koa-compose/index.js:42:32)"
      },
      "v": 1
    }

    3 会话关闭(Session closed)

    {
      level: 30,
      time: 1540902954520,
      msg: "session closed",
      pid: 17,
      hostname: "d35202af7c8b-shanghaibus-v0-32960-1",
      session: "gkMhp5R21",
      v: 1,
    }

    Mac OS High Sierra

    OpenSSL has been upgraded in High Sierra and homebrew does not overwrite default system libraries. That means when building node-rdkafka, because you are using openssl, you need to tell the linker where to find it:

    export CPPFLAGS=-I/usr/local/opt/openssl/include
    export LDFLAGS=-L/usr/local/opt/openssl/lib

    Contributing

    1. Fork it!
    2. Create your feature branch: git checkout -b my-new-feature
    3. Commit your changes: git commit -am 'Add some feature'
    4. Push to the branch: git push origin my-new-feature
    5. Submit a pull request :D

    Author

    module © 36node, Released under the MIT License.

    Authored and maintained by 36node with help from contributors (list).

    github.com/zzswang · GitHub @36node

    Keywords

    none

    Install

    npm i @36node/shanghaibus-messenger

    DownloadsWeekly Downloads

    54

    Version

    0.7.1

    License

    MIT

    Unpacked Size

    144 kB

    Total Files

    14

    Last publish

    Collaborators

    • lidongbest5
    • zzswang
    • hauy
    • 36node-robot