Создание 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 предоставляют какой-то переключатель / флаг для этого.

Другие вопросы по тегам