AutoGRAPH.NET Service — различия между версиями
Admin (обсуждение | вклад) (→Описание работы) |
Admin (обсуждение | вклад) (→Примеры) |
||
Строка 122: | Строка 122: | ||
<pre> |
<pre> |
||
using System; |
using System; |
||
− | using System.Collections.Generic; |
||
using System.Globalization; |
using System.Globalization; |
||
+ | using System.IO; |
||
using System.Linq; |
using System.Linq; |
||
− | using System. |
+ | using System.Runtime.Serialization; |
using AutoGRAPHService; |
using AutoGRAPHService; |
||
Строка 138: | Строка 138: | ||
RSchema[] schemas; |
RSchema[] schemas; |
||
using (var f = new TimeCalc("EnumSchemas")) // запрашиваем список доступных схем |
using (var f = new TimeCalc("EnumSchemas")) // запрашиваем список доступных схем |
||
− | schemas = svc.EnumSchemas(); |
+ | schemas = svc.EnumSchemas(); |
+ | var currentSchema = schemas.FirstOrDefault(p => p.Name == "DemoCEBIT").Name; |
||
− | REnumDevices devices; |
||
+ | |||
+ | Guid[] currentDevices = null; |
||
using (var f = new TimeCalc("EnumDevices")) |
using (var f = new TimeCalc("EnumDevices")) |
||
+ | { |
||
− | devices = svc.EnumDevices(schemas[0].Name); // запрашиваем список доступных в схеме приборов |
||
− | + | var devices = svc.EnumDevices(currentSchema); |
|
− | + | foreach (var item in devices.Items) |
|
+ | Console.WriteLine("\t" + item.Name); |
||
+ | currentDevices = devices.Items.Where(p => p.Serial == 9999999 || p.Serial == 9999998).Select(p => p.ID).ToArray(); // выбираем только приборы с номерами 9999998 и 9999999 |
||
+ | } |
||
using (var f = new TimeCalc("EnumGeoFences")) // запрашиваем список доступных в схеме геозон |
using (var f = new TimeCalc("EnumGeoFences")) // запрашиваем список доступных в схеме геозон |
||
− | svc.EnumGeoFences( |
+ | svc.EnumGeoFences(currentSchema); |
+ | |||
using (var f = new TimeCalc("GetDevicesInfo")) |
using (var f = new TimeCalc("GetDevicesInfo")) |
||
− | svc.GetDevicesInfo( |
+ | svc.GetDevicesInfo(currentSchema); |
+ | |||
+ | using (var f = new TimeCalc("EnumParameters")) // запрашиваем список параметров для ТС |
||
+ | svc.EnumParameters(currentSchema, currentDevices); |
||
+ | |||
− | using (var f = new TimeCalc(" |
+ | using (var f = new TimeCalc("GetOnlineInfo")) // запрашиваем онлайн-состояние ТС |
− | svc.EnumParameters(schemas[0].Name, devices.Items.Select(p => p.ID).ToArray()); |
||
− | |||
− | using (var f = new TimeCalc("GetOnlineInfo")) // запрашиваем онлайн-состояние всех ТС в схеме |
||
− | svc.GetOnlineInfo(schemas[0].Name, devices.Items.Select(p => p.ID).ToArray()); |
||
− | |||
− | using (var f = new TimeCalc("GetTrips")) // запрашиваем список рейсов за последние 5 дней для всех ТС, с номерами начинающихся 9999998 |
||
− | svc.GetTrips(schemas[0].Name, |
||
− | devices.Items.Where(p => p.Serial >= 9999998).Select(p => p.ID).ToArray(), |
||
− | DateTime.Now.AddDays(-5), DateTime.Now); |
||
− | |||
− | using (var f = new TimeCalc("GetTrack")) // запрашиваем треки за последние 5 дней для всех ТС, с номерами начинающихся 9999998 |
||
{ |
{ |
||
− | var |
+ | var onlineInfo = svc.GetOnlineInfo(currentSchema, currentDevices); |
− | + | var serializer = new DataContractSerializer(typeof (ROnlineInfo)); |
|
− | + | foreach (var oi in onlineInfo) |
|
+ | { |
||
+ | var stm = new MemoryStream(); |
||
+ | serializer.WriteObject(stm, oi.Value); |
||
+ | var fileName = "OnlineInfo_" + oi.Key + ".xml"; |
||
+ | File.WriteAllBytes(fileName, stm.ToArray()); // записываем на диск в файл .xml сериализованное состояние |
||
+ | Console.WriteLine("OnlineInfo: {0}", fileName); |
||
+ | } |
||
} |
} |
||
+ | using (var f = new TimeCalc("GetTrips")) // запрашиваем список рейсов за сегодня для ТС |
||
+ | { |
||
+ | var serializer = new DataContractSerializer(typeof (RTrips)); |
||
+ | var trips = svc.GetTrips(currentSchema, currentDevices, DateTime.Now.Date, DateTime.Now); |
||
+ | foreach (var trip in trips) |
||
+ | { |
||
+ | var stm = new MemoryStream(); |
||
+ | serializer.WriteObject(stm, trip.Value); |
||
+ | var fileName = "Trips_" + trip.Key + ".xml"; |
||
+ | File.WriteAllBytes(fileName, stm.ToArray()); // записываем на диск в файл .xml сериализованное состояние |
||
+ | Console.WriteLine("Trips: {0}", fileName); |
||
+ | } |
||
+ | } |
||
+ | |||
+ | using (var f = new TimeCalc("GetTrack")) // запрашиваем треки за последние 5 дней для всех ТС, с номерами начинающихся 9999998 |
||
+ | { |
||
+ | var serializer = new DataContractSerializer(typeof(RTrackInfo[])); |
||
+ | var tracks = svc.GetTrack(currentSchema, currentDevices, DateTime.Now.Date, DateTime.Now); |
||
+ | foreach (var trip in tracks) |
||
+ | { |
||
+ | var stm = new MemoryStream(); |
||
+ | serializer.WriteObject(stm, trip.Value); |
||
+ | var fileName = "Tracks_" + trip.Key + ".xml"; |
||
+ | File.WriteAllBytes(fileName, stm.ToArray()); // записываем на диск в файл .xml сериализованное состояние |
||
+ | Console.WriteLine("Tracks: {0}", fileName); |
||
+ | } |
||
+ | } |
||
Console.ReadLine(); |
Console.ReadLine(); |
||
} |
} |
||
Строка 174: | Строка 207: | ||
// простой класс для замера скорости выполнения блока |
// простой класс для замера скорости выполнения блока |
||
− | class TimeCalc:IDisposable |
+ | class TimeCalc : IDisposable |
{ |
{ |
||
readonly DateTime DT; |
readonly DateTime DT; |
||
readonly string name; |
readonly string name; |
||
internal TimeCalc(string name) { DT = DateTime.Now; this.name = name; } |
internal TimeCalc(string name) { DT = DateTime.Now; this.name = name; } |
||
− | void IDisposable.Dispose() { Console.WriteLine(name+": "+DateTime.Now.Subtract(DT).TotalSeconds.ToString("F3", CultureInfo.InvariantCulture)); } |
+ | void IDisposable.Dispose() { Console.WriteLine(name + ": " + DateTime.Now.Subtract(DT).TotalSeconds.ToString("F3", CultureInfo.InvariantCulture)); } |
} |
} |
||
} |
} |
Версия 17:39, 29 сентября 2015
Сервис предоставляет WCF/JSON API для доступа ядру расчетов AutoGRAPH.NET. Конфигурация схем выполняется с помощью диспетчерского ПО AutoGRAPH.NET. Работает в двух режимах – консольном и как сервис.
Содержание
Минимальные требования к аппаратному и программному обеспечению
- RAM – от 1 GB
- Windows 2003 или более новая
- .NET Framework 4.0 или более новый
- установленный загрузчик данных (AutoGRAPH DataLoader) или AutoGRAPH Server 3.x или 4.x или 5.x
Загрузка
Последняя версия: 2015.9.18, http://agi.tk-chel.ru/install/service/AutoGRAPHService20150918.zip
Режим консоли
В основном предназначен для отладки и тестирования. Достаточно просто запустить файл AutoGRAPHNETService.exe.
Режим сервиса
Устанавливается как сервис (служба) Windows и работает автономно. Командная строка для установки:
sc create AutoGRAPHNETService binPath= "C:\TK\WebMapK\Build-Svc\AutoGRAPHNETService.exe"
между binPath= и полным путем - пробел
Описание работы
После распаковки AutoGRAPH.NET Service в какой-нибудь каталог необходимо отредактировать файл AutoGRAPHNETService.exe.config. Далее приведены описания ключей файла конфигурации:
<add key="key-file" value="N:\Ключи АвтоГРАФ-Сервер\AutoGRAPHServer_3.0\30008_4x4_magnitka.agkey"/> <add key="address" value="http://localhost:800/"/> <add key="address-json" value="http://localhost:810/"/> <add key="common-directory" value="C:\ProgramData\AutoGRAPH Shell"/> <add key="data-directory" value="C:\Users\denisio\AppData\Roaming\AutoGRAPH Shell\Data"/> <add key="users-directory" value="C:\TK\DataLoader\_testusers"/> <add key="devices-directory" value="C:\TK\DataLoader\_testdevices"/>
key-file | файл ключа .agkey (от AutoGRAPH.Server), который разрешает использования для прописанного списка приборов. Данный файл находится в каталоге AutoGRAPH.Server. Обязательный параметр! Без него сервис работать не будет. | |
address | локальный адрес, на котором обрабатываются запросы по протоколу WCF (в настоящий момент протестирован только механизм httpBinding). Формат - url:port Варианты использования:
| |
address-json | локальный адрес, на котором обрабатываются запросы по протоколу JSON. Формат - url:port Варианты использования:
| |
common-directory |
каталог с общими данными (структура каталога аналогична каталогу AutoGRAPH.NET – с подкаталогами Schemes, GeoFences, Devices в которых находятся соответствующие файлы схем, геозон, приборов) | |
data-directory |
каталог данных (=data-каталог) AutoGRAPH DataLoader или AutoGRAPH Server 3.x или 4.x или 5.x | |
ddd-directory | каталог загруженных DDD-файлов (файлы карт тахографа) | |
users-directory |
Каталог с пользователями AutoGRAPH Server 4.x или 5.x, обычно он называется Users | Если указаны эти параметры - в сервисе включается аутентификация и перед любым вызовом любого метода необходимо выполнить аутентификацию. Подробее о механизме аутентификации здесь. |
devices-directory |
Каталог с пользователями AutoGRAPH Server 4.x или 5.x, обычно он называется DBF |
После редактирования конфиг-файла можно запустить сервис (или консольно) и сделать запрос:
svcutil.exe http://localhost:800/?wsdl /async /tcv:Version35 /ser:DataContractSerializer
В данном случае будет создан файл AutoGRAPHSvc.cs с прокси-классом для доступа к WCF-точке сервиса AutGRAPH.NET Service и output.config файл с описанием параметров подключения WCF. Файл output.config в данном случае не используется.
Методы сервиса
- Login – аутентификация и получение токена (в случае, если она включена)
- EnumSchemas – получение списка доступных сервису схем
- EnumDevices – получение списка устройств схемы
- EnumDrivers – получение информации о водителях в схеме
- EnumGeoFences – получение списка геозон схемы
- GetGeoFences – получение информации о геозонах (точки для полигонов и т.д.)
- EnumParameters – получение списка параметров устройства в схеме
Получение данных по приборам
- GetDevicesInfo – получение информации об устройстве в схеме
- GetOnlineInfo – получение информации о последнем местоположении устройств
- GetOnlineInfoAll – получение информации о последнем местоположении всех устройств
- GetDataRanges – получение информации о загруженных данных для приборов (минимальная/максимальные доступные даты)
- GetTrips – получение информации о рейсах устройства с текущими настройками схемы
- GetTripsCustom – получение информации о рейсах устройства с указанными геозонами
- GetStage – получение информации по одному отрезку для устройств
- GetTrack – получение трека (даты/время, координаты, скорость) устройства с текущими настройками схемы
Доступ к свойствам
- GetProperties – получение списка свойств и их значений устройства
- GetProperty – получение значения одного свойства у списка приборов
Выполнение отчетов
- EnumReports - получение списка доступных отчетов
- GetReports - выполнение отчета и загрузка его в виде XML/PDF/DOCX/XLS/.../ZIP-файла (формат выполнения указывается)
- ExecuteReports - асинхронное выполнение отчета(ов)
- GetReportsStatus - получение состояния выполнения отчета(ов)
- CancelReports - отмена выполнения отчета
Получение информации из DDD-файлов тахографа
- GetCardStatistic - получение информации по DDD-файлам указанной карты
- GetCardStatisticAll - получение информации по всем доступным DDD-файлам
- GetCardRecords - получение информации из DDD-файлов указанных карт
Прочее
- GetRoute – прокладка маршрута и получение этой информации в виде набора точек
- WaitData - ожидание получения новых данных
Также сервис поддерживает загрузку/выгрузку и получение списка схем. AutoGRAPH.NET начиная версии 2015.8.6 умеет работать с AutoGRAPH.NET Service как с веб-сервером. Подробнее здесь.
Примеры
using System; using System.Globalization; using System.IO; using System.Linq; using System.Runtime.Serialization; using AutoGRAPHService; namespace AutoGRAPHSvcTest { class Program { static void Main(string[] args) { var svc = new AutoGRAPHSvcClient(); // создаем прокси-класс с адресом подключения по умолчанию RSchema[] schemas; using (var f = new TimeCalc("EnumSchemas")) // запрашиваем список доступных схем schemas = svc.EnumSchemas(); var currentSchema = schemas.FirstOrDefault(p => p.Name == "DemoCEBIT").Name; Guid[] currentDevices = null; using (var f = new TimeCalc("EnumDevices")) { var devices = svc.EnumDevices(currentSchema); foreach (var item in devices.Items) Console.WriteLine("\t" + item.Name); currentDevices = devices.Items.Where(p => p.Serial == 9999999 || p.Serial == 9999998).Select(p => p.ID).ToArray(); // выбираем только приборы с номерами 9999998 и 9999999 } using (var f = new TimeCalc("EnumGeoFences")) // запрашиваем список доступных в схеме геозон svc.EnumGeoFences(currentSchema); using (var f = new TimeCalc("GetDevicesInfo")) svc.GetDevicesInfo(currentSchema); using (var f = new TimeCalc("EnumParameters")) // запрашиваем список параметров для ТС svc.EnumParameters(currentSchema, currentDevices); using (var f = new TimeCalc("GetOnlineInfo")) // запрашиваем онлайн-состояние ТС { var onlineInfo = svc.GetOnlineInfo(currentSchema, currentDevices); var serializer = new DataContractSerializer(typeof (ROnlineInfo)); foreach (var oi in onlineInfo) { var stm = new MemoryStream(); serializer.WriteObject(stm, oi.Value); var fileName = "OnlineInfo_" + oi.Key + ".xml"; File.WriteAllBytes(fileName, stm.ToArray()); // записываем на диск в файл .xml сериализованное состояние Console.WriteLine("OnlineInfo: {0}", fileName); } } using (var f = new TimeCalc("GetTrips")) // запрашиваем список рейсов за сегодня для ТС { var serializer = new DataContractSerializer(typeof (RTrips)); var trips = svc.GetTrips(currentSchema, currentDevices, DateTime.Now.Date, DateTime.Now); foreach (var trip in trips) { var stm = new MemoryStream(); serializer.WriteObject(stm, trip.Value); var fileName = "Trips_" + trip.Key + ".xml"; File.WriteAllBytes(fileName, stm.ToArray()); // записываем на диск в файл .xml сериализованное состояние Console.WriteLine("Trips: {0}", fileName); } } using (var f = new TimeCalc("GetTrack")) // запрашиваем треки за последние 5 дней для всех ТС, с номерами начинающихся 9999998 { var serializer = new DataContractSerializer(typeof(RTrackInfo[])); var tracks = svc.GetTrack(currentSchema, currentDevices, DateTime.Now.Date, DateTime.Now); foreach (var trip in tracks) { var stm = new MemoryStream(); serializer.WriteObject(stm, trip.Value); var fileName = "Tracks_" + trip.Key + ".xml"; File.WriteAllBytes(fileName, stm.ToArray()); // записываем на диск в файл .xml сериализованное состояние Console.WriteLine("Tracks: {0}", fileName); } } Console.ReadLine(); } } // простой класс для замера скорости выполнения блока class TimeCalc : IDisposable { readonly DateTime DT; readonly string name; internal TimeCalc(string name) { DT = DateTime.Now; this.name = name; } void IDisposable.Dispose() { Console.WriteLine(name + ": " + DateTime.Now.Subtract(DT).TotalSeconds.ToString("F3", CultureInfo.InvariantCulture)); } } }
Файл .exe.config вышеприведенного примера
<?xml version="1.0" encoding="utf-8" ?> <configuration>
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IAutoGRAPHSvc" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16348" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:800/" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAutoGRAPHSvc" contract="IAutoGRAPHSvc" name="BasicHttpBinding_IAutoGRAPHSvc" /> </client> </system.serviceModel></configuration>
Данный конфигурационный файл содержит WCF-конфигурацию для точки подключения сервиса. По умолчанию используется HTTP binding, но ровно таким же способом можно включить и and Answers&referringTitle=Home=Home другие транспорты.
Диагностика неисправностей
Список возможных ошибок и особенностей конфигурации приведён здесь.