概述

1.Jointech提供的MQTT推送服务,是一种将设备数据实时发送给数据使用方的服务。 当设备上传数据后,推送服务会第一时间感知,在将数据整理打包后,发送至MQTT服务器,客户数据接收服务从MQTT服务器获取数据,然后客户根据自身业务自行处理数据。
2.MQTT规则配置界面,主要是方便用户配置哪些设备进行MQTT推送服务
3.订阅主题说明

MQTT规则配置

用户可以在此界面中,配置需要进行MQTT推送的终端,通过选择数据源,可以进行多方式的选择所需要推送的终端。

数据源说明

1.公司全部设备

表示当前公司及其子公司下的所有终端

2.公司直属设备

表示当前公司及下的所有终端

3.公司指定设备

表示当前公司及其子公司下的指定终端

订阅主题及负载说明

1.服务器地址及说明

参数名 说明
服务器地址 mqtt://mqtt.assetscontrols.com:1883
协议版本 MQTT3.1.1
QoS等级 建议QoS0(最多一次)

2.客户端账户及密码

为当前MQTT规则配置的登录账户及密码(MD5加密后),也可直接在该规则的详情界面中查看。

3.订阅说明

将{accessKey}替换为系统分配的实际值,{deviceNum}替换为设备的ID,{subLockNum}替换为设备子锁的ID
订阅主题 说明
upload/{accessKey}/# 订阅全部设备所有类型数据
upload/{accessKey}/{deviceNum}/# 订阅某一个设备所有类型数据
upload/{accessKey}/+/location 订阅全部设备定位数据
upload/{accessKey}/{deviceNum}/location 订阅某一个设备定位数据
upload/{accessKey}/+/alarm 订阅全部设备报警数据
upload/{accessKey}/{deviceNum}/alarm 订阅某一个设备报警数据
upload/{accessKey}/+/event 订阅全部设备事件数据
upload/{accessKey}/{deviceNum}/event 订阅某一个设备事件数据
upload/{accessKey}/+/cmd 订阅全部设备指令应答数据
upload/{accessKey}/{deviceNum}/cmd 订阅某一个设备指令应答数据
upload/{accessKey}/{deviceNum}/{subLockNum}/sublock 订阅某一个设备某一个从机状态数据
upload/{accessKey}/{deviceNum}/+/sublock 订阅某一个设备所有从机状态数据
download/{accessKey}/{deviceNum}/cmd 下发某一个设备指令到终端数据
3.1 终端状态上报

主题:upload/{accessKey}/{deviceNum}/location
描述:终端的定位状态数据
示例:

{"assetId":"8052400203","battery":255,"cellSignal":31,"cells":"460,0,10352,188975300","direction":0,"expandInfo":"{\"angle\":\"null\",\"backBattery\":\"null\",\"fuels\":\"-1,-1,-1\",\"humidity\":\"0\",\"lux\":\"null\",\"networkType\":\"0\",\"pressure\":\"null\",\"reportType\":\"null\",\"temperature\":\"-1000.0\"}","gnssSignal":0,"gpsTime":"2025-02-07T07:26:30Z","latitude":22.6700711039462,"locType":2,"longitude":113.922999834147,"mileage":0,"recvTime":"2025-02-07T07:25:20.832Z","speed":0,"statusJson":"{\"lockRope\":0,\"lockStatus\":0}","voltage":"0.0"}

示例Json字符串说明:

参数名 类型 说明
assetId String 设备号
longitude Double 经度(WGS-84)
latitude Double 纬度(WGS-84)
speed Integer 速度(km/h)
direction Integer 方向(0~360)
mileage Long 里程(km)
gpsTime String 定位时间(UTC时间)
recvTime String 接收时间(UTC时间)
locType Integer 定位类型(0:不定位;1:GPS定位;2:基站定位)
cellSignal Integer GPRS信号
gnssSignal Integer 卫星信号
cells String 小区码数据,以 MNC,MCC,LAC,CID的格式显示
battery Integer 电量,255表示充电中
voltage String 电压 (V)
statusJson String 锁/车载状态JSON(可参考下面的状态JSON说明)
expandInfo String 拓展信息JSON(可参考下面的扩展信息JSON说明)
锁状态JSON说明
参数名 类型 说明
lockRope Integer 锁绳状态(1: 拔出 0:插入 -1:无)
lockStatus Integer 锁状态(0:关 1:开)
车载状态JSON说明
参数名 类型 说明
acc Integer 引擎开关状态( 1:开 0:关 -1:无)
fuelCut Integer 断油电开关状态 (1:开 0:关 -1:无)
door Integer 开关门状态(1:开 0:关 -1:无)
engine Integer 发动机状态(1:开 0:关 -1:无)
拓展信息JSON说明
参数名 类型 说明
temperature String 温度 -1000表示无
humidity String 湿度 0表示无
fuels String 油位值 -1表示无(”-1,-1,-1”)
fAcceleration String 加速度(“x:1;y:-29;z:-2903”)
lux float 光照度
pressure float 气压(pa)
posture String 姿态(”x:1;y:-29;z:-2903”)
fVoltage Double 电压值
backBattery String 备用电池 (”55,3.88,0”)
fReportType Integer 数据类型(0:实时;1:补报;2:报警)
fNetworkType Integer 网络类型 (0:未知 1:1G 2:2G 3:3G 4:4G 5:5G)
3.2 终端报警上报

