Теперь что-то получается. Traccar записал свои таблицы в БД gts сервера MSSQL OpenGTS. В логах Traccar вижу следующие ошибки:
tracker-server.log
2016-01-13 13:30:42 INFO: [B35057F0] connected
2016-01-13 13:30:42 DEBUG: [B35057F0: 5023 < 192.168.1.253] HEX: 78780d01035288707188432800072d950d0a
2016-01-13 13:30:44 WARN: Рядом с "REGEXP" в контексте, где ожидается условие, указано выражение типа, отличного от логического. - SQLServerException (... < QueryBuilder:376 < DataManager:232 < *:122 < *:142 < BaseProtocolDecoder:47 < ...)
в wrapper.log (правда не знаю, ошибка это, или просто предупреждение)
INFO | jvm 1 [C3P0PooledConnectionPoolManager[identityToken->1bqym0z9eg8pj3j1c75knv|3eb9367a]-HelperThread-#0] WARN com.mchange.v2.c3p0.DriverManagerDataSource - Could not load driverClass com.microsoft.sqlserver.jdbc.SQLServerDriver
INFO | jvm 1 java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
Что-то не то получается. Таблицы не должны создаваться. Если создаются, значит конфигурация неправильная.
Что касается второй ошибки, то нужно подредактировать запрос. Надо заменить imeiNumber REGEXP '^[0-9]+$'
на ISNUMERIC(imeiNumber) == 1
.
Если создаются, значит конфигурация неправильная.Вот так, согласно инструкции, настроено подключение к БД
<entry key='database.driverFile'>c:\Program Files\Traccar\lib\sqljdbc41.jar</entry>
<entry key='database.driver'>com.microsoft.sqlserver.jdbc.SQLServerDriver</entry>
<entry key='database.url'>jdbc:sqlserver://localhost;user=sa;password=***;</entry>
<entry key='database.user'>sa</entry>
<entry key='database.password'>***</entry>
Что касается второй ошибки, то нужно подредактировать запросЗаменил
imeiNumber REGEXP '^[0-9]+$'
на ISNUMERIC(imeiNumber) == 1
в tracker-server.log новая ошибка
WARN: Неправильный синтаксис около конструкции "=". - SQLServerException (... < QueryBuilder:376 <
DataManager:232 < *:122 < *:142 < BaseProtocolDecoder:47 < ...)
И еще, Антон, подскажи, пожалуйста. Я правильно понимаю логику интеграции Traccar И OpenGTS, что Traccar будет писать свои данные в таблицы, с которыми уже работает OpenGTS в БД gts? И как это работает, сразу же, как Traccar получает данные, или через какое-то время?
Traccar будет писать данные напрямую в OpenGTS сразу при получении данных. Попробуй ISNUMERIC(imeiNumber) = 1
.
Теперь вот такие ошибки. Все запросы из инструкции скопированы, поменяно только ISNUMERIC(imeiNumber) = 1
2016-01-14 13:10:51 INFO: Version: 3.2-SNAPSHOT 2016-01-14 13:10:51 INFO: Query not provided: database.selectLatestPositions 2016-01-14 13:10:52 INFO: Starting server... 2016-01-14 13:10:54 INFO: [03D6822B] connected 2016-01-14 13:10:54 DEBUG: [03D6822B: 5023 < 192.168.1.253] HEX: 78780d01035288707188432800137b300d0a 2016-01-14 13:10:55 DEBUG: [03D6822B: 5023 > 192.168.1.253] HEX: 787805010013ea4f0d0a 2016-01-14 13:10:55 INFO: Query not provided: database.updateDeviceStatus 2016-01-14 13:11:38 DEBUG: [03D6822B: 5023 < 192.168.1.253] HEX: 78780a1340066400010013afe60d0a 2016-01-14 13:11:38 DEBUG: [03D6822B: 5023 > 192.168.1.253] HEX: 787805130013da620d0a 2016-01-14 13:11:38 INFO: Query not provided: database.updateDeviceStatus 2016-01-14 13:11:38 WARN: Неправильный синтаксис около ключевого слова "TRANSACTION". - SQLServerException (... < QueryBuilder:431 < DataManager:307 < DefaultDataHandler:27 < ...) 2016-01-14 13:11:38 INFO: [03D6822B] id: 352887071884328, time: 1970-01-01 03:00:00, lat: 0.00000, lon: 0.00000, speed: 0.0, course: 0.0
Попробуй вот эти запросы поставить в конфигурацию:
<entry key='database.selectDevicesAll'> SELECT imeiNumber AS id, imeiNumber AS uniqueId FROM Device WHERE ISNUMERIC(imeiNumber) = 1; </entry> <entry key='database.insertPosition'> BEGIN TRAN; DECLARE @accountID varchar(32); DECLARE @deviceID varchar(32); UPDATE Device SET lastValidLatitude = :latitude, lastValidLongitude = :longitude, lastGPSTimestamp = :time, lastUpdateTime = GETDATE() WHERE imeiNumber = :deviceId; SELECT @accountID = accountID, @deviceID = deviceID FROM Device WHERE imeiNumber = :deviceId; INSERT INTO EventData (accountID, deviceID, timestamp, statusCode, latitude, longitude, speedKPH, heading, altitude, rawData, creationTime, address) VALUES (@accountID, @deviceID, :time, 0, :latitude, :longitude, :speed * 1.852, :course, :altitude, '', GETDATE(), :address); COMMIT TRAN; </entry>
Теперь такая ошибка
2016-01-14 15:33:13 INFO: Version: 3.2-SNAPSHOT
2016-01-14 15:33:14 INFO: Query not provided: database.selectLatestPositions
2016-01-14 15:33:14 INFO: Starting server...
2016-01-14 15:34:10 INFO: [A07F590D] connected
2016-01-14 15:37:02 DEBUG: [A07F590D: 5023 < 192.168.1.253] HEX: 78780a134006640001000e64820d0a
2016-01-14 15:37:02 DEBUG: [A07F590D: 5023 > 192.168.1.253] HEX: 78780513000e11060d0a
2016-01-14 15:37:02 INFO: Query not provided: database.updateDeviceStatus
2016-01-14 15:37:02 WARN: Конфликт типов операндов: datetime2 несовместим с bigint - SQLServerException (... < QueryBuilder:431 < DataManager:307 < DefaultDataHandler:27 < ...)
2016-01-14 15:37:02 INFO: [A07F590D] id: 352887071884328, time: 1970-01-01 03:00:00, lat: 0.00000, lon: 0.00000, speed: 0.0, course: 0.0
Вот еще одна попытка. Надеюсь теперь заработает:
<entry key='database.selectDevicesAll'> SELECT imeiNumber AS id, imeiNumber AS uniqueId FROM Device WHERE ISNUMERIC(imeiNumber) = 1; </entry> <entry key='database.insertPosition'> BEGIN TRAN; DECLARE @accountID VARCHAR(32); DECLARE @deviceID VARCHAR(32); DECLARE @deviceTime BIGINT = DATEDIFF(S, '1970-01-01 00:00:00', DATEADD(HH, DATEDIFF(HH, GETDATE(), GETUTCDATE()), :time)); DECLARE @databaseTime BIGINT = DATEDIFF(S, '1970-01-01 00:00:00', GETUTCDATE()); UPDATE Device SET lastValidLatitude = :latitude, lastValidLongitude = :longitude, lastGPSTimestamp = @deviceTime, lastUpdateTime = @databaseTime WHERE imeiNumber = :deviceId; SELECT @accountID = accountID, @deviceID = deviceID FROM Device WHERE imeiNumber = :deviceId; INSERT INTO EventData (accountID, deviceID, timestamp, statusCode, latitude, longitude, speedKPH, heading, altitude, rawData, creationTime, address) VALUES (@accountID, @deviceID, @deviceTime, 0, :latitude, :longitude, :speed * 1.852, :course, :altitude, '', @databaseTime, :address); COMMIT TRAN; </entry>
Теперь такая ошибка
2016-01-15 08:36:45 INFO: Version: 3.2-SNAPSHOT
2016-01-15 08:36:45 INFO: Query not provided: database.selectLatestPositions
2016-01-15 08:36:46 INFO: Starting server...
2016-01-15 08:40:50 INFO: Query not provided: database.updateDeviceStatus
2016-01-15 08:40:50 WARN: The statement must be executed before any results can be obtained. - SQLServerException (... < QueryBuilder:433 < DataManager:307 < DefaultDataHandler:27 < ...)
2016-01-15 08:40:50 INFO: [FA7A469B] id: 352887071884328, time: 1970-01-01 03:00:00, lat: 0.00000, lon: 0.00000, speed: 0.0, course: 0.0
2016-01-15 08:43:46 WARN: Нарушение "PK__EventD__DBCDD2A929572725" ограничения PRIMARY KEY. Невозможно вставить повторяющийся ключ в объект "dbo.EventData". - SQLServerException (... < QueryBuilder:433 < DataManager:307 < DefaultDataHandler:27 < ...)
Теперь похоже что все работает как надо. Проблема в том что устройство присылает некорректный данные. Возможная причина - отсутствие сигнала GPS.
Антон, не могу понять, данные от точки разные парсинг одинаковый, что не так, не пишет в базу.
2016-01-15 17:51:58 INFO: Query not provided: database.updateDeviceStatus
2016-01-15 17:51:58 WARN: Нарушение "PK__MSEventD__DBCDD2A929572725" ограничения PRIMARY KEY. Невозможно вставить повторяющийся ключ в объект "dbo.MSEventData". - SQLServerException (... < QueryBuilder:433 < DataManager:307 < DefaultDataHandler:27 < ...)
2016-01-15 17:51:58 INFO: [41ABAD08] id: 352887071884328, time: 2016-01-15 17:49:18, lat: 57.30462, lon: 47.88286, speed: 21.1, course: 95.0
2016-01-15 17:54:53 DEBUG: [41ABAD08: 5023 < 192.168.1.253] HEX: 78780a131005640001009cadab0d0a
2016-01-15 17:54:53 DEBUG: [41ABAD08: 5023 > 192.168.1.253] HEX: 78780513009ca69d0d0a
2016-01-15 17:54:53 INFO: Query not provided: database.updateDeviceStatus
2016-01-15 17:54:53 WARN: Нарушение "PK__MSEventD__DBCDD2A929572725" ограничения PRIMARY KEY. Невозможно вставить повторяющийся ключ в объект "dbo.MSEventData". - SQLServerException (... < QueryBuilder:433 < DataManager:307 < DefaultDataHandler:27 < ...)
2016-01-15 17:54:53 INFO: [41ABAD08] id: 352887071884328, time: 2016-01-15 17:49:18, lat: 57.30462, lon: 47.88286, speed: 21.1, course: 95.0
2016-01-15 17:57:50 DEBUG: [41ABAD08: 5023 < 192.168.1.253] HEX: 78780a131004640001009db8090d0a
2016-01-15 17:57:50 DEBUG: [41ABAD08: 5023 > 192.168.1.253] HEX: 78780513009db7140d0a
2016-01-15 17:57:50 INFO: Query not provided: database.updateDeviceStatus
2016-01-15 17:57:50 WARN: Нарушение "PK__MSEventD__DBCDD2A929572725" ограничения PRIMARY KEY. Невозможно вставить повторяющийся ключ в объект "dbo.MSEventData". - SQLServerException (... < QueryBuilder:433 < DataManager:307 < DefaultDataHandler:27 < ...)
2016-01-15 17:57:50 INFO: [41ABAD08] id: 352887071884328, time: 2016-01-15 17:49:18, lat: 57.30462, lon: 47.88286, speed: 21.1, course: 95.0
Понял в чем проблема. Трекер закреплен на окне, для тестов, при переносе в другое место данные изменились в базу записались. Какое то китайское чудо, время должно меняться с каждым пакетом.
Антон, посмотрите еще на одну ошибку, я начал переносить traccar с тестового сервера на рабочий, все точно такое же только MSSQL2012
2016-01-16 17:31:24 DEBUG: [2059C3F6: 5023 < 192.168.1.253] HEX: 78780a1340066400010007f9430d0a
2016-01-16 17:31:33 DEBUG: [2059C3F6: 5023 < 192.168.1.253] HEX: 78780d0103528870719119980008b3bc0d0a
2016-01-16 17:32:03 WARN: Connections could not be acquired from the underlying database! - SQLException (... < QueryBuilder:55 < *:131 < DataManager:231 < *:122 < *:142 < BaseProtocolDecoder:47 < ...)
Думаю что какая-то проблема с параметрами поключения к базе. Точно URL и пользователь правильные? Возможно у пользователя нету прав каких-нибудь?
Обновил инструкцию. Нужно удалить все начиная с "database.changelog" и заканчивая "database.updateLatestPosition".