Протокол обмена для маяков StarLine M15/M17

Рус | Eng

Данный протокол предназначен для маяков с версией ПО 2.3 и выше.

Описание протокола

Общие сведения

Протокол обмена данными маяков М15/М17 с сервером охватывает уровни сессии, представления данных, приложения и реализуется поверх TCP/IP соединения.

Структуры данных

В протоколе используются пакеты трех типов:

  1. Пакет запроса авторизации устройством
  2. Пакет ответа сервера на запрос авторизации
  3. Пакет данных от устройства

Каждый пакет состоит из одного и более полей:

  1. PktID – поле идентификации пакета
  2. IDE – поле идентификации устройства
  3. STAT – поле состояния устройства (включая GSM-координаты)
  4. GPS – поле GPS-данных
  5. CRC – поле контрольной суммы

Пакет запроса авторизации устройством

Пакет состоит из признака пакета авторизации (0x41) и поля идентификации устройства IDE.

Поле идентификации устройства IDE


ПолеРазмерОписаниеТипДиапазонПо умолчаниюПримечание

IMEI

16x4 битIMEI устройства*BCD

15 цифр; старший полубайт — незначащий, нулевой
HWVerDevType4 бита (4-7-й)тип системы
0 – 150х04 — маяк без данных баланса,  0х0С - маяк с данными баланса
HWVer4 бита (0-3-й)версия «железа» системы
0 – 151
SWVer8 битверсия ПО системылат. буква0 – 255а
Login10x4 битлогинBCD000000000010 последних цифр номера телефона
Password4x4 битпарольBCD12344 цифры, кодированные по правилу BigEndian
Структура пакета авторизации
typedef __packed struct
{
  	U08       IDSym;                     // PktID = 0x041 для пакета авторизации
  	U08       IMEI[8];                   // Старший ниббл = 0; старшая цифра IMEI в первом байте

  	__packed struct
	{
    	U08       HWVersion    :    4;   // Dерсия «железа» системы (1 по умолчанию)
    	U08       DevType      :    4;   // 0х04 - маяк без баланса, 0х05 - маяк м15 с балансом, 0х0С - маяк м17 с балансом 
  	}DevInfo;

  	U08       SWVersion;                 // Версия ПО маяка
  	U08       Login[5];                  // Телефон маяка в формате BCD
  	U16       Password;                  // Тоже все бинарные нули
  	U08       crc;                       // Контрольная сумма пакета
} MON_Auth_sctruct_t, *pMON_Auth_sctruct_t;

Пакет ответа сервера на запрос авторизации

В ответе сервер возвращает контрольную сумму пакета запроса авторизации.

Пакет данных от устройства

Пакет состоит из признака пакета данных (0x02), поля состояния устройства STAT и поля навигационных данных GPS.


Поле состояния устройства STAT

ПолеРазмерОписаниеЕд. изм.ДиапазонПо умолчанию*Примечание

State...

In1 бит (7-й)Состояние входа

0 — не активен

1 — активен (тревога)

0
BatState7 бит (0-6-й)Уровень заряда батареи%0–1000= 100, если подключено внешнее питание
BalanceByte28 битЗначение баланса
0–FF

Баланс на стороне по маяка сохраняется в int32_t, в пакете будут
передаваться только 3 младших байта. Соответственно:
BalanceByte2 - третий байт - 0x0F 
BalanceByte1 - второй байт - 0x12
BalanceByte0 - первый байт - 0x06
Баланс 987654 (0xF1206)

BalanceByte2 - третий байт - 0xF0
BalanceByte1 - второй байт - 0xED
BalanceByte0 - первый байт - 0xFA 
Баланс -987654 (0xF0EDFA)
Нулевой байт не передаётся, он не имеет значения для нас.

BalanceByte18 битЗначение баланса
0–FF
В примечаниях к баланс 1
Temperature8 битТемпература маяка°С–100число со знаком
BalanceByte08 битИнтервал пробуждениямин0–2400В примечаниях к баланс 1
WIUnit8 битВремя снасимволM/H

M — минуты, Н — часы

WorkMode8 битРежим работысимволN/AN — нормальный режим, А — режим тревоги
GPRSInterval8 битИнтервал передачи GPRS-пакетовсек0–240
MCC8 битMobile Country Code

