You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过GPRS向Teltonika FMBXXX设备发送SMS指令?部分指令无响应

问题排查与解决方案

核心问题:硬编码的指令包格式错误

你的getinfo指令包存在两个关键错误,导致设备无法识别并响应:

1. 总长度字段不匹配

Teltonika Codec 12协议中,前8字节是总长度字段(大端格式),代表从第9字节(协议版本)到包末尾的所有字节数。

  • 你的getinfo包总长度写的是000000000000000f(十进制15),但实际从0C到末尾的字节数是19(计算:1+1+1+4+7+1+4=19),正确的总长度字段应为0000000000000013。

2. CRC校验和错误

包末尾的4字节是CRC32校验和,需基于从协议版本(0C)到标志位(01)的所有内容计算。你当前的getinfo包校验和仅写了4312(2字节),长度不足且值错误,设备校验失败会直接丢弃包。

推荐解决方案:动态生成指令包

硬编码十六进制包极易出错,建议用代码动态生成符合协议规范的指令包,避免手动计算长度和CRC的失误。

步骤1:安装CRC依赖

npm install crc

步骤2:编写指令生成函数

const crc32 = require('crc').crc32;

function generateTeltonikaCommand(command) {
  // 转换指令为ASCII Buffer
  const commandBuffer = Buffer.from(command, 'ascii');
  const commandLen = commandBuffer.length;

  // 构建协议头:版本(0x0C) + 类型(0x01=SMS指令) + 子类型(0x05=发送指令)
  const header = Buffer.from([0x0C, 0x01, 0x05]);
  // 指令长度字段(4字节大端)
  const lenField = Buffer.alloc(4);
  lenField.writeUInt32BE(commandLen, 0);
  // 响应标志(0x01=需要设备返回响应)
  const flag = Buffer.from([0x01]);

  // 拼接待校验的 payload
  const payload = Buffer.concat([header, lenField, commandBuffer, flag]);
  // 计算CRC32校验和
  const crcVal = crc32(payload);
  const crcBuffer = Buffer.alloc(4);
  crcBuffer.writeUInt32BE(crcVal, 0);

  // 总长度字段(8字节大端,前4字节补0)
  const totalLen = payload.length + 4;
  const totalLenBuffer = Buffer.alloc(8);
  totalLenBuffer.writeUInt32BE(totalLen, 4);

  // 拼接完整包
  return Buffer.concat([totalLenBuffer, payload, crcBuffer]);
}

步骤3:修改原代码使用生成函数

const net = require("net");
const Parser = require("teltonika-parser");
const crc32 = require('crc').crc32;

// 插入上面的generateTeltonikaCommand函数

const server = net.createServer((socket) => {
  console.log("Client connected:", socket.remoteAddress, socket.remotePort);
  socket.on("data", async (data) => {
    let parser = new Parser(data);
    if (parser.isImei) {
      // 生成getinfo指令包并发送
      const getinfoPacket = generateTeltonikaCommand('getinfo');
      socket.write(getinfoPacket);
      // 若要测试getio,替换为:
      // const getioPacket = generateTeltonikaCommand('getio');
      // socket.write(getioPacket);
    } else {
      console.log(parser);
      console.log("Buffer content:", parser._codecReader.ByteBuffer.toString('hex'));
    }
  });
  socket.on("close", () => {
    console.log("Client disconnected");
  });
  socket.on("error", (error) => {   
     console.error("Socket error:", error);
  });
});
server.listen(4043, "192.168.1.21", () => {
  console.log("TCP server listening ");
});

额外排查点

  1. 设备指令支持:确认你的FMBXXX型号支持getinfo指令,可查阅官方设备手册或配置工具中的指令列表。
  2. 设备配置:检查设备是否开启了远程指令接收权限,部分设备需在Web配置界面或通过SMS预配置允许GPRS指令。
  3. 连接稳定性:确保设备与服务器的TCP连接在发送指令时未断开,可在data事件中打印完整的接收数据,确认设备的IMEI验证流程正常。

内容的提问来源于stack exchange,提问作者kaizen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:09:50