主题:upload/{accessKey}/{deviceNum}/alarm
描述:终端的报警数据,如低电量,撞击报警
示例:

{"alarmType":44,"assetId":"8454601010","cells":"460,0,9383,149428936","dateTime":"2020-04-01T00:00:25Z","describe":"","fileIndex":"1585728025","latitude":22.6766686619127,"longitude":113.928864975252,"mileage":59,"speed":0}

示例Json字符串说明:

参数名 类型 说明
assetId String 设备号
alarmType Integer 报警类型(可参考下面的报警类型说明)
dateTime String 时间(UTC时间)
longitude Double 经度(WGS-84)
latitude Double 纬度(WGS-84)
speed Integer 速度(km/h)
mileage Long 里程(km)
cells String 小区码数据,以 MNC,MCC,LAC,CID的格式显示
describe String 描述
fileIndex String 附件流水号

报警类型说明:

报警类型 报警名称
1 超速报警
2 疲劳驾驶
3 危险预警
4 GNSS模块发生故障
5 GNSS天线未接或被剪断
6 GNSS天线短路
7 终端主电源欠压
8 终端主电源掉电
9 终端LCD或显示器故障
10 TTS模块故障
11 摄像头故障
12 道路运输证IC卡模块故障
13 超速预警
15 断电报警
19 超时停车
23 路线偏离报警
24 车辆VSS故障
26 车辆被盗
27 车辆非法点火
28 车辆非法位移
29 碰撞预警
30 侧翻预警
31 非法开门报警
32 视频信号丢失报警
33 视频信号遮挡报警
34 存储单元故障报警
35 其他视频设备故障报警
36 客车超员报警
37 异常驾驶行为报警
38 特殊报警录像达到存储阈值报警
40 锁绳剪断
41 震动
42 长时间开锁
43 开锁密码连续5次错误
44 刷非法卡
45 低电量
46 开后盖
47 卡锁
48 进区域报警
49 出区域报警
50 启用后备电池
51 SOS
52 拖吊报警
54 油位报警
55 进热点报警
56 出热点报警
57 进道路报警
58 出道路报警
63 温湿度报警
64 前向碰撞报警
65 车道偏离报警
66 车距过近报警
67 行人碰撞报警
68 频繁变道报警
69 道路标识超限报警
70 障碍物报警
71 道路标志识别事件
72 主动抓拍事件
73 实线变道报警
74 车厢过道行人监测报警
92 疲劳驾驶报警
93 接打电话报警
94 抽烟报警
95 分神驾驶报警
96 驾驶员异常报警
97 自动抓拍事件
98 驾驶员变更事件
99 探头遮挡报警
100 超时驾驶报警
101 未系安全带报警
102 红外阻断型墨镜失效报警
103 双脱把报警
104 玩手机报警
110 胎压报警
125 后方接近报警
126 左侧后方接近报警
127 右侧后方接近报警
131 急加速报警
132 急减速报警
133 急转弯报警
134 怠速报警
135 异常熄火报警
136 空挡滑行报警
137 发动机超转报警
141 超速报警
145 超过车辆额定载重报警
146 超过道路承重报警
151 限高报警
160 安全带报警
161 紧急刹车报警
162 空挡滑行
163 GPRS重连
164 调度屏连接
165 调度屏断开
166 CANBUS断开连接报警
167 CANBUS故障码上传报警
168 限制开车报警
180 主机拆卸
190 上盖破坏
191 Gps天线干扰
192 低电量休眠报警
193 锁异常
194 开锁密码错误
195 没有定位不执行开锁
196 围栏外禁止开锁
197 姿态报警
198 从机信号丢失
199 监管状态禁止开锁
200 主电池更换
201 自检异常
202 存储空间不足
203 锁条弯曲
204 锁条锯断
205 锁条丢失
206 施封状态禁止开锁
316 光感报警
332 气压报警
400 超时怠速报警
402 围栏超时停留报警
403 出围栏未上锁报警
404 晚发预警
405 晚发报警
406 晚到预警
407 晚到报警
3.3 终端事件上报