0xFF3-значное десятичное число, например, 250
MNC8 битMobile Network Code

0xFF2-значное десятичное число, например, 01
LAC8+8 битLocation Area Code

0xFFFF

4-значное шестнадцатиричное число, например, 772F

Передаётся старшим байтом вперед по правилу BigEndian

CID8+8 битCell ID

0xFFFF

4-значное шестнадцатиричное число, например 0A16

Передаётся старшим байтом вперед по правилу BigEndian

* в отсутствии фактических данных

Подробное описание полей, передающих баланс:

Поле навигационных данных GPS

Поле GPS-данных

ПолеРазмерОписаниеЕд. изм. / ФорматДиапазонПримечание

GPS...

GPSSt2 бита (6-7-й)Статус GPS-данных

0–2

0 — нет данных от GPS-приемника

1 — устаревшие координаты (из "черного ящика")

2 — действительные координаты

SATs6 бит (0-5-й)Количество видимых спутников


Time24 битаВремя по Гринвичуhhmmss
Десятичная запись числа — 24 бита. Hour*10000 + Minute*100 + Second.
Date24 битаДатаddmmyy
Десятичная запись числа — 24 бита. Day*10000 + Month*100 + Year. (Year = 0..99)
Lat   DEG8 битШиротаградусы0–90
Min20 бит (4-24-й)минуты, доли минут0–595999Так же, как в NMEA GPRMC. Десятичная запись числа - 20 бит. Не BCD.
Side1 бит (0-й)Часть света
0/10 — юг, 1 — север
Long    DEG8 битДолготаградусы0–179
Min20 бит (4-24-й)минуты, доли минут0–595999Так же, как в NMEA GPRMC. Десятичная запись числа - 20 бит. Не BCD.
Side1 бит (0-й)Часть света
0/10 — юг, 1 — север
Velocity8 битСкоростьузлы (мили в час)

Cource16 битКурсградусы1–360Угол поворота от направления на север по минутной стрелке.

В отсутствие навигационных данных поля GPS заполняются нулями.


Структура пакета данных
typedef __packed struct
{
	U08       IDSym;                     // Поле PktID, для пакета данных = 0x02

	__packed struct 
	{
    	U08       BatLevel     :    7;     // Уровень батареи в %. 100% = внешнее питание
  		U08       AlarmInput   :    1;     // Состояние отслеживаемого входа: 0 - неактивен, 1 - тревога
	}DevState;

	U08       BalanceFirstPair;          // Первый байт баланса (** ff ** **) 
	U08       BalanceSecondPair			 // Второй байт баланса (** ** ff **) 
	U08       Temperature;               // Температура в градусах Цельсия. Если ошибка -> -100
	U08       BalanceThirdPair;          // Третий байт баланса (** ** ** ff )
	U08       TimeUnitSym;               // Символ "M" или "H"
	U08       WorkModeSym;               // Символ "G" или "A"
	U08       GPRSInterval;              // Интервал передачи GPRS пакетов. 10..240 сек.
 
	__packed struct
	{
  		U08       MCC;                     // Mobile Country Code, если нет данных = 0xFF
    	U08       MNC;                     // Mobile Network Code, если нет данных = 0xFF
    	U16       LAC;                     // Location Area Code, если нет данных = 0xFFFF
    	U16       CID;                     // Cell ID, если нет данных = 0xFFFF
  } CellCoords;
    
	__packed struct
	{
    	U08       SatelliteAmount  :  6;   // Количестов видимых спутников (если нет данных, то = 0x00)
    	U08       GPS_Status       :  2;   // 0 = нет GPS данных, 1 = устаревшие данные, 2 = актуальные данные
  	}GPSStatus;
  
  	__packed struct                      // Содержимое контейнера для ЧЯ. Бинарно совпадает с содержимым части пакета автофона.
  	{
    	U32      tm;                       // Метка времени
    	S32      lat;                      // Широта
    	S32      lon;                      // Долгота
    	U08      speed_knots;              // Скорость в узлах
   		U16      course : 9;               // Курс в градусах
    	U16      sat_cnt : 7;              // Количество используемых спутников
  	}GPS_Point;
 
  	U08       crc;                       //контрольная сумма пакета
} MON_Track_struct_t, *pMON_Track_struct_t;

