Т.е. команда на зажигание одинаковая, а вот постановка / снятие с охраны - мутирующая?
команды на зажигание нет. Это просто когда вклчаешь зажигание, блок сигналки шлёт в GSM модуль новое состояние. Команды отправляются по смс. Например поставить на охрану, снять с охраны, запуск двс, стоп двс, запрос состояния. У меня сигналка без запуска поэтому проверить команду старт и стоп двс не получится. А вот снять / поставить на охрану, да, динамические команды, судя по логу. Хочу сейчас ещё раз заснифить процедуру привязки GSM, такие же ли там байты будут.
СМС команда “запрос состояния” также динамическая, значит можно сделать вывод что все смс команды имеют динамический код. Поправил скетч, добавил проверку контрольки, ниже ещё лог.
Starline to GSM: 01010000101000000000000000010000111111110000000000000000000000000000000001101000
0A 05 00 08 FF 00 00 00 00 16 CS is OK!
Starline to GSM: 01010000101000010000000000010000111111110000000000000000000000000000000001101001
0A 85 00 08 FF 00 00 00 00 96 CS is OK!
Starline to GSM: 01010000101000010000000000000000111111110000000000000000000000000000000001110001
0A 85 00 00 FF 00 00 00 00 8E CS is OK!
Starline to GSM: 01010000101000000000000000000000111111110000000000000000000000000000000001110000
0A 05 00 00 FF 00 00 00 00 0E CS is OK!
Starline to GSM: 01010000100000000000000000000000111111110000000000000000000000000000000001010000
0A 01 00 00 FF 00 00 00 00 0A CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
Send SMS Ohrana ON:
GSM to Starline: 01010000111101011010110100110001111111110000000000000000000000000000000010011111
0A AF B5 8C FF 00 00 00 00 F9 CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
GSM to Starline: 01010000001001111011010100101001111111110000000000000000000000000000000001110100
0A E4 AD 94 FF 00 00 00 00 2E CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
Send SMS Ohrana OFF:
GSM to Starline: 01010000010110000000000010011100111111110000000000000000000000000000000000111010
0A 1A 00 39 FF 00 00 00 00 5C CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
GSM to Starline: 01010000101100101010000000111000111111110000000000000000000000000000000011101001
0A 4D 05 1C FF 00 00 00 00 97 CS is Error!!!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
Send SMS Ohrana OFF:
GSM to Starline: 01010000011101010010110110110001111111110000000000000000000000000000000000011111
0A AE B4 8D FF 00 00 00 00 F8 CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
GSM to Starline: 01010000010001110101010111001001111111110000000000000000000000000000000000010100
0A E2 AA 93 FF 00 00 00 00 28 CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
Send SMS Ohrana ON:
GSM to Starline: 01010000110110001000000000011100111111110000000000000000000000000000000010111010
0A 1B 01 38 FF 00 00 00 00 5D CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
GSM to Starline: 01010000111100100110000011111100111111110000000000000000000000000000000010111001
0A 4F 06 3F FF 00 00 00 00 9D CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
Send SMS Ohrana OFF:
GSM to Starline: 01010000010000010001100110000101111111110000000000000000000000000000000000100011
0A 82 98 A1 FF 00 00 00 00 C4 CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
GSM to Starline: 01010000101011011011111100100011111111110000000000000000000000000000000011111110
0A B5 FD C4 FF 00 00 00 00 7F CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
Send SMS Ohrana ON:
GSM to Starline: 01010000001101110110111111110011111111110000000000000000000000000000000001011101
0A EC F6 CF FF 00 00 00 00 BA CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
GSM to Starline: 01010000111110000110101011110110111111110000000000000000000000000000000010110111
0A 1F 56 6F FF 00 00 00 00 ED CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
Send SMS Ohrana OFF:
GSM to Starline: 01010000001010100111001011101110111111110000000000000000000000000000000001000100
0A 54 4E 77 FF 00 00 00 00 22 CS is OK!
Starline to GSM: 01010000000001100000000000000000111111110000000000000000000000000000000010010110
0A 60 00 00 FF 00 00 00 00 69 CS is OK!
GSM to Starline: 01010000010100010100001111011111111111110000000000000000000000000000000000001010
0A 8A C2 FB FF 00 00 00 00 50 CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
Ignition ON
Starline to GSM: 01010000000000000000000000010000111111110000000000000000000000000000000010001000
0A 00 00 08 FF 00 00 00 00 11 CS is OK!
Starline to GSM: 01010000000000010000000000010000111111110000000000000000000000000000000010001001
0A 80 00 08 FF 00 00 00 00 91 CS is OK!
Ignition OFF
Starline to GSM: 01010000000000010000000000000000111111110000000000000000000000000000000010010001
0A 80 00 00 FF 00 00 00 00 89 CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
Send SMS request state
GSM to Starline: 01010000101001101111111001100010111111110000000000000000000000000000000011001100
0A 65 7F 46 FF 00 00 00 00 33 CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
GSM to Starline: 01010000010110011100000101011101111111110000000000000000000000000000000000000111
0A 9A 83 BA FF 00 00 00 00 E0 CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
Send SMS request state
GSM to Starline: 01010000101100111110101101110111111111110000000000000000000000000000000011011001
0A CD D7 EE FF 00 00 00 00 9B CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
GSM to Starline: 01010000010000001101100001000100111111110000000000000000000000000000000000010010
0A 02 1B 22 FF 00 00 00 00 48 CS is OK!
Starline to GSM: 01010000000000000000000000000000111111110000000000000000000000000000000010010000
0A 00 00 00 FF 00 00 00 00 09 CS is OK!
продолжаю ипатню. Сделал сброс GSM модуля на заводские. Т.е. теперь он не привязан. Вот лог, сигналка на запросы GSM модуля не отвечает, но тактирование даёт, просто ей не нравятся команды от GSM, что логично. Естественно команды не выполняются. Интересно, что при команде “снятие с охраны”, т.к. не было ответов от сигналки, GSM модуль начал сыпать множеством подряд команд “снять c охраны” . Можно попробовать отследить зависимость динамического изменения, тем более команды не пропатчены байтами привязки.
ну и самое интересное. Провел опять привязку модуля. И в этой процедуре те же самые байты , что и первый раз привязывал. Соответственно там всего два байта 58h 61h. Они в каждом блоке сигналки, видимо уникальные. Это какой-то ключ, который использует GSM модуль - по которому патчит свои динамические команды.
Лог при непривязанном GSM модуле:
Send SMS Ohrana ON:
GSM to Starline: 01010000010000101111111111111111111111110000000000000000000000000000000010010010
0A 42 FF FF FF 00 00 00 00 49 CS is OK!
GSM to Starline: 01010000110100101010010110100101000000000000000000000000000000000000000011111001
0A 4B A5 A5 00 00 00 00 00 9F CS is OK!
Send SMS Ohrana ON:
GSM to Starline: 01010000100110100010011100100111000000000000000000000000000000000000000011010100
0A 59 E4 E4 00 00 00 00 00 2B CS is OK!
GSM to Starline: 01010000011001100001000100010001000000000000000000000000000000000000000000000001
0A 66 88 88 00 00 00 00 00 80 CS is OK!
Send SMS Ohrana ON:
GSM to Starline: 01010000111101100100101101001011000000000000000000000000000000000000000010111000
0A 6F D2 D2 00 00 00 00 00 1D CS is OK!
GSM to Starline: 01010000001111100100100101001001000000000000000000000000000000000000000001010101
0A 7C 92 92 00 00 00 00 00 AA CS is OK!
Send SMS Ohrana OFF:
GSM to Starline: 01010000100100010010110000101100000000000000000000000000000000000000000011011111
0A 89 34 34 00 00 00 00 00 FB CS is OK!
GSM to Starline: 01010000001010011101111011011110000000000000000000000000000000000000000000101001
0A 94 7B 7B 00 00 00 00 00 94 CS is OK!
GSM to Starline: 01010000111110010000111000001100000000000000000000000000000000000000000010010001
0A 9F 70 30 00 00 00 00 00 89 CS is Error!!!
GSM to Starline: 01010000000101011110001011100010000000000000000000000000000000000000000000000010
0A A8 47 47 00 00 00 00 00 40 CS is OK!
GSM to Starline: 01010000010011011011101010111010000000000000000000000000000000000000000001101110
0A B2 5D 5D 00 00 00 00 00 76 CS is OK!
GSM to Starline: 01010000111111010000101000001010000000000000000000000000000000000000000010010110
0A BF 50 50 00 00 00 00 00 69 CS is OK!
GSM to Starline: 01010000110100110010010000100100000000000000000000000000000000000000000010111000
0A CB 24 24 00 00 00 00 00 1D CS is OK!
GSM to Starline: 01010000111010110001110000011100000000000000000000000000000000000000000010001010
0A D7 38 38 00 00 00 00 00 51 CS is OK!
GSM to Starline: 01010000010001111011000010110000000000000000000000000000000000000000000001100000
0A E2 0D 0D 00 00 00 00 00 06 CS is OK!
GSM to Starline: 01010000110101110010000000100000000000000000000000000000000000000000000010111111
0A EB 04 04 00 00 00 00 00 FD CS is OK!
GSM to Starline: 01010000001011111101100011011000000000000000000000000000000000000000000000101100
0A F4 1B 1B 00 00 00 00 00 34 CS is OK!
GSM to Starline: 01010000011111111000100010001000000000000000000000000000000000000000000001010100
0A FE 11 11 00 00 00 00 00 2A CS is OK!
GSM to Starline: 01010000000100001110011111100111000000000000000000000000000000000000000000000111
0A 08 E7 E7 00 00 00 00 00 E0 CS is OK!
GSM to Starline: 01010000111100000000011100000111000000000000000000000000000000000000000010011011
0A 0F E0 E0 00 00 00 00 00 D9 CS is OK!
GSM to Starline: 01010000111010000001111100011111000000000000000000000000000000000000000010001000
0A 17 F8 F8 00 00 00 00 00 11 CS is OK!
GSM to Starline: 01010000000001001111001111110011000000000000000000000000000000000000000000010011
0A 20 CF CF 00 00 00 00 00 C8 CS is OK!
GSM to Starline: 01010000000101001110001111100011000000000000000000000000000000000000000000000011
0A 28 C7 C7 00 00 00 00 00 C0 CS is OK!
GSM to Starline: 01010000000011001111101111111011000000000000000000000000000000000000000000011111
0A 30 DF DF 00 00 00 00 00 F8 CS is OK!
GSM to Starline: 01010000111011000001101100011011000000000000000000000000000000000000000010001111
0A 37 D8 D8 00 00 00 00 00 F1 CS is OK!
GSM to Starline: 01010000100000100111010101110101000000000000000000000000000000000000000011100101
0A 41 AE AE 00 00 00 00 00 A7 CS is OK!
GSM to Starline: 01010000011100101000010110000101000000000000000000000000000000000000000001011001
0A 4E A1 A1 00 00 00 00 00 9A CS is OK!
GSM to Starline: 01010000010110101010110110101101000000000000000000000000000000000000000001110011
0A 5A B5 B5 00 00 00 00 00 CE CS is OK!
GSM to Starline: 01010000000101101110000111100001000000000000000000000000000000000000000000000001
0A 68 87 87 00 00 00 00 00 80 CS is OK!
GSM to Starline: 01010000000011101111100111111001000000000000000000000000000000000000000000011101
0A 70 9F 9F 00 00 00 00 00 B8 CS is OK!
GSM to Starline: 01010000000111101110100111101001000000000000000000000000000000000000000000001101
0A 78 97 97 00 00 00 00 00 B0 CS is OK!
GSM to Starline: 01010000010000011011011010110110000000000000000000000000000000000000000001100110
0A 82 6D 6D 00 00 00 00 00 66 CS is OK!
GSM to Starline: 01010000011100011000011010000110000000000000000000000000000000000000000001011010
0A 8E 61 61 00 00 00 00 00 5A CS is OK!
GSM to Starline: 01010000100110010110111001101110000000000000000000000000000000000000000011110001
0A 99 76 76 00 00 00 00 00 8F CS is OK!
GSM to Starline: 01010000001001011101001011010010000000000000000000000000000000000000000000100010
0A A4 4B 4B 00 00 00 00 00 44 CS is OK!
GSM to Starline: 01010000100011010111101001111010000000000000000000000000000000000000000011101110
0A B1 5E 5E 00 00 00 00 00 77 CS is OK!
GSM to Starline: 01010000101111010100101001001010000000000000000000000000000000000000000011010110
0A BD 52 52 00 00 00 00 00 6B CS is OK!
GSM to Starline: 01010000001100111100010011000100000000000000000000000000000000000000000000111000
0A CC 23 23 00 00 00 00 00 1C CS is OK!
GSM to Starline: 01010000101010110101110001011100000000000000000000000000000000000000000011001010
0A D5 3A 3A 00 00 00 00 00 53 CS is OK!
GSM to Starline: 01010000110001110011000000110000000000000000000000000000000000000000000010100000
0A E3 0C 0C 00 00 00 00 00 05 CS is OK!
GSM to Starline: 01010000001101111100000011000000000000000000000000000000000000000000000000111111
0A EC 03 03 00 00 00 00 00 FC CS is OK!
GSM to Starline: 01010000010011111011100010111000000000000000000000000000000000000000000001101100
0A F2 1D 1D 00 00 00 00 00 36 CS is OK!
GSM to Starline: 01010000001111111100100011001000000000000000000000000000000000000000000000110100
0A FC 13 13 00 00 00 00 00 2C CS is OK!
GSM to Starline: 01010000101000000101011101010111000000000000000000000000000000000000000011000111
0A 05 EA EA 00 00 00 00 00 E3 CS is OK!
GSM to Starline: 01010000100010000111111101111111000000000000000000000000000000000000000011101000
0A 11 FE FE 00 00 00 00 00 17 CS is OK!
GSM to Starline: 01010000010110001010111110101111000000000000000000000000000000000000000001110000
0A 1A F5 F5 00 00 00 00 00 0E CS is OK!
GSM to Starline: 01010000101001000101001101010011000000000000000000000000000000000000000011000011
0A 25 CA CA 00 00 00 00 00 C3 CS is OK!
GSM to Starline: 01010000010011001011101110111011000000000000000000000000000000000000000001101111
0A 32 DD DD 00 00 00 00 00 F6 CS is OK!
GSM to Starline: 01010000101111000100101101001011000000000000000000000000000000000000000011010111
0A 3D D2 D2 00 00 00 00 00 EB CS is OK!
GSM to Starline: 01010000010100101010010110100101000000000000000000000000000000000000000001111001
0A 4A A5 A5 00 00 00 00 00 9E CS is OK!
GSM to Starline: 01010000000110101110110111101101000000000000000000000000000000000000000000001011
0A 58 B7 B7 00 00 00 00 00 D0 CS is OK!
GSM to Starline: 01010000110001100011000100110001000000000000000000000000000000000000000010100001
0A 63 8C 8C 00 00 00 00 00 85 CS is OK!
GSM to Starline: 01010000011101101000000110000001000000000000000000000000000000000000000001011110
0A 6E 81 81 00 00 00 00 00 7A CS is OK!
Starline to GSM: 01001010101000010101011010101010000101010110101010100101010101101010101001010111
запрос состояния
GSM to Starline: 01010000010110001110000111100101000000000000000000000000000000000000000001001110
0A 1A A7 A7 00 00 00 00 00 72 CS is OK!!!
GSM to Starline: 01010000011001000001000100011001000000000000000000000000000000000000000000000110
0A 26 98 98 00 00 00 00 00 60 CS is OK!!!
привязка модуля
Starline to GSM: 11010000000110101000011000000000000000000000000000000000000000000000000000100011
0B 58 61 00 00 00 00 00 00 C4 CS is OK!
у меня есть ещё один блок сигналки, позже посмотрим какие там байты привязки GSM и сниму лог при привязке на новый блок. Может зависимость удастся отследить на логах двух блоков
короче я походу разгадал ребус, это ппц
я еще не проверил теорию разгадки на практике, но должно быть правдой, всё сходится.
в общем очень помог лог, без привязки GSM , (см предыдущий пост).
там когда GSM не получил ответ от сигналки , начал сыпать подряд ещё запросами (в обычном варианте смс-ок столько не на отправляешься). Дак вот байт, идущий после нулевого 0A все время рос от 0 до FF, через похожие , но не всегда через равные промежутки.
А когда просто запросы до этого посылал при привязанном GSM модуле, такой закономерности не было . Сделал предположение, что это эдакий назовем его байт времени, ну то есть по сути рандом.
Далее , если смотреть на лог без привязки . то последующие два байта одинаковые. Ну и по закономерности изменяющегося временного байта, эти два тоже довольно закономерно менялись. Понял , что эти два одинаковых байта это: байт времени XOR байт команды.
Проверив эту теорию на всем логе, везде сошлось, идем дальше. по этому правилу выяснил, что
BD EE - поставить на охрану
BD EF - снять с охраны
BD - запрос состояния.
ну и взял про XORил c FF эти данные, и , в рот мне ноги , получил наши привычные смс команды:
42 11 - поставить на охрану
42 10 - снять с охраны
42 - запрос состояния.
получается при постановке/снятии с охраны, GSM сначала шлет кадр запрос проверки состояния 42 . А потом 11 (поставить на охрану), либо 10 (снять с охраны), смотря какую смс отправили
Но как быть с логом , где GSM привязан ? там все отличается… Но не так уж и сильно. При процедуре привязки имеем два байта 58 61 . Я их взял и тоже проXORил с FF . получил A7 9E. ну и XOR им также как выше , только с байтами ключа.
Короче чтоб получить команду на шине (состоит из трёх байт), которую отправляем в сигналку , оказалось всё не так уж и сложно:
первый байт = рандомный байт (времени)
второй байт = рандомный байт (первый байт) XOR смс команда XOR 1й байт ключа
третий байт = рандомный байт (первый байт) XOR смс команда XOR 2й байт ключа
Вот такие дела. Просто вроде просто , но вот дотункать до всего этого всё же ох как непросто было. Пару дней мозгового штурма, куча проводов, осциллографов и ардуин. 5 одновременно открытых калькуляторов и еще много чего . Осталось дело за малым , написать код который прикинется GSM модулем. Полагаю на практике теория , которую изложил выше, заработает и , думаю, капитуляция очередного протокола не за горами…
Т.е. в непосоленных пакетах два байта одинаковых… Интересно. Это способ валидации такой что ли. При восстановлении по ключу должны и два байта одинаковых восстановиться.
GSM to Starline:
0A 1A 00 39 FF 00 00 00 00 5C CS is OK!
00 xor 58 = 58
39 xor 61 = 58
Т.е. последние байты восстанавливаются по соли gsm.
GSM to Starline:
0A 41 AE AE 00 00 00 00 00 A7 CS is OK!
GSM to Starline:
0A 4E A1 A1 00 00 00 00 00 9A CS is OK!
GSM to Starline:
0A 5A B5 B5 00 00 00 00 00 CE CS is OK!
41 xor AE = EF
4E xor A1 = EF
5A xor B5 = ЕF
41 XOR AE = EF , а EF по XOR FF это и есть 10 - то есть снять с охраны
в непосоленных пакетах, ключ не участвует, т.к. GSM не привязан. У них вроде и такой протокол раньше работал. Потом привязку добавили. после привязки надо эти два байта еще солить xor ключа.
предположим для этой конкретной сигналки хочу я снять с охраны . Это команда 10 . выбираю рандомный байт, например 6E. Теперь надо два после него еще написать проXOReнные командой и байтами ключа
6E xor 10 xor 58 = 26
6E xor 10 xor 61 = 1F
Итоговый кадр должен выглядеть так:
0A 6E 26 1F FF 00 00 00 00 BC
Те пакет: 0A 6E 26 1F FF 00 00 00 00 BC
Байты 2/3 (26 1F) ксорим ключем GSM, получаем NNh NNh. Если байты равны, то любой из них ксорим байтом 1 (6E), получаем код команды. Так выходит?
Я вот код команды не знал, поэтому так и не понял что куда в итоге приложить нужно.
да, так. Я тоже не знал что они тупо с смс ок команды сюда впихают. Дошел до EF , а когда проXOR ил понял что это команда из смс и сразу полегчало))
11 - поставить на охрану, 10 снять с охраны , 42 проверка состояния.
перед постановкой снятием с охраны GSM сначала всегда сам шлет 42 проверку состояния.
0A 6E 26 1F FF 00 00 00 00 BC
Если обратно инженерить это сообщение (узнать что за команда) нужно:
26 xor 58 (1й байт ключа) xor 6E = 10
или 1F xor 61 (2й байт ключа) xor 6E = тоже 10 , это и есть команда (в данном случае снять с охраны).
Ну, тут уже простая байтовая эквилибристика осталась. Удачи.
Спасибо
Полезно будет ключ ещё восстановить с перехвата команды для известного действия:
Байт 1: 26 xor 10 xor 6E = 58
Байт 2: 1F xor 10 xor 6Е = 61
В общем да, но Байты ключа в явном виде можно увидеть, сделав ппрцедуру привязки. (семь раз нажать сервисную кнопку сигнализации и включить зажигание
А если уже привязано, то зачем, если подслушать можно и на автомате вычислить? Там периодических пингов нет, чтобы вообще сделать “подключил сниффер, чай попил, ключ получил”?
Просто как бы целесообразность этого действа не очень понятна. Если мы всем этим занялись. Цель то создать свой Gsm модуль. Поэтому и сниффить будет нечего. В сигналке модуля не будет… Мы свой сделали, вставили, привязали. Судя по протоколу привязывается, наоборот, блок сигналки к GSM модулю. Т. К. В его еепроме сохраняется ключ
То есть самопальный модуль будет свой ключ предъявлять при связывании? Тогда ок, вопросов нет.
Не совсем так. Правильнее сказать - ключ хранится в блоке сигналки, для каждого блока сигналки он уникален. Самопальный gsm модуль его будет запоминать при связывании, и далее использовать при отправке команд на сигнализацию.
Сходу что-то не получается написать рабочий скетч для отправки команд на сигналку. Часть скетча, которая занимается приемом данных от сигналки, работает очень стабильно, а вот отправка что-то пока никак. На работу приеду, осциллом проверю что там реально происходит на шине.
скетч такой
#define RX 3
#define TX 2
volatile bool dataRX[80] = {0}; // буфер приема данных от сигналки
enum states {WAIT, CLOCK}; // статусы приемника
volatile byte state = WAIT ; // переменная статуса приемника
volatile byte stateTX = 0 ; // статус передатчика
volatile bool printFlag = 0; // флаг распечатки приемного буфера в отладку
enum comastates {NUL, OHR_ON, OHR_OFF};
volatile byte comastat = 0;
byte SL_key[2]={0x58, 0x61}; // байты ключа сигнализации
volatile byte dataTX[10]= {0}; // буфер передачи данных на сигналку (пакет байт команды)
void setup() {
pinMode (TX, OUTPUT); // линию TX на выход
digitalWrite (TX, 1); // и ставим в busIdle
pinMode (RX, INPUT_PULLUP); // линию RX на вход с подтяжкой
Serial.begin(250000);
//---------настройка таймера1 для выполнения нами тактирования передачи от сигналки (время бита 100мкс).
TCCR1A = 0 ;
TCCR1B = 0;
OCR1A = 198; // установка регистра совпадения (100 мкс для прескалера 8)
TIMSK1 |= (1 << OCIE1A); // разрешить прерывание по таймеру по сравнению A
//TCCR1B = 10; // включ таймер раз в 100мкс
//---------
}
void loop() {
if (Serial.available()){
Serial.println();
byte inbyte = Serial.read();
if (inbyte == 'z') {Serial.println (F(" Send SMS Zapros Sostoyanya: ")); Send_To_Starline (0x42);}
else if (inbyte == '1') {Serial.println (F(" Send SMS Ohrana ON: ")); Send_To_Starline (0x42); comastat = OHR_ON; }
else if (inbyte == '0') {Serial.println (F(" Send SMS Ohrana OFF: ")); Send_To_Starline (0x42); comastat = OHR_OFF;}
}
if (printFlag){
byte B[3] = {0};
Serial.print ("Starline: ");
Serial.println();
byte CS = 0 ;
for (int i=0; i<10; i++) {
byte A= 0;
for (int b = 0 ; b<8; b++){bitWrite(A, b, dataRX[(8*i)+b]);}
if (i<9)CS+=A;
if (A<=0xF)Serial.print("0"); Serial.print(A, HEX); Serial.print(" ");
if (i==9) {Serial.print(" CS is "); if (CS==A) {
Serial.print("OK!");
if (comastat ==OHR_ON) {comastat =0; Send_To_Starline (0x11);}
else if (comastat ==OHR_OFF){comastat =0; Send_To_Starline (0x10);}
}
else Serial.print("Error!!!"); }
}
printFlag = 0 ; Serial.println();
}
bool curRX = digitalRead(RX);
static bool lastRX = curRX;
if (state == WAIT && lastRX != curRX) // если состояние пина RX изменилось
{
if (lastRX && !curRX){ // если на пине RX спад
state = CLOCK;
delayMicroseconds (100);
if (bool((1 << 3) & PIND)) return; // если было ложное срабатывание пина, выходим.
digitalWrite (TX,0);
delayMicroseconds (45);
TCCR1B = 10; // включаем тактирование для оппонента.
}
lastRX = curRX;
}
}
ISR(TIMER1_COMPA_vect) // обработчик вылазит раз в 100мкс, тактируем для сигналки
{
static byte bitNumber = 0 ;
bitNumber++;
if (bitNumber > 1) {dataRX[bitNumber-2]= bool((1 << 3) & PIND);} // читаем очередной бит (начиная со второго прерывания)
if (bitNumber==81) {bitNumber=0; state = WAIT; printFlag = 0; TCCR1B = 0;}
PORTD ^= (1 << 2); // тактируем, изменив состояние пина TX на противоположное
}
void Send_To_Starline(byte SLcommand){
dataTX[0]=0x0A;
dataTX[1]=millis();
dataTX[2]=(dataTX[1]^SLcommand)^SL_key[0];
dataTX[3]=(dataTX[1]^SLcommand)^SL_key[1];
dataTX[4]=0xFF;
byte CS = 0 ;
for (byte i=0; i<5;i++) {CS+=dataTX[i];}
dataTX[9]=CS;
Serial.println(); Serial.print (" Send to Starline:");
for (byte i=0; i<10;i++) {if (dataTX[i]<=0xF)Serial.print("0"); Serial.print(dataTX[i], HEX); Serial.print(" ");}
Serial.println();
PORTD &=~(1 << 2); // садим в 0 линию передачи , инициируя желание передавать данные
stateTX = 1;
attachInterrupt(1, RX_CLOCK, FALLING); // и ждем тактирования от сигналки (принимать тактирование будет внеш прерывание)
}
void RX_CLOCK () { // обработчик внешнего прерывания, выступает как приёмник тактирования от сигналки для выполнения нашей ей передачки.
if (stateTX==1){stateTX=2; detachInterrupt(1); attachInterrupt(1, RX_CLOCK, CHANGE);return;} // выполняется только когда FALLING
static byte bitNumberTX = 0 ;
static byte byteNumberTX = 0 ;
//--------------ниже передача команды на шину по тактированию от сигналки-----------
if (bool((1 << (bitNumberTX)) & dataTX[byteNumberTX])) {PORTD |=(1 << 2);} // читаем очередной бит из команды
else {PORTD &=~(1 << 2); } // и выставляем его на пине TX
//----------------------------------------------------------------------------------
if (byteNumberTX==9 && bitNumberTX == 7) // если все 80 бит переданы, выходим , сбросив переменные и откл внеш прерывание
{
stateTX=0;
detachInterrupt(1);
bitNumberTX=0; byteNumberTX=0;
return;
}
bitNumberTX++; if (bitNumberTX == 8) {bitNumberTX = 0 ;byteNumberTX++;}
}
Дождись анализатора - он точнее измерит тактование.
ты имеешь ввиду может время бита при тактировании не нравится сигналке ? если да, то, думаю, вряд ли в этом дело. Ведь тактирование для этого и нужно , чтоб допуск точности временных интервалов расширить.