主题:upload/{accessKey}/{deviceNum}/event
描述:终端的事件数据,如开锁,关锁
示例:


{"assetId":"8454601010","card":"","cells":"460,0,9383,149428936","dateTime":"2025-02-07T06:54:52Z","describe":"","eventType":1,"latitude":22.6766686619127,"longitude":113.928864975252,"mileage":59,"password":"","speed":0,"unLockType":2}

示例Json字符串说明:

事件类型 事件名称
1 开锁
2 关锁
3 出区域施封
4 进区域解封
5 开箱/门
6 关箱/门
7 蓝牙施封
8 蓝牙解封
9 远程施封
10 远程解封
11 抓拍
12 定时拍
13 离开起点
14 到达目的地
15 离开目的地
16 完成运单
17 进入途经点
18 离开途经点
19 拔出锁绳/按下开锁按键(JT705A/JT705C)
3.4 指令应答上报

主题:upload/{accessKey}/{deviceNum}/cmd
描述:终端响应服务器下发的指令
指令应答说明:不同的指令应答结果不一样,具体指令及其说明,请参考协议文档
示例:

 //正常回复
{"assetId":"794308010642","commandType":"BASE1","content":"[\"794308010642\",\"8\",\"001\",\"BASE\",\"1\",\"JT709A_20241115_HW-V1.2_RFID_7600_V2_8\",\"0\",\"Jointech\",\"LE20B05SIM7600M21-A_CUS_JT\",\"898604B81022C1046673\",\"868822046635957\",\"460\",\"0\",\"188975300\",\"10352\"]","dateTime":"2025-02-07T03:52:39.964Z"}
//失败回复 (Device not online)
{"assetId":"8294630003","commandType":"MQTT_CMD","content":"Device not online!","dateTime":"2025-01-07T09:49:43.158Z"}
//失败回复 (Device has not been registered)
{"assetId":"8294630481","commandType":"MQTT_CMD","content":"Device has not been registered!","dateTime":"2025-01-07T09:48:32.975Z"}

示例Json字符串说明:
可参考数据引擎服务说明中:数据类型说明-> 指令应答数据

3.5 从机状态上报

主题:upload/{accessKey}/{deviceNum}/{subLockNum}/sublock
描述:从机的定位状态数据
示例:

{"assetId":"8052400203","battery":41,"direction":0,"eventType":3,"gpsTime":"2025-02-07T07:16:07Z","humidity":0,"latitude":-0.0,"locRope":0,"locStatus":0,"locTimes":54,"longitude":-0.0,"recvTime":"2025-02-07T07:14:57.315Z","rssi":15,"sensorType":4,"speed":0,"statusJson":"{\"lockRope\":0,\"gateway\":0}","subAssetID":"E0171E0366","subGpsTime":"2025-02-07T07:15:14Z","subGpsTimestamp":1738912514000,"temperature":-1000.0,"voltage":"3.75"}

示例Json字符串说明:

参数名 类型 说明
assetId String 主锁设备号
longitude Double 经度(WGS-84)
latitude Double 纬度(WGS-84)
speed Integer 速度(km/h)
direction Integer 方向(0~360)
mileage Long 里程(km)
gpsTime String 主锁定位时间(UTC时间)
recvTime String 主锁接收时间(UTC时间)
subAssetID String 从机设备号
subGpsTime String 从机定位时间(UTC时间)
subGpsTimestamp long 从机定位时间时间戳
battery Integer 从机电量,255表示充电中
voltage String 从机电压 (V)
sensorType Integer 从机类型 1-JT126 , 4-JT709 , 5-JT801 , 6-JT802
locStatus Integer 从机锁状态 0:关 1:开
locRope Integer 从机锁绳状态 0:插入 1: 拔出
rssi Integer RSSI
humidity Integer 从机湿度 0表示无
temperature double 从机温度 -1000表示无
locTimes Integer 从机开锁次数
eventType Integer 从机事件 -1:无 0:关锁事件 1:蓝牙开锁事件 2:开后盖报警 3:远程开锁事件 4:锁绳剪断报警 5:按键唤醒事件 6:心跳包事件 7:充电唤醒事件 8/20:拔出锁绳事件 9:RFID开锁事件 10:刷非法卡报警 14:从机信号丢失报警 15:阀门关闭事件 16:阀门打开事件 17:低电量报警 18:防拆卸报警 19:电子仓拆卸事件 21:锁绳插入 22:蓝牙连接唤醒 23:应急仓打开报警 24:应急仓关闭报警 25:阀门异常打开报警 26:锁销关闭事件 27:锁销开启事件 28:关锁异常 29:电机异常 30:NFC触发
statusJson String 针对802设备的状态数据(Json字符串),其它类型设备数据可忽略(可参考下面的状态JSON说明)
statusJson字段说明