Поле CRC

В расчете контрольной суммы участвуют все байты предшествующих полей пакета (кроме самого байта CRC). Перед передачей первого байта CRC устанавливается в 0x3B.

Функция расчета CRC (для каждого передаваемого байта):

CRC Calculation
U08   CalcCRC( U08 *buf,  U08 PktSize)
{
  	U08   bytes_amount = PktSize-1;	//кроме байта контрольной суммы
 	U08   crc = 0x3B;
  	U08   byte;
  
  	do
	{
    	byte = *buf;
    	crc += 0x56 ^ byte; 
   	 	crc++; 
    	crc ^= 0xC5 + byte; 
   		crc--;
   		buf++;
    	bytes_amount--;
  	} while (bytes_amount);
  
  	return crc;
}

Порядок байтов

Многобайтовые целочисленные значения передаются от старшего байта к младшему (BigEndian), если не оговорено обратное.

Пример обмена данными

Пакет авторизации

0x410x03 0x21 0x25 0x65 0x69 0x85 0x54 0x75 0xС1 0x61 0x91 0x73 0x48 0x40 0x02 0x12 0x340x81

Расшифровка:

  • 0x41: символ «А» (пакет авторизации)
  • 0x03 0x21 0x25 0x65 0x69 0x85 0x54 0x75: IMEI (321256569855475)
  • 0xС1: 4 – тип системы (маяк с данными баланса), 1 – версия «железа»»
  • 0x61: символ «а» (версия ПО)
  • 0x91 0x73 0x48 0x40 0x02: последние 10 цифр номера телефона из 1-й ячейки SIM (+7  917 3484002)
  • 0x12 0x34: пароль (1234)
  • 0x81: CRC

В ответ сервер присылает строку: "resp_crc=Ѓ", где "Ѓ" - символ с кодом 0x81. После успешной авторизации маяк отправляет на сервер пакеты данных в установленный период.

Пакет данных

0x020x3E 0x0F 0x12 0x1E 0x06 0x4D 0x41 0x1E 0xFA 0x01 0x77 0x2F 0x18 0x520x85 0x00 0x9C 0x48 0x04 0x1F 0x1E 0x36 0x6C 0x29 0x61 0x38 0x0F 0x26 0xB1 0x0B 0x00 0x910x1C

Расшифровка:

  • 0x02: «2» (рабочий пакет)
  • 0x3E: 7-й бит сброшен – вход неактивный, 0x3E=62 (уровень батареи)
  • 0x0F: первый байт данных баланса
  • 0x12: второй байт байт данных баланса
  • 0x1E: температура (+30C)
  • 0x06: третий байт байт данных баланса
  • 0x4D: минуты или часы для  интервала пробуждения («М» – минуты)
  • 0x41: режим работы  («А» – тревога)
  • 0x1E: интервал передачи GPRS-пакетов (30 секунд)
  • 0xFA: MCC (250)
  • 0x01: MNC (01)
  • 0x77 0x2F: LAC (0x772F)
  • 0x18 0x52: CID (0x1852)
  • 0x85: статус GPS-данных  (6-й и 7-й биты = 0b10 = 2 -  действительные координаты), количество спутников (0-й – 5-й биты – 0b000101 = 5)
  • 0x00 0x9C 0x48: время по Гринвичу, шестизначное число в формате чч:мм:сс, при необходимости дополняется нулями (40008 -> 04:00:08)
  • 0x04 0x1F 0x1E: дата, шестизначное число в формате дд:мм:гг, при необходимости дополняется нулями (27:01:10)
  • 0x36: широта, градусы (54)
  • 0x6C 0x29 0x61: 4 - 27-й биты – широта (минуты, доли минут), шестизначное число, при необходимости дополняется нулями (0x6C 0x29 0x6 = 44.3030); 0-й бит установлен (север)
  • 0x38: долгота, градусы (056)
  • 0x0F 0x26 0xB1: 4 - 27-й биты – долгота (минуты, доли минут), шестизначное число, при необходимости дополняется нулями (0x0F 0x26 0xB= 06.2059); 0-й бит установлен (восток)
  • 0x0B: скорость в узлах (11)
  • 0x00 0x91: курс в градусах (145)
  • 0x1C: CRC