Создание UDH для 7-битных каскадных SMS
Мне нужно отправить составное SMS, для которого я разделил сообщение (которое составляет более 160 байт) на маленькие части, теперь я хочу поместить один заголовок в каждую часть. Заголовок имеет 6 октетов следующим образом
Поле 1 (1 октет): длина заголовка пользовательских данных, в данном случае 05. Поле 2 (1 октет): идентификатор информационного элемента, равный 00 (сцепленные короткие сообщения, 8-битный ссылочный номер) Поле 3 (1 октет): Длина заголовка, исключая первые два поля; равно 03 Поле 4 (1 октет): 00-FF, ссылочный номер CSMS, должно быть одинаковым для всех частей SMS в поле CSMS 5 (1 октет): 00-FF, общее количество частей. Поле 6 (1 октет): 00-FF, номер этой части в последовательности.
Пример: 05 00 03 CC 02 01 [сообщение] 05 00 03 CC 02 02 [сообщение]
Теперь проблема состоит в том, что я хочу поместить эти 6 октетов в 7 септетов, которые должны уменьшить размер SMS-сообщения с 160 до 153 символов. Как преобразовать эти 6 октетов в 7 септетов.
1 ответ
Это действительно не так сложно.
Разница между 7-битным и 8-битным числом состоит в том, что у 7-битного номера отсутствует верхний бит.
Учитывая, что вы имеете дело непосредственно с байтами, я собираюсь предположить, что вы делаете это непосредственно в режиме PDU, особенно если вы, похоже, знаете, какова ваша байтовая схема.
чтобы преобразовать ваши 8-битные байты в 7-битные, вам просто нужно избавиться от старшего бита EG:
если у вас есть
05 00 03 CC
тогда в 8 бит у вас есть
00000101 00000000 00000011 11001100
технически, чтобы обрезать их до 7 бит, это просто вопрос удаления верхнего бита следующим образом
0000101 0000000 0000011 1001100
Тем не менее, у вас будет проблема с вашими значениями выше, и это с вашим
CC
Значение. Если вы уберете верхний бит из этого, вы фактически измените его на значение
4C
что может привести к тому, что ваша система SMS будет неправильно интерпретировать детали
По этой причине в большинстве случаев при работе с двоичным файлом вы используете 8-битную передачу, так что вы сохраняете значения.
Тем не менее, продолжая работу с примером, если вы захотите попробовать его, следующим шагом будет объединение 7-битных значений следующим образом
0000101000000000000111001100
Затем вам нужно разделить это на 8 (среда передачи по-прежнему 8 бит, даже если кодирование не)
00001010 00000000 00011100 1100
Затем добавьте последний байт к 8 битам, чтобы передача была четным числом
00001010 00000000 00011100 1100xxxx
Xxxx будет либо всеми 1, либо всеми 0 в зависимости от того, что вы используете для отправки байтов, если это AT-команда, то, скорее всего, это будут все 0, поэтому ваша 7-битная кодировка в конечном итоге будет
0A 00 1C C0
Который, как вы можете видеть, не сохранил ни одного байта.
7-битное кодирование работает надежно только в том случае, если вы используете алфавит GSM (вы получаете это, устанавливая правильные значения DCS), то как вы установите его снова, зависит от того, что вы используете для отправки SMS в первую очередь.
Например, большинство провайдеров HTTP предоставляют какой-то переключатель / флаг для этого.