“FStatusJson”:”{"bottomDisassembly":0,"emergencyKey":0,"lockMotor":0,"structuralDisassembly":0,"gateway":0,"lockValve":0}”

参数名 类型 说明
bottomDisassembly Integer 结构防拆卸状态,0:无拆卸,1拆卸
emergencyKey Integer 应急钥匙状态 0:封存,1:启用
lockMotor 电机状态:0:电机关,1:电机开
structuralDisassembly Integer 结构防拆卸状态,0:无拆卸,1拆卸
lockValve Integer 阀门状态,0:关闭,1打开
lockKnob Integer 旋钮状态,0:关闭,1:打开
lockRope Integer 锁绳状态 0:插入;1:拔出
gateway Integer 无意义,可忽略
3.6 服务器指令下发

主题:download/{accessKey}/{deviceNum}/cmd
描述:下发指令到终端的数据
指令说明:不同设备类型有不同的指令功能,具体指令及其说明,请参考协议文档
示例:

(794308010642,1,001,BASE,1)

代码示例

引入paho依赖

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.0</version>
</dependency>

建立MQTT连接
建立连接的时候需使用AccessId、secret、topic、clientId均为系统分配,其中AccessId对应客户端的user,secret对应客户端的password。

String user         = "u8vngl";//user
String password     = "xxxxxx";//Password(MD5-32)
String topic        = "upload/{accessKey}/{deviceNum}/location";
//String topic        = "upload/B176C0FF1DFF41D0126BFF7908C76E17/8041254836/location"; //订阅此设备的位置数据
//String topic        = "upload/B176C0FF1DFF41D0126BFF7908C76E17/+/location"; //订阅此配置设备的位置数据
//String topic        = "upload/B176C0FF1DFF41D0126BFF7908C76E17/#"; //订阅此配置设备的位置、报警、事件等数据
int qos             = 1;//qos2消耗较大,请使用1或0
String broker       = "mqtt://mqtt.assetscontrols.com:1883";//mqtt服务器地址
String clientId     = "u8vngl_consumer";
//qos为1或2时,mqttclient使用
MemoryPersistence persistence = new MemoryPersistence();

try {
    MqttClient client = new MqttClient(broker, clientId, persistence);
    MqttConnectOptions connOpts = new MqttConnectOptions();
    connOpts.setUserName(user);
    connOpts.setPassword(password.toCharArray());
    //cleanSession为false时,下次以相同clientId登录将可以获取存储的所有消息
    //如果为true,将获取到retained标记的最后一条消息
    //cleanSession调试测试阶段设置为true,生产设置为false
    connOpts.setCleanSession(false);
    connOpts.setAutomaticReconnect(true);//设置自动重连

    client.setCallback(new MqttCallback());//获取订阅消息
    client.connect(connOpts);
    client.subscribe(topic, qos);//订阅topic
} catch(MqttException me) {
    me.printStackTrace();
}

获取订阅消息
paho的消息获取通过实现MqttCallback接口,MqttCallback接口通过messageArrived方法获取消息

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
    //messge的处理请放入其他线程中,在该方法中消耗时间过多将影响qos为1或2的响应,使服务器认为未成功投递消息
    System.out.println("topic:" + topic + " msg:" + message);
}


/**
 * [重要提示]
 * 连接丢失后的处理逻辑
 * 1、连接重连
 * 2、重新订阅Topic数据
 * @param cause
 */
@Override
public void connectionLost(Throwable cause) {
    cause.printStackTrace();
    while (true) {
        try {
            //重连
            if (!client.isConnected()) {
                client.reconnect();
            }
            //重新订阅Topic数据
            if (client.isConnected()) {
                client.subscribe(topic, qos);
                System.out.println("has resubscribed");
                break;
            }
            TimeUnit.SECONDS.sleep(100);
        } catch (MqttException | InterruptedException e1) {
            e1.printStackTrace();
        }
        System.out.println("client not connect");
    }
}
文档更新时间: 2025-02-20 15:11   作者:刘家帅