之前实习的时候做过一个项目接触到了北斗短报文的开发,项目是要监测高原地区的工人们的身体情况,保证工人们如果出现高原病现象可以第一时间得到救治。这里需要使用lora网关收到工人手表发送的数据,然后使用北斗短报文发送到插了北斗卡的北斗终端。开发北斗让我学会了具体项目中接收与发送数据的全流程。
开发时需要准备好硬件
这里我使用的是开发好的一体机,可以使用RS232或者RS385接口来连接我的主机,只需要给连接的串口发送命令就可以实现通信。我使用的是RS232连接,使用的主机有DB9连接扣,把线插入就可以使用了。串口参数通常为115200波特率、8位数据位、无校验、1位停止位(8N1)。
北斗使用的是标准NMEA风格指令,格式为 $指令内容*校验和\r\n,通过串口直接发送。校验和是 $ 和 * 之间所有字符的异或值。
指令 | 功能 | 典型响应 |
|---|---|---|
CCICR / CCICA | 读取北斗卡号 | $BDICP / $BDICI- |
CCRMO,PWI | 查询信号波束 | $BDPWI(含波束数和信号强度)-17 |
CCTCQ | 发送短报文(点对点) | $BDFKI(发送回执)- |
CCTBQ | 发送短报文(通播) | 无特定回执- |
CCMSG | 通信申请(扩展协议) | $BDMXX(通信信息) |
其中 CCTCQ 是发送核心,格式为:
CCTCQ,接收卡号,频点,是否需回执,编码方式,内容,上报周期
例如 CCTCQ,15950041,2,1,3,A4B2E2CAD4,0。编码方式 3 为混编模式,内容需以 A4 开头并跟 GB2312 编码的 HEX 字符串。
使用python发送数据如下
import serial, time
def nmea(body):
cs = 0
for c in body: cs ^= ord(c)
return f"${body}*{cs:02X}\r\n".encode()
ser = serial.Serial("/dev/ttyS0", 115200, timeout=0.4)
# 1. 读卡
ser.write(nmea("CCICR,0,00")); time.sleep(2); ser.read_all()
# 2. 查信号
ser.write(nmea("CCRMO,PWI,2,0")); time.sleep(3); ser.read_all()
# 3. 发送(内容 "你好" → A4C4E3BAC3)
content = "A4" + "你好".encode("gb2312").hex().upper()
ser.write(nmea(f"CCTCQ,15950041,2,1,3,{content},0"))
time.sleep(6)
print(ser.read_all().decode("ascii", errors="ignore"))
北斗短报文发送的需要三个步骤:
步骤 | 指令 | 作用 | 返回 |
|---|---|---|---|
第一步 | CCICR,0,00 | 读卡,确认卡在线 | $BDICP |
第二步 | CCRMO,PWI,2,0 | 测试信号(波束数量+强度) | $BDPWI |
第三步 | CCTCQ,... | 发送短报文 | $BDFKI |
首先是读卡,需要这张卡是可用的才可以使用,然后是检测波束状态,需要可见波束数 ≥ 3,即至少能同时看到 3 颗北斗卫星的波束,同时最强信号 ≥ 45,这样才可以使用,在测试过程中需要把北斗放到室外开阔的地方,这样信号会好一点。
接收部分是插了北斗卡的终端,北斗发送数据的时候会指定接受的卡号,输入后北斗就会给这个卡号发送信息,这个特定的卡号就可以接收到数据。
北斗有自己的软件可以使用,使用软件发送数据比较轻松,就像使用串口助手一样,只需要点击就可以发送数据,读取卡号,测试信号。想要获取到发送的数据可以登录北斗的网站,输入卡号,就可以获取到发送的数据,不过这里的数据一般都是经过加密的,需要解密后才可以获取到实际的数据。
实际开发中硬件调试和软件调试部分花了比较多的时间,北斗的RS232和RS485接口不是都将而已使用的,同一时间只能用一个接口,所以如果在使用485后想要使用232,就要发送指令修改,如果没有修改成功这两个都不能用了,这边研究了很久才发现这个问题,一开始以为是软件发送数据的问题,结果连硬件都没弄好。最后寄回去让厂家帮我们直接改成了最后要使用的232接口才能使用。
软件主要是之前没有使用过lora网关和NMEA风格的指令,摸索了比较久,好在最后借助AI成功完成项目。
北斗短报文实际使用需要有三步:读卡 → 测信号 → 发送,每一步都有它的意义。跳过读卡,卡不在线发送必失败;跳过测信号,信号差时发送成功率极低,还浪费宝贵的卫星信道资源。
北斗短报文对遮挡非常敏感,实际部署时一定要把天线放在室外开阔处。
总的来说,北斗短报文的开发门槛不算高,协议清晰,指令简洁。真正的难点在于硬件调试和信号环境。只要把这两块搞定,剩下的就是按流程写代码的事了
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。