起因

机床这个行业,全款现货是理想情况。现实里大量机器是分期付款卖出去的,还有整批打包给二级经销商、经销商再租给终端客户的。机器在别人手里、钱还没收完,厂里和经销商手里就得有控制手段:GPS 知道机器在哪,授权码决定机器能干什么、能干到哪天,4G 通道把这两样送回来。这套手段没有一样是机床行业发明的:GPS 是 1973 年美国国防部立的军用项目,1995 年全面运行之后民用一发不可收拾,模块便宜到几十块钱一颗;远程锁机则是在挖掘机按揭市场先成熟的——工程机械租赁干了十几年,GPS 锁机是标配,机床照搬的是一条被验证过的路。这也是当初坚持自研网络协议栈的原因之一——这些能力全踩在自己的 TCP/IP 上,不依赖任何第三方系统。

出口那边还有一层:机器卖到国外要能限定运行地域,地域锁同时是出口合规的证据链。出厂配置里这套是可选的——选配了 GPS 的机器,检测不到 GPS 模块立即锁定,保证合规手段本身绕不过去;没选配的机器不装也不锁,产线写死的配置说了算。

一、总体结构:判定和执行分开

整个体系分两半:

  • 判定层(应用层策略引擎,跑在服务核):输入 = GPS 位置 + 授权状态 + 出厂配置,输出 = 一个原子的"合规状态"字(bit 级:允许加工 / 只允许辅助运动 / 只读)
  • 执行层(系统层既有能力):开机自检读状态字决定放不放行;实时层每个插补周期瞄一眼状态字,不合规就停

锁机的停机路径必须复用安全 ISR 那条链——急停/断丝/限位走的同一条路(调度篇的 0xF0 向量),锁机 = 安全停机 + 锁屏界面。绝不另写第二条停机逻辑:两条停机路径等于两倍的出错机会,这种地方省下的代码迟早连本带利还回去。

二、GPS 模块:NMEA 三条句子

硬件接入:GPS 模块走 UART——自研 FPGA 卡上引一路 UART 出来,或者主板 COM 口;USB GPS 就是 CDC-ACM 串口。协议 NMEA 0183,9600-8N1 起步(新模块很多默认 38400,可配),句子 $ 开头、*hh 结尾,hh 是 $* 之间逐字节的异或:

1
2
3
4
5
fn nmea_ok(s: &[u8]) -> bool {           // 校验通过才进解析
    let mut x = 0u8;
    for &b in &s[1..s.len() - 3] { x ^= b; }
    x == hex_pair(&s[s.len() - 2..])
}

句子只解析三条:

句子 用途
GGA 定位状态 / 卫星数 / 高度
RMC 日期时间 / 速度 / 定位有效位(A 有效 / V 无效)
GSA 精度因子 PDOP——判断这次定位值不值得信

坑:NMEA 是流式文本,一条句子可能跨两次缓冲区读取——按行状态机攒整句再校验,别假设"一次 read 恰好一条"。收到句子不等于有定位,有效性看 RMC 的状态位。

坑:信号。 GPS 的死穴是金属厂房,车间屋顶能把信号吃干净。必须有宽限期:丢星后 30 分钟内(可配置)带报警继续运行,期间用最后已知位置顶住,配合冷启动优化(保存星历、AGPS 注入)。纯"丢星即锁"的机器在室内厂房天天误锁,这套机制就废了,没人会买。

GPS 顺带送一份 UTC 时间——RTC 校时由此多了一条不依赖网络的路。

三、地域锁定:多边形与防绕过

策略 = 允许区域表(多边形顶点集,参数区存储、厂商签名保护),判定用射线法点在多边形内测试,几百个顶点也是毫秒级,1Hz 在服务核跑绰绰有余。结果写合规状态字,实时层和自检只读,不参与计算。

越界分两级:警告区(离边界还有 50km 就开始提示,给搬迁留缓冲)→ 锁定区(安全停机 + 锁机 + 4G 上报)。锁机界面只留解锁码输入。

防绕过是设计重心:选配了 GPS 但枚举不到模块(拔了/坏了)= 立即锁。出厂配置(有无 GPS 选配、允许多边形)是产线写入的签名数据,机器端改不了——“没有 GPS"和"装作没有 GPS"必须区分得开。

