概述
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");
}
}