I also found this code from opengts TrackClientPacketHandlerjava file for the pt600. Maybe it can help to identify how the unit send data?
1153 /* parse and insert data record */ 1154 // this format supports some Bofan devices (PT600/PT502/PT300X) 1155 private byte[] parseInsertRecord_Device_1(String s) 1156 { 1157 // Format: 1158 // $<EventCode>,<MobileID>,<HHMMSS>,<GPSValid>,<NMEALat>,<N|S>,<NMEALon>,<E|W>,<SpeedKnots>,<Heading>,<DDMMYY> 1159 // Example: 1160 // $POS,10000,102215.000,V,2233.8171,N,14205.6367,W,0.0,0.0,250411 1161 // 0--- 1---- 2--------- 3 4-------- 5 6--------- 7 8-- 9-- A----- 1162 // | | | | | | | | | | |>DDMMYY 1163 // | | | | | | | | | |>Heading 1164 // | | | | | | | | |>Speed Knots 1165 // | | | | | | | |>E|W 1166 // | | | | | | |>Longitude DDDmm.mmmm 1167 // | | | | | |>N|S 1168 // | | | | |>Latitude DDmm.mmmm 1169 // | | | |>A=ValidGPS, V=InvalidGPS 1170 // | | |>HHMMSS 1171 // | |>MobileID 1172 // |>$POS: POS=PositionData 1173 Print.logInfo("Parsing: " + s); 1174 1175 /* pre-validate */ 1176 if (StringTools.isBlank(s)) { 1177 Print.logError("Packet string is blank/null"); 1178 return null; 1179 } else 1180 if (!s.startsWith("$")) { 1181 Print.logError("Packet string does not start with '$'"); 1182 return null; 1183 } 1184 1185 /* separate into fields */ 1186 String fld[] = StringTools.parseStringArray(s.substring(1), ','); 1187 if ((fld == null) || (fld.length < 11)) { 1188 Print.logWarn("Invalid number of fields"); 1189 return null; 1190 } 1191 1192 /* parse individual fields */ 1193 String eventCode = fld[0]; 1194 String modemID = fld[1].toLowerCase(); 1195 long fixtime = Nmea0183.parseFixtime (fld[10], fld[2], true); 1196 boolean validGPS = fld[3].equalsIgnoreCase("A"); 1197 double latitude = validGPS? Nmea0183.ParseLatitude (fld[ 4], fld[5], 90.0) : 0.0; 1198 double longitude = validGPS? Nmea0183.ParseLongitude(fld[ 6], fld[7], 180.0) : 0.0; 1199 double speedKnot = validGPS? StringTools.parseDouble(fld[ 8], 0.0) : 0.0; 1200 double speedKPH = validGPS? (speedKnot * KILOMETERS_PER_KNOT) : 0.0; 1201 double heading = validGPS? StringTools.parseDouble(fld[ 9], 0.0) : 0.0; 1202 double altitudeM = 0.0; // 1203 1204 /* status code */ 1205 int statusCode = StatusCodes.STATUS_LOCATION; 1206 if (StringTools.isBlank(eventCode)) { 1207 // -- blank, leave as-is 1208 } else 1209 if (eventCode.equalsIgnoreCase("POS")) { 1210 // -- "Position" event 1211 statusCode = StatusCodes.STATUS_LOCATION; 1212 } else 1213 if (eventCode.equalsIgnoreCase("IN1")) { 1214 // -- "SOS" button 1215 statusCode = StatusCodes.STATUS_WAYMARK_1; 1216 } else 1217 if (eventCode.equalsIgnoreCase("IN2")) { 1218 // -- "KEY2" alarm 1219 statusCode = StatusCodes.STATUS_WAYMARK_2; 1220 } else 1221 if (eventCode.equalsIgnoreCase("IN3")) { 1222 // -- "KEY2" alarm 1223 statusCode = StatusCodes.STATUS_WAYMARK_3; 1224 } else 1225 if (eventCode.equalsIgnoreCase("LPA")) { 1226 // -- "Low Power" alarm 1227 statusCode = StatusCodes.STATUS_LOW_BATTERY; 1228 } else 1229 if (eventCode.equalsIgnoreCase("CPA")) { 1230 // -- "Cut Power" alarm 1231 statusCode = StatusCodes.STATUS_POWER_FAILURE; 1232 } else 1233 if (eventCode.equalsIgnoreCase("SPD")) { 1234 // -- "Speeding" alarm 1235 statusCode = StatusCodes.STATUS_MOTION_EXCESS_SPEED; 1236 } else 1237 if (eventCode.equalsIgnoreCase("GOF")) { 1238 // -- "Geofence" alarm 1239 statusCode = StatusCodes.STATUS_GEOFENCE_VIOLATION; 1240 } else 1241 if (eventCode.startsWith("0x") || eventCode.startsWith("0X")) { 1242 // -- specific status code (specified as a hex value) 1243 int sc = StringTools.parseInt(eventCode,-1); 1244 if ((sc > 0) && (sc <= 0xFFFF)) { 1245 statusCode = sc; 1246 } 1247 } else 1248 if (Character.isDigit(eventCode.charAt(0))) { 1249 // -- specific status code (specified as a decimal value) 1250 int sc = StringTools.parseInt(eventCode,-1); 1251 if ((sc > 0) && (sc <= 0xFFFF)) { 1252 statusCode = sc; 1253 } 1254 } else { 1255 // -- leave as-is 1256 } 1257 1258 /* GPS Event */ 1259 this.gpsEvent = this.createGPSEvent(modemID); 1260 if (this.gpsEvent == null) { 1261 // errors already displayed 1262 return null; 1263 } 1264 1265 /* populate GPS event fields */ 1266 this.gpsEvent.setTimestamp(fixtime); 1267 this.gpsEvent.setStatusCode(statusCode); 1268 this.gpsEvent.setLatitude(latitude); 1269 this.gpsEvent.setLongitude(longitude); 1270 this.gpsEvent.setSpeedKPH(speedKPH); 1271 this.gpsEvent.setHeading(heading); 1272 this.gpsEvent.setAltitude(altitudeM); 1273 1274 /* insert/return */ 1275 if (this.parseInsertRecord_Common(this.gpsEvent)) { 1276 // change this to return any required acknowledgement (ACK) packets back to the Device 1277 return null; 1278 } else { 1279 return null; 1280 } 1281 1282 }
I'm not sure what those short messages are. We need protocol documentation to implement it.
Does this document help? I asked bofan to send me their protocol and this is what I got.
https://www.dropbox.com/s/ug66qf5ffifvcmq/BOFAN%20Protocol-V1.2.pdf?dl=0
Does this help in the configuration?
It does not describe those messages. Either documentation is not full, or it's just a device issue.
Hi,
I have successfully connected my bofan pt600 to my traccar server but it is not working as well as it should. I'm new to this but from the server logs, I see that it connects as instructed every 120 seconds but after the initial ping which the server recognizes, it send data that the server doesn't recognize. I think these are short updates to its position that need interpretation as this unit was built to save data transmission.
Is there any way to configure the server to recognize these small updates?
A short snippet of the server log is below: