Протокол обмена для маяков StarLine M15/M17
Рус | Eng
Данный протокол предназначен для маяков с версией ПО 2.3 и выше.
Описание протокола
Общие сведения
Протокол обмена данными маяков М15/М17 с сервером охватывает уровни сессии, представления данных, приложения и реализуется поверх TCP/IP соединения.
Структуры данных
В протоколе используются пакеты трех типов:
- Пакет запроса авторизации устройством
- Пакет ответа сервера на запрос авторизации
- Пакет данных от устройства
Каждый пакет состоит из одного и более полей:
- PktID – поле идентификации пакета
- IDE – поле идентификации устройства
- STAT – поле состояния устройства (включая GSM-координаты)
- GPS – поле GPS-данных
- CRC – поле контрольной суммы
Пакет запроса авторизации устройством
Пакет состоит из признака пакета авторизации (0x41) и поля идентификации устройства IDE.
Поле идентификации устройства IDE
Поле | Размер | Описание | Тип | Диапазон | По умолчанию | Примечание | |
---|---|---|---|---|---|---|---|
IMEI | 16x4 бит | IMEI устройства* | BCD | – | – | 15 цифр; старший полубайт — незначащий, нулевой | |
HWVer | DevType | 4 бита (4-7-й) | тип системы | 0 – 15 | – | 0х04 — маяк без данных баланса, 0х0С - маяк с данными баланса | |
HWVer | 4 бита (0-3-й) | версия «железа» системы | 0 – 15 | 1 | |||
SWVer | 8 бит | версия ПО системы | лат. буква | 0 – 255 | а | ||
Login | 10x4 бит | логин | BCD | – | 0000000000 | 10 последних цифр номера телефона | |
Password | 4x4 бит | пароль | BCD | – | 1234 | 4 цифры, кодированные по правилу 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... | In | 1 бит (7-й) | Состояние входа | 0 — не активен 1 — активен (тревога) | 0 | ||
BatState | 7 бит (0-6-й) | Уровень заряда батареи | % | 0–100 | 0 | = 100, если подключено внешнее питание | |
BalanceByte2 | 8 бит | Значение баланса | 0–FF | – | Баланс на стороне по маяка сохраняется в int32_t, в пакете будут BalanceByte2 - третий байт - 0xF0 | ||
BalanceByte1 | 8 бит | Значение баланса | 0–FF | В примечаниях к баланс 1 | |||
Temperature | 8 бит | Температура маяка | °С | – | –100 | число со знаком | |
BalanceByte0 | 8 бит | Интервал пробуждения | мин | 0–240 | 0 | В примечаниях к баланс 1 | |
WIUnit | 8 бит | Время сна | символ | M/H | – | M — минуты, Н — часы | |
WorkMode | 8 бит | Режим работы | символ | N/A | – | N — нормальный режим, А — режим тревоги | |
GPRSInterval | 8 бит | Интервал передачи GPRS-пакетов | сек | 0–240 | – | ||
MCC | 8 бит | Mobile Country Code | 0xFF | 3-значное десятичное число, например, 250 | |||
MNC | 8 бит | Mobile Network Code | 0xFF | 2-значное десятичное число, например, 01 | |||
LAC | 8+8 бит | Location Area Code | 0xFFFF | 4-значное шестнадцатиричное число, например, 772F Передаётся старшим байтом вперед по правилу BigEndian | |||
CID | 8+8 бит | Cell ID | 0xFFFF | 4-значное шестнадцатиричное число, например 0A16 Передаётся старшим байтом вперед по правилу BigEndian |
* в отсутствии фактических данных
Подробное описание полей, передающих баланс:
Поле навигационных данных GPS
Поле GPS-данных
Поле | Размер | Описание | Ед. изм. / Формат | Диапазон | Примечание | |||
---|---|---|---|---|---|---|---|---|
GPS... | GPSSt | 2 бита (6-7-й) | Статус GPS-данных | 0–2 | 0 — нет данных от GPS-приемника 1 — устаревшие координаты (из "черного ящика") 2 — действительные координаты | |||
SATs | 6 бит (0-5-й) | Количество видимых спутников | ||||||
Time | 24 бита | Время по Гринвичу | hhmmss | Десятичная запись числа — 24 бита. Hour*10000 + Minute*100 + Second. | ||||
Date | 24 бита | Дата | ddmmyy | Десятичная запись числа — 24 бита. Day*10000 + Month*100 + Year. (Year = 0..99) | ||||
Lat | DEG | 8 бит | Широта | градусы | 0–90 | |||
Min | 20 бит (4-24-й) | минуты, доли минут | 0–595999 | Так же, как в NMEA GPRMC. Десятичная запись числа - 20 бит. Не BCD. | ||||
Side | 1 бит (0-й) | Часть света | 0/1 | 0 — юг, 1 — север | ||||
Long | DEG | 8 бит | Долгота | градусы | 0–179 | |||
Min | 20 бит (4-24-й) | минуты, доли минут | 0–595999 | Так же, как в NMEA GPRMC. Десятичная запись числа - 20 бит. Не BCD. | ||||
Side | 1 бит (0-й) | Часть света | 0/1 | 0 — юг, 1 — север | ||||
Velocity | 8 бит | Скорость | узлы (мили в час) | |||||
Cource | 16 бит | Курс | градусы | 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 (для каждого передаваемого байта):
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), если не оговорено обратное.
Пример обмена данными
Пакет авторизации
0x41 | 0x03 0x21 0x25 0x65 0x69 0x85 0x54 0x75 0xС1 0x61 0x91 0x73 0x48 0x40 0x02 0x12 0x34 | 0x81 |
Расшифровка:
- 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. После успешной авторизации маяк отправляет на сервер пакеты данных в установленный период.
Пакет данных
0x02 | 0x3E 0x0F 0x12 0x1E 0x06 0x4D 0x41 0x1E 0xFA 0x01 0x77 0x2F 0x18 0x52 | 0x85 0x00 0x9C 0x48 0x04 0x1F 0x1E 0x36 0x6C 0x29 0x61 0x38 0x0F 0x26 0xB1 0x0B 0x00 0x91 | 0x1C |
Расшифровка:
- 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