Yacht Devices Новости: NMEA 2000 Bridge: тригонометрия и шифрование программ
01.07.2019
Прошивка 1.30 предлагает тригонометрические функции и константы, а также позволяет распространять защищенные программы и «заблокированные» устройства.
Начнем с простых вещей. Новые математические функции и константы (см. рисунок выше) позволяют создавать программы для управления автопилотами и расчета ветра, сноса, VMG, расстояния между точками и т. д. Тригонометрические функции принимают аргументы в радианах.
Ниже приведен пример программы (скачать код), который рассчитывает TWA, TWS и TWD (теоретический угол, скорость и направление ветра) с использованием AWA / AWS (кажущийся угол и скорость ветра) и данных COG / SOG. Он получает и отправляет данные с/на интерфейс CAN1, поэтому интерфейс CAN2 можно оставить неподключенным.
Программа выглядит большой, но на самом деле она занимает около 4% доступной памяти. Вы можете создавать программы в 25 раз больше!
# Calculate TWS, TWD and TWA (teoretical wind) by COG/SOG and AWS/AWA
# (c) 2019, Yacht Devices Ltd. Version 1.1, 29/06/2019
# Byte code size is 660 bytes (4% of user program space)
FW_CAN1_TO_CAN2=OFF
FW_CAN2_TO_CAN1=OFF
init()
{
# T = 0 # No COG/SOG data, but all variables are 0 at start
M = 0 - 1.0 # Float -1.0
}
# COG & SOG, Rapid Update
match(CAN1,0x1F80200,0x1FFFF00)
{
R = get(DATA+1,UINT8) & 0x3 # True Reference = 0
A = get(DATA+2,UINT16) # Course Over Ground, 0.0001 rad/bit
B = get(DATA+4,UINT16) # Speed Over Ground, 0.01 m/s
if (R == 0) {
if (A < 0xFFFD) {
if (B < 0xFFFD) {
T = timer() # Timestamp of COG/SOG data
C = cast(A,FLOAT) / 10000 # COG, to radians
S = cast(B,FLOAT) / 100 # SOG, m/s
}
}
}
}
# Wind Data
match(CAN1,0x1FD0200,0x1FFFF00)
{
R = get(DATA+5,UINT8) & 0x7 # Apparent Wind = 2
W = get(DATA+1,UINT16) # Wind speed, 0.01 m/s
A = get(DATA+3,UINT16) # Wind direction, 0.0001 rad/bit
# Have valid apparent wind data?
if (R == 2) {
if (A < 0xFFFD) {
if (W < 0xFFFD) {
# Have actual COG/SOG data (2000 ms)
if (T > 0) {
if (timediff(T) < 2000) {
# TWD calculation when no speed or TWS is about zero
A = cast(A,FLOAT) / 10000 # Wind angle
Y = C + A # TWD=COG+AWA
if (S == 0) {
X = W # TWS is equal to AWS when no speed
}
else {
W = cast(W,FLOAT) / 100 # Wind speed, float
# Calculate TWS
U = sqrt(W*W + S*S - 2*W*S*cos(A))
X = cast(U*100,UINT16) # 0.01 m/s per bit
# Calculate TWD
if (X != 0) {
F = (S*S + U*U - W*W) / (2 * U * S)
# Possible possible rounding issue
if (F < M) {
F = M
}
F = M_PI - acos( F ) # M_PI is 3.14... constant
if (A > M_PI) {
Y = C - F
}
else {
Y = C + F
}
}
}
# Check is TWD in 360 degrees
if (Y > M_2PI) {
Y = Y - M_2PI # M_2PI is 2*PI constant, M_PI2 is PI/2
}
if (Y < 0) {
Y = Y + M_2PI
}
# Calculate TWA and check the range of value
Z = Y - C
if (Z < 0) {
Z = Z + M_2PI
}
# Transform to NMEA 2000 resolution, 0.0001 rad/bit
Y = cast(Y*10000,UINT16)
Z = cast(Z*10000,UINT16)
# Theoretical Wind (ground referenced, referenced to True North;
# calculated using COG/SOG) - TWD/TWS
set(DATA+5, UINT8, 0xF8) # Data type
set(DATA+1, UINT16, X) # TWS
set(DATA+3, UINT16, Y) # TWD
# Send message to the same interface, using the address
# of the wind sensor
send(CAN1)
# Theoretical (Calculated to Centerline of the vessel, refernced
# to ground; calculated using COG/SOG) - TWA/TWS
set(DATA+5, UINT8, 0xFB) # Data type
set(DATA+3, UINT16, Z) # TWA
send(CAN1)
}
}
}
}
}
}
# End of program
Для тестирования программы вы можете использовать CAN Log Viewer и наш NMEA 2000 Wi-Fi Router YDNR-02. Мы отправим данные COG / SOG и AWA / AWS из CAN Log Viewer и проверим результаты в Web Gauges.
В правилах маршрутизации YDNR-02 включите маршрутизация с сервера с CAN Log Viewer на Сервер №1, который используется для Web Gauges. Это позволит вам видеть исходные данные (отправленные из CAN Log Viewer) вместе с выходными данными (отправленными Bridge). На странице «Настройки NMEA» YDNR вам также необходимо установить для расчета ветра значение «Любой» (заводская настройка) или «COG / SOG». YDNR фактически не будет рассчитывать теоретический ветер, если он доступен в сети NMEA 2000; он будет использовать данные из сети. Однако, если вы установите для вычислений значение «Отключено», для преобразования теоретического ветра из NMEA 2000 в NMEA 0183 будут использоваться теоретические данные о ветре, рассчитанные с использованием STW /Heading.
Рисунок 1. Отправка сообщений формы CAN Log Viewer
Скопируйте и вставьте сообщения из таблицы ниже в CAN Log Viewer (см. рисунок 1) и отправьте в сеть.
Таблица 1. Тестовые данные программы
| Тест | Исходные сообщения | Исходные данные | Вывод Bridge |
| 1 | 09F802A3 FF FC 39 14 E8 03 FF FF |
COG 30°, SOG 10 m/s AWS 10 m/s, AWA 30° |
TWS 5.1 m/s TWA 104.8°TWD 134.5° |
| 2 | 09F802A3 FF FC 39 14 E8 03 FF FF |
COG 30°, SOG 10 m/s AWS 10 m/s, AWA 330° |
TWS 5.2 m/s TWA 255° TWD 284.7° |
| 3 | 09F802A3 FF FC 39 14 E8 03 FF FF |
COG 30°, SOG 10 m/s AWS 0 m/s, AWA 330° |
TWS 10 m/s TWA 180° TWD 209.7° |
| 4 | 09F802A3 FF FC 00 00 E8 03 FF FF |
COG 0°, SOG 10 m/s AWS 10 m/s, AWA 330° |
TWS 5.2 m/s TWA 255° TWD 255° |
| 5 | 09F802A3 FF FC E0 FA E8 03 FF FF |
COG 330°, SOG 10 m/s AWS 10 m/s, AWA 330° |
TWS 5.2 m/s TWA 255° TWD 330° |
| 6 | 09F802A3 FF FC 00 00 E8 03 FF FF |
COG 0°, SOG 10 m/s AWS 10 m/s, AWA 45° |
TWS 7.7 m/s TWA 112.5° TWD 112.5° |
The best way check the results is to configure Web Gauges in the way shown in Figure 2, you will see input and output data on the same page.
Figure 2. Web Gauges with wind data (Test 1)
And, of course, you can use the log() function for deep debug of the program.
This year we have served several customers who have created very complicated programs for the Bridge, use proprietary protocols and have non-disclosure obligations. To meet their requirements, we added encryption to the Bridge.
Please, read the following carefully, or you can lock your Bridge forever!
Table 2. The PASSWORD_LEVEL key
| Bit # | ||
| 1 | Password protection is enabled | Password protection is disabled, all other bits are ignored (will be reset to 0) |
| 2 | Device's serial is used for encryption | Serial number is not used for encryption |
| 3 | The program cannot be downloaded from the Bridge | Encrypted program can be downloaded from the Bridge |
| 4 | The Bridge can be reset using the password only | The Bridge can be reset by user, the program will be erased |
The protection is managed by the PASSWORD (from 1 to 64 symbols) and PASSWORD_LEVEL (values from 0 to 15) settings. If the PASSWORD is empty in the user program, the PASSWORD_LEVEL will be reset to 0 and these settings will not be saved in the YDNBSAVE.CFG file.
To enable password protection, add the following lines to your program:
PASSWORD=abc123
PASSWORD_LEVEL=1
YDNBSAVE.CFG с зашифрованная программа будет сохранена (см. пример). После этого Bridge будет принимать только программы, зашифрованные паролем «abc123». Чтобы сбросить Bridge, загрузите файл конфигурации со специальным комментарием:
# YD:RESET
Затем включаем «максимальную защиту»:
PASSWORD=abc123
PASSWORD_LEVEL=15
YDNBSAVE.CFG будет содержать сообщение о том, что программа заблокирована и не может быть загружена. Поскольку вы устанавливаете бит 4 (15 — это 8+4+2+1, все биты установлены), вы можете сбросить Bridge только с исходным паролем. Вам нужно будет загрузить файл конфигурации:
# YD:RESET abc123
Мы не разглашаем алгоритм шифрования, но вы можете быть уверены, что программная атака будет дороже, чем аппаратная. Если Bridge защищен, восстановить пароль или сохранить незашифрованную программу невозможно.
Как вы можете использовать эту функцию:
- вы можете перепродавать Bridges с пользовательской программой, защищенной от несанкционированного доступа или изменения, а также распространять зашифрованные обновления среди своих пользователей;
- если установлен бит 4, Bridge не может быть сброшен пользователем и может использоваться только с вашими собственными программами;
- если установлен бит 2, вам нужно будет генерировать индивидуальные обновления для ваших пользователей, но у вас будет возможность продавать отдельные обновления и предотвращать несанкционированное распространение обновлений;
- бит 3 увеличивает защиту, пользователь может проверить по сигналам LED, успешно ли полученное обновление загрузилось в Bridge или нет.
Для генерации программ для конечных пользователей мы добавили еще один ключ PASSWORD_SERIAL, он должен содержать серийный номер (восемь цифр) целевого устройства. Этот ключ не хранится в файле YDNBSAVE.CFG и используется только для его генерации. Если бит 2 не установлен в PASSWORD_LEVEL, вы можете использовать любой допустимый номер (например, 00000000), поскольку серийный номер не будет использоваться при шифровании. Если ключ установлен, PASSWORD и PASSWORD_LEVEL будут сброшены после создания файла YDNBSAVE.CFG, и вам не нужно будет сбрасывать Bridge после создания каждой зашифрованной программы.
Если установлен бит 2 и ключ PASSWORD_SERIAL отсутствует, Bridge будет использовать серийный номер вашего собственного Bridge для шифрования файла YDNBSAVE.CFG.
Знание пароля позволяет сбросить Bridge, но не позволяет расшифровать программу. Таким образом, вы можете попросить конечного пользователя прислать вам серийный номер и любой пароль, который ему нравится. Затем необходимо отправить обратно обычный YDNB.CFG с настройками PASSWORD и PASSWORD_LEVEL (1 или выше), чтобы переключить Bridge в защищенный режим. Другой YDNB.CFG с защищенной программой генерируется со значением PASSWORD_LEVEL, равным 3 или выше. Вы можете быть уверены, что отправленная вами программа будет использоваться только с Bridge клиента.
Настройка PASSWORD_LEVEL позволяет устанавливать биты защиты (увеличивает защиту), но не сбрасывать биты. Единственный способ сбросить биты (понизить защиту) — это сбросить Bridge вместе со стиранием пользовательской программы.
обновление для 1.30 доступен в разделе загрузок . Чтобы узнать больше о NMEA 2000 Bridge, посетите домашняя страница продукта. Руководство пользователя скоро будет обновлено.


