如何通过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 "); });
额外排查点
- 设备指令支持:确认你的FMBXXX型号支持
getinfo指令,可查阅官方设备手册或配置工具中的指令列表。 - 设备配置:检查设备是否开启了远程指令接收权限,部分设备需在Web配置界面或通过SMS预配置允许GPRS指令。
- 连接稳定性:确保设备与服务器的TCP连接在发送指令时未断开,可在
data事件中打印完整的接收数据,确认设备的IMEI验证流程正常。
内容的提问来源于stack exchange,提问作者kaizen
相关产品推荐
相关产品推荐

