这是一个 Node.js Socket 服务器,用于接收和处理透析机数据。程序直接打开即可运行,无需额外配置环境。
pkg 打包成独立可执行文件)。socketlastAck(最近一次收到有效数据的时间戳)status:pending → valid → registeredlastAck 超过配置的超时时间(如 2 分钟),判定为超时;suedtime:网关接收到数据的时间(格式:YYYY-MM-DD HH:mm:ss)。deviceType:机器类型标识。IPAddress:该设备 TCP 连接的远端 IP 地址。setDeviceData(deviceNumber, data):写入/更新指定设备数据,并记录缓存时间。getDeviceData(deviceNumber):按设备号返回最新缓存。getAllDeviceData():返回所有设备的当前缓存快照。getDeviceList():返回设备列表(设备号 + 最后缓存时间)。getStats():统计设备数量、估算内存占用,返回详细设备列表。getIdleDevices(timeoutMs):返回在指定时间内未更新的“空闲设备”,可用于排查设备掉线或通讯异常。schema.json)加载物模型定义,若失败则使用内置默认物模型。mapData(rawData):将原始对象转换为属性数组 [ {identifier, name, value}, ... ]。transformForHTTP(rawData, deviceNumber):专用于 HTTP 返回结构。transformForMQTT(rawData, deviceNumber):专用于 MQTT 消息负载。transformForAliyun(rawData):用于阿里云属性上报(直接以 identifier 作为物模型属性 ID)。
职责:
GET /api/device/data?deviceNumber={n}[&mapped=true]
raw 格式:内部原始字段;mapped 格式:基于物模型映射后的属性数组。GET /api/device/all[?mapped=true]
__all_devices__)做全局访问限流(例如 1 分钟一次)。GET /api/device/list
GET /api/cache/stats
POST/GET /api/cache/clear
GET /api/device/idle?timeout={ms}
GET /api/ratelimit/stats / POST /api/ratelimit/clear
GET /api/health
__all_devices__)记录最近访问时间。checkLimit(key, interval) 方法:
enabled 标志控制是否启用 MQTT 功能。{前缀}/{设备序列号},前缀可配置。enabled 控制是否启用阿里云对接。schema.json)统一定义:可使用内置脚本模拟 50 台设备并发连接并持续发送 0x1F/0x26/0x29 三类报文,用于提前验证网关稳定性。
npm run start
npm run stress:50
$env:DEVICE_COUNT="50"
$env:DURATION_SEC="180"
$env:INTERVAL_MS="1000"
$env:TCP_HOST="127.0.0.1"
$env:TCP_PORT="19000"
npm run stress:50
参数说明:
- DEVICE_COUNT:并发设备数(默认 50)
- DURATION_SEC:压测持续时间秒数(默认 120)
- INTERVAL_MS:每台设备发送运行参数帧间隔(默认 1000ms)
- ALARM_EVERY:每 N 个发送周期插入报警帧(默认 30)
- BP_EVERY:每 N 个发送周期插入血压帧(默认 15)
项目已接入 winston + 按天滚动日志,默认日志目录由 config.log.dir 控制(默认 ../logs)。
日志文件:
- gateway-YYYY-MM-DD.log:全量业务日志(连接、原始报文、解析、上报)
- gateway-error-YYYY-MM-DD.log:错误日志
关键追踪事件:
- Device connected:记录连接时间与 ip:port
- Device identified:将连接绑定到机器编号(deviceNumber)
- Raw TCP data received:记录原始十六进制报文
- Dialysis frame parsed / Dialysis frame payload:记录解析结果
- MQTT publish success / Aliyun postProps success:记录上报成功
- Device disconnected:记录断开时间、在线时长、总收包字节、总帧数
Windows 下按机器号查询示例:
Get-Content .\logs\gateway-$(Get-Date -Format yyyy-MM-dd).log | Select-String "6220903393"