四、授权体系:机器指纹、功能位和所有权链

授权模型三层往下拆:

机器指纹:SMBIOS UUID(平台管理篇)+ CPU ID + 网卡 MAC 三源拼接哈希。单源可被刷写欺骗(MAC 就能改),三源一起改的成本陡增。

功能位与租期:基础切割 / 锥形切割 / 3D 模拟 / 远程功能按模块开关——软件分级销售的直接载体;有效期分永久和租期(租赁模式),到期前 30 天开始界面倒计时。

所有权链(二级经销商要的手段):厂商根密钥 → 经销商密钥 → 机器。机器出厂时绑定渠道;经销商把机器卖给终端客户时,用自己的密钥签一张"所有权转移"凭证,机器验证凭证链后更新归属——之后这台机器的远程视图、解锁权限归经销商自己的账号体系管。厂商根密钥永远握在厂里,经销商只能动自己渠道内的机器,一台都越不了界。

签名用 Ed25519:小、快、无专利纠缠,参考 RustCrypto 系实现(MIT/Apache-2.0)按依赖策略 vendor 进仓库。私钥在厂里和经销商侧,公钥编进内核。授权文件用参数篇同款双副本存储。

坑:离线激活。 现场没网时操作员输一串激活码:挑战 = 机器指纹哈希,响应 = 对指纹的签名。码里绑着指纹,抄给别人无效。

坑:时间回拨。 租期判断不能信 RTC——RTC 是可写的。用"最大历史时间"单调化:日志和快照里存过的时间戳都比当前 RTC 大,说明被人回拨过,报警锁机。RTC 能改,历史戳擦不掉。

五、4G 远程通道

硬件:USB 4G 模块,对系统呈现为网卡(RNDIS 或 CDC-NCM 类,USB 设备类清单里补这两类),接进网络篇的协议栈,跟有线网卡同一个 IP 层——4G 对协议栈来说就是一块网卡。

远程能力从轻到重:

能力 内容 通道
心跳 位置 / 状态 / 报警码,一天几次 UDP 小包
远程诊断 拉日志尾部、读状态 TCP(日志篇的远程通道)
远程指令 锁机 / 解锁 / 下发授权 / 所有权转移 心跳通道复用,带签名与序号
OTA 固件更新的升级包推送 TCP + 界面二次确认

安全边界一条主线:4G 侧默认不开放任何监听端口,全部通信由设备定时外连发起,暴露面为零;指令带序号防重放、带签名防伪造。断线期间指令排队不丢,但本地策略永远兜底——连不上厂里不等于解锁,锁不锁只由本地判定层说了算。远程通道是管理便利,不是安全依赖,这条边界想清楚了,整套体系才立得住。

坑:硬件配合项。 金属电柜里 4G 天线必须外引——天线锁在柜子里信号一格没有,整套远程机制就是摆设。流量控制:心跳小包化,一个月几 MB 的量级。

六、闭环

开机:自检报告加一项"GPS / 授权 / 合规状态”→ 判定层跑一轮 → 状态字生效。运行期:1Hz 重判,越界、到期、模块消失,走安全停机路径锁机。厂端:每台机器的指纹、授权、位置在台账里对上号——分期收款和出口合规的证据链都在这里。全程日志留痕:谁解锁的、什么时间、什么码、所有权何时转移给谁。

总结

实战清单:判定/执行分离,锁机复用安全停机路径;NMEA 三句子 + 行状态机 + 异或校验;射线法围栏 + 宽限期 + 防绕过(选配消失即锁);指纹三源 + 功能位 + 租期 + Ed25519 + 所有权链(厂商→经销商→机器);离线激活码绑指纹;最大历史时间防回拨;4G 网卡化、只外连不监听、指令签名防重放、本地策略兜底。跑通标志:模拟坐标走出允许多边形,宽限期到点后安全停机并锁屏,解锁码恢复;选配机拔 GPS 立即锁;RTC 回拨越过租期开机报警锁定;经销商签所有权转移凭证后机器归属与远程视图切换;4G 断 24 小时重连,排队指令补收,期间锁机策略全程本地生效。

下一篇是基础篇最后一篇:实时性验证——把"实时"两个字变成一页纸的数据。

参考链接