Авторский Запускаем GSM-сеть у себя дома

AMRakm

Интересующийся
Интересующийся
AMRakm

AMRakm

Интересующийся
Интересующийся
Сообщения
52
Реакции
21
Инструкции на официальном сайте Osmocom давно устарели и мне пришлось потратить довольно много времени на их адаптацию. К счастью, все проблемы были решены и если вы будете строго следовать советам ниже, то и у вас все получится.

В результате мы запустим экспериментальную 2G сотовую сеть в пределах комнаты с поддержкой СМС и голосовых вызовов, без GPRS. Ее можно будет использовать для изучения работы и взаимодействия устройств и компонентов GSM сети, не вмешиваясь в коммерческие сотовые сети.

Внимание: Если вы сталкиваетесь с проблемами при сборке или при использовании наших конфигурационных файлов, то рекомендуем установить все, что можно из deb-пакетов Nightly Builds на более новую ОС. Для сборки osmocombb (ветки jolly/testing) ветки вам понадобится старый toolchain, о чем мы писали ниже по тексту. Мы устанавливали все на Debian 9 (32 бита), нет проблем с libdbi и чем-то еще, ставите те зависимости, которые предлагает apt. При сборке toolchain-а могут возникнуть проблемы с texinfo. В скрипте axilirator уже есть пара патчей для этого, но для Debian 9 нам потребовались еще правки в gcc/doc/gcc.texi.

Железо и Софт

Железо

  • Компьютер с установленной 32-битной Ubuntu 14.04 (Не виртуалка)
  • 2 телефона на чипсете TI Calypso (Motorola c113, c118, c123, ...)
  • 2 USB-TTL конвертера
  • 2 провода (джек 2.5 мм + джемперы)
Софт

  • Трансиверы на основе OsmocomBB
  • Базовая станция на основе OsmoBTS
  • Контроллер базовых станций на основе OsmoBSC
  • MSC,HLR, СМС-центр на основе OsmoNTIB


Закупаемся

Телефоны на чипсете TI Calypso проще всего будет поискать на сайтах бесплатных объявлений в Вашем городе. Цена варьируется от 300 до 700 рублей, в зависимости от состояния и наличия зарядного устройства. Вероятность купить в России телефон, предназначенный для западных GSM диапазонов очень мала, но если вы решите покупать его за границей, то рекомендую обратить внимание на рабочие GSM диапазоны. Вам нужны телефоны, работающие с 900 Мгц и 1800 Мгц, если Вы проживаете в России.

Возможно есть и другие совместимые телефоны, в частности, Motorola c113 и c113a полностью совместимы с OsmocomBB, хоть и не представлены на официальном сайте.

SIM-карты не нужны.



USB-TTL конвертеры могут работать на чипах CP2102, FT232 или PL2303.

Мы рекомендуем использовать CP2102
так как при помощи специализированной утилиты можно заставить работать этот конвертер на нестандартных скоростях, что требуется для некоторых веток OsmocomBB.

Приобрести его можно от 100 рублей на ebay или aliexpress, либо в 2-3 раза дороже в более-менее крупных магазинах радиоэлектроники. Второй вариант предпочтительнее, если Вы не хотите ждать.Провод, соединяющий компьютер с телефоном может выглядеть по-разному, но мы рекомендуем купить 2.5 мм джек в магазине радиодеталей




и провода с коннекторами, вроде тех, что часто используют для Arduino или Raspberry Pi.


При отсутствии вторых, можно придумать что-то свое.
Ваша задача соединить выводы Tx, Rx, GND конвертера с контактами джека следующим образом:

  • TxD подключить к наконечнику джека
  • RxD подключить к среднему контакту джека
  • GND подключить к нижнему контакту джека.
Можно взять связку из трех проводов, откусить коннекторы с одного конца и припаять оставшиеся провода с коннекторами на одном конце к выводам джека.

Обратите внимание, что для запуска сети с поддержкой голосовых вызовов вам потребуется 2 телефона, 2 конвертера и 2 готовых провода.

Неочевидная проблема
После покупки джека убедитесь, что он может быть вставлен в гнездо гарнитуры до конца. В противном случае вы можете получить ошибки из-за ненадежного соединения с телефоном или вовсе его не иметь.

Джеки, которые чаще всего продаются в магазинах радиодеталей не вставляются в гнездо до конца, т.к. им мешает корпус (свой/телефона).


Чтобы убедиться, что джек входит до конца, можно достать телефон из корпуса и попробовать вставить джек.


Если Вы поздно поняли, что корпус мешает джеку, то придется вооружиться пассатижами и напильником, включить смекалку и изменить корпус джека или телефона так, чтобы контакт был надежным.

Вы можете проверить надежность соединения при помощи PuTTY. Узнать номер COM порта можно заглянув в Диспетчер устройств.


Подключаем телефон к компьютеру через USB-TTL конвертер и собранный провод, коротко нажимаем на кнопку включения и в окне PuTTY должно появиться сообщение @ftmtoolerror среди прочих символов.

То же самое можно сделать под Linux при помощи minicom.



Установка
Как и сказано в начале, мы рекомендуем использовать Ubuntu 14.04, именно 32-битную ее версию. Возможно у Вас получится все установить и на 64-битную Ubuntu 16.04, но тогда Вам придется самостоятельно решать все проблемы с зависимостями при установке и совместимостью с ветками проектов Osmocom.

Также, Вы можете попытаться использовать виртуальную машину, но нам так и не удалось получить устойчивую связь на гостевой ОС. Возможно, проблемы возникают на уровне виртуализации USB порта.

Вы можете использовать виртуальную машину для работы с osmocombb и его отдельными приложениями, но если дело касается запуска GSM сети, мы советуем не использовать виртуализацию.

Установим базовые пакеты, которые нам потребуются для сборки Osmocom.

apt-get install build-essential libtool libtalloc-dev shtool autoconf automake git-core pkg-config make gcc libpcsclite-dev

Устанавливаем библиотеку libosmocore

git clone git://git.osmocom.org/libosmocore.git
cd libosmocore/
autoreconf -i
./configure
make
make install
ldconfig -i

Устанавливаем toolchain

Для сборки программ для телефона нам потребуется кросс-компилятор toolchain. На официальном сайте сейчас представлена более новая версия, но с ней не будут работать старые ветки osmocombb, которые писались под старый компилятор.

Конечно, можно слегка поправить код и исправить ошибки, возникающие при компиляции новым toolchain, но мы оставляем это за рамками данной статьи и рекомендуем воспользоваться следующим скриптом для установки кросс-компилятора.

git clone
cd gnu-arm-installer
apt-get install libgmp3-dev libmpfr-dev libx11-6 libx11-dev flex bison libncurses5 libncurses5-dbg libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev zlibc zlib1g-dev libmpfr4 libmpc-dev texinfo
./download.sh
./build.sh

Процесс может занимать продолжительное время, вплоть до нескольких часов. Будьте терпеливы и убедитесь что на файловой системе свободно как минимум 3 Гб.

После завершения компиляции добавьте путь к исполняемым файлам в PATH, в нашем случае /root/osmocom/gnu-arm-installer/install/bin

vi /etc/bash.bashrc
add in the end
export PATH=$PATH:/root/osmocom/gnu-arm-installer/install/bin


Собираем osmocombb


Master-ветка не участвует в запуске GSM сети, но она будет полезна, если вы захотите поработать с другими приложениями, такими как RSSI или cell_log (см. дальше по тексту).

Если Вы хотите иметь возможность что-либо отправлять в сеть, нужно раскомментировать в src/target/firmware/Makefile строку:

CFLAGS += -DCONFIG_TX_ENABLE

Собираем

git clone git://git.osmocom.org/osmocom-bb.git osmocombb
cd osmocombb/src
make

Устанавливаем пакет FFT

wget
tar -xvzf fftw-3.3.6-pl2.tar.gz
cd fftw-3.3.6-pl2
./configure --enable-threads --enable-float
make
make install
ldconfig

Устанавливаем библиотеку libosmo-dsp

git clone git://git.osmocom.org/libosmo-dsp.git
cd libosmo-dsp/
autoreconf -i
./configure
make
make install
ldconfig

Собираем ветку osmocombb для OsmoBTS

git clone git://git.osmocom.org/osmocom-bb.git trx
cd trx/
git checkout jolly/testing
cd src/

Нужно раскомментировать в target/firmware/Makefile строку

CFLAGS += -DCONFIG_TX_ENABLE

Компилируем:

make HOST_layer23_CONFARGS=--enable-transceiver

Устанавливаем libdbi для sqlite

apt-get install sqlite3 libsqlite3-dev libsctp-dev

Скачиваем: sourceforge.net/projects/libdbi/files/libdbi/libdbi-0.8.3

tar -xvzf libdbi-0.8.3.tar.gz
cd libdbi-0.8.3
autogen.sh
./configure --disable-docs
make
make install
ldconfig
cd ..

Скачиваем: sourceforge.net/projects/libdbi-drivers/files/libdbi-drivers/libdbi-drivers-0.8.3

tar -xvzf libdbi-drivers-0.8.3.tar.gz
cd libdbi-drivers-0.8.3

В драйвере есть опечатка, которая приведет к ошибкам во время подключения к HLR. Исправляем перед компиляцией.

vi drivers/sqlite3/dbd_sqlite3.c

Меняем _dbi_internal_error_handler на _dbd_internal_error_handler.

Собираем:

./autogen.sh
./configure --disable-docs --with-sqlite3 --with-sqlite3-dir=/usr/bin --with-dbi-incdir=/usr/local/include
make
make install
ldconfig

Устанавливаем ORTP

wget
tar -xvf ortp-0.22.0.tar.gz
cd ortp-0.22.0/
./autogen.sh
./configure
make
make install
ldconfig

Устанавливаем библиотеку libosmo-abis

git clone git://git.osmocom.org/libosmo-abis.git
cd libosmo-abis
autoreconf -i
./configure
make
make install
ldconfig

Устанавливаем библиотеку libosmo-netif

git clone git://git.osmocom.org/libosmo-netif.git
cd libosmo-netif
autoreconf -i
./configure
make
make install
ldconfig

Устанавливаем OpenBSC

apt-get install libssl0.9.8 libssl-dev
ldconfig
git clone git://git.osmocom.org/openbsc.git
cd openbsc/openbsc/
autoreconf -i
./configure
make
make install

Устанавливаем OsmoBTS

git clone git://git.osmocom.org/osmo-bts.git
cd osmo-bts
autoreconf -i
./configure --enable-trx
make
make install

Конфигурация

Мы работаем с Osmocom из под root, поэтому наши файлы конфигурации находятся в /root/.osmocom

mkdir /root/.osmocom;cd /root/.osmocom
touch ~/.osmocom/osmo-bts.cfg
touch ~/.osmocom/open-bsc.cfg

Далее есть два варианта:

  • Скачать мануалы по OsmoNTIB и настроить все самостоятельно
  • Вместо пустых файлов использовать мои, модифицировав под свои нужды.
Наши конфигурационные файлы osmo-bts.cfg и open-bsc.cfg находятся в конце статьи.

Мы намеренно убрали из файлов настройку (band) для GSM диапазона и ARFCN.

ARFCN — радио канал на котором будет работать ваша базовая станция.

Подходящий ARFCN можно найти при помощи программы RSSI, пакета osmocombb, либо при помощи инструмента cell_log.

Без внесения ARFCN и band в наши конфигурационные файлы, OsmoNTIB не запустится.



Запуск
Подключаем оба телефона к компьютеру и проверяем их доступность.

ls -l /dev/ttyUSB*

Вы должны увидеть ttyUSB0 и ttyUSB1.

Далее каждую команду нужно выполнять в отдельном терминале.

В синтаксисе osmocon у вас могут быть отличия. Например в вашем случае может быть compal_e86 или e87 и не c123xor, а что-то другое.

Инициализируем первый трансивер

cd /root/osmocom/trx/src
host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 -s /tmp/osmocom_l2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99

Коротко нажимаем на кнопку включения телефона, который был подключен первым. После окончания загрузки на экране телефона Вы увидите надпись TRX.

Инициализируем второй трансивер

cd /root/osmocom/trx/src
host/osmocon/osmocon -m c123xor -p /dev/ttyUSB1 -s /tmp/osmocom_l2.2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99

Коротко нажимаем на кнопку включения телефона, который был подключен вторым. После окончания загрузки на экране телефона Вы увидите надпись TRX.

Настраиваем трансиверы на следование таймеру коммерческой BTS

Вместо ARFCN вы должны указать номер канала, на котором работает коммерческая базовая станция с хорошим сигналом. Опять же, может быть найдена при помощи RSSI или cell_log.

cd /root/osmocom/trx/src/host/layer23/src/transceiver/
./transceiver -a ARFCN -2 -r 99

Запускаем MSC, HLR и СМС-центр

cd /root/.osmocom
osmo-nitb -c ~/.osmocom/open-bsc.cfg -l ~/.osmocom/hlr.sqlite3 -P -C --debug=DRLL:DCC:DMM:DRR:DRSL:DNM

Запускаем базовую станцию

cd /root/.osmocom
osmo-bts-trx --debug DRSL:DOML:DLAPDM -r 99

Все компоненты GSM сети теперь должны быть в рабочем состоянии и Вы готовы стать первым абонентом!



Тестирование
Теперь Вы можете подключиться к сети с любого сотового телефона, выбрав ее в ручном режиме. Сеть отобразится как 00101 или TestNet. Сеть может находиться не с первого раза.

Если во время подключения что-то пошло не так, включите авиа режим, выключите и попробуйте еще раз подключиться к сети.

После подключения узнать свой номер можно при помощи USSD кода *#100#.

Подключиться к консоли OsmoNTIB можно так

telnet localhost 4242

Подключиться к консоли OsmoBTS можно так

telnet localhost 4241

На этом все. В следующей статье я расскажу, как можно исследовать трафик мобильных устройств при помощи сниффера wireshark.

UPD: Про добавление поддержки GPRS читайте тут

Успехов!



Конфигурационные файлы
osmo-bts.cfg

!

! OsmoBTS (0.4.0.433-8913) configuration saved from vty

!!!

!

log stderr

logging filter all 1

logging color 1

logging print category 0

logging timestamp 0

logging level all everything

logging level rsl info

logging level oml info

logging level rll notice

logging level rr notice

logging level meas notice

logging level pag info

logging level l1c info

logging level l1p info

logging level dsp debug

logging level pcu notice

logging level ho notice

logging level trx notice

logging level loop notice

logging level abis notice

logging level rtp notice

logging level sum notice

logging level lglobal notice

logging level llapd notice

logging level linp notice

logging level lmux notice

logging level lmi notice

logging level lmib notice

logging level lsms notice

logging level lctrl notice

logging level lgtp notice

logging level lstats notice

logging level lgsup notice

logging level loap notice

logging level lss7 notice

logging level lsccp notice

logging level lsua notice

logging level lm3ua notice

log file OsmoBTS.log

logging filter all 0

logging color 1

logging print category 0

logging timestamp 1

logging level all everything

logging level rsl info

logging level oml info

logging level rll notice

logging level rr notice

logging level meas notice

logging level pag info

logging level l1c info

logging level l1p info

logging level dsp debug

logging level pcu notice

logging level ho notice

logging level trx notice

logging level loop notice

logging level abis notice

logging level rtp notice

logging level sum notice

logging level lglobal notice

logging level llapd notice

logging level linp notice

logging level lmux notice

logging level lmi notice

logging level lmib notice

logging level lsms notice

logging level lctrl notice

logging level lgtp notice

logging level lstats notice

logging level lgsup notice

logging level loap notice

logging level lss7 notice

logging level lsccp notice

logging level lsua notice

logging level lm3ua notice

!

line vty

no login

!

e1_input

e1_line 0 driver ipa

e1_line 0 port 0

no e1_line 0 keepalive

phy 0

osmotrx ip 127.0.0.1

osmotrx fn-advance 30

osmotrx rts-advance 5

instance 0

bts 0

band [ЗАДАТЬ GSM900 ИЛИ DCS1800]

ipa unit-id 1801 0

oml remote-ip 127.0.0.1

rtp jitter-buffer 0

paging queue-size 200

paging lifetime 0

uplink-power-target -75

min-qual-rach 50

min-qual-norm -5

ms-power-loop -65

timing-advance-loop

setbsic

trx 0

power-ramp max-initial 0 mdBm

power-ramp step-size 2000 mdB

power-ramp step-interval 1

ms-power-control dsp

phy 0 instance 0

open-bsc.cfg

!

! OpenBSC (0.15.0.763-5121) configuration saved from vty

!!!

!

log stderr

logging filter all 1

logging color 1

logging print category 0

logging timestamp 0

logging level all everything

logging level rll everything

logging level cc everything

logging level mm everything

logging level rr everything

logging level rsl everything

logging level nm everything

logging level mncc notice

logging level pag notice

logging level meas notice

logging level sccp notice

logging level msc notice

logging level mgcp notice

logging level ho notice

logging level db notice

logging level ref notice

logging level gprs debug

logging level ns info

logging level bssgp debug

logging level llc debug

logging level sndcp debug

logging level nat notice

logging level ctrl notice

logging level smpp debug

logging level filter debug

logging level ranap debug

logging level sua debug

logging level lglobal notice

logging level llapd notice

logging level linp notice

logging level lmux notice

logging level lmi notice

logging level lmib notice

logging level lsms notice

logging level lctrl notice

logging level lgtp notice

logging level lstats notice

logging level lgsup notice

logging level loap notice

logging level lss7 notice

logging level lsccp notice

logging level lsua notice

logging level lm3ua notice

log file OsmoBSC.log

logging filter all 0

logging color 1

logging print category 0

logging timestamp 1

logging level all info

logging level rll notice

logging level cc notice

logging level mm notice

logging level rr notice

logging level rsl notice

logging level nm info

logging level mncc notice

logging level pag notice

logging level meas notice

logging level sccp notice

logging level msc notice

logging level mgcp notice

logging level ho notice

logging level db notice

logging level ref notice

logging level gprs debug

logging level ns info

logging level bssgp debug

logging level llc debug

logging level sndcp debug

logging level nat notice

logging level ctrl notice

logging level smpp debug

logging level filter debug

logging level ranap debug

logging level sua debug

logging level lglobal notice

logging level llapd notice

logging level linp notice

logging level lmux notice

logging level lmi notice

logging level lmib notice

logging level lsms notice

logging level lctrl notice

logging level lgtp notice

logging level lstats notice

logging level lgsup notice

logging level loap notice

logging level lss7 notice

logging level lsccp notice

logging level lsua notice

logging level lm3ua notice

!

stats interval 5

!

line vty

no login

!

e1_input

e1_line 0 driver ipa

e1_line 0 port 0

no e1_line 0 keepalive

network

network country code 1

mobile network code 1

short name TestNet

long name TestNet

auth policy accept-all

authorized-regexp .*

location updating reject cause 13

encryption a5 0

neci 1

paging any use tch 0

rrlp mode none

mm info 1

handover 0

handover window rxlev averaging 10

handover window rxqual averaging 1

handover window rxlev neighbor averaging 10

handover power budget interval 6

handover power budget hysteresis 3

handover maximum distance 9999

timer t3101 10

timer t3103 0

timer t3105 40

timer t3107 0

timer t3109 0

timer t3111 0

timer t3113 60

timer t3115 0

timer t3117 0

timer t3119 0

timer t3122 10

timer t3141 0

dyn_ts_allow_tch_f 0

subscriber-keep-in-ram 0

bts 0

type sysmobts

description calypso

band DCS1800

cell_identity 0

location_area_code 1

base_station_id_code 63

ms max power 30

cell reselection hysteresis 4

rxlev access min 0

periodic location update 30

radio-link-timeout 32

channel allocator ascending

rach tx integer 9

rach max transmission 7

channel-descrption attach 1

channel-descrption bs-pa-mfrms 5

channel-descrption bs-ag-blks-res 1

early-classmark-sending forbidden

ip.access unit_id 1801 0

oml ip.access stream_id 255 line 0

neighbor-list mode automatic

codec-support fr amr

amr tch-h modes 0

amr tch-h start-mode 1

gprs mode none

no force-combined-si

trx 0

rf_locked 0

arfcn [ЗАДАТЬ]

nominal power 23

max_power_red 0

rsl e1 tei 0

timeslot 0

phys_chan_config CCCH+SDCCH4

hopping enabled 0

timeslot 1

phys_chan_config TCH/H

hopping enabled 0

timeslot 2

phys_chan_config TCH/H

hopping enabled 0

timeslot 3

phys_chan_config TCH/H

hopping enabled 0

timeslot 4

phys_chan_config TCH/H

hopping enabled 0

timeslot 5

phys_chan_config TCH/H

hopping enabled 0

timeslot 6

phys_chan_config TCH/H

hopping enabled 0

timeslot 7

phys_chan_config TCH/H

hopping enabled 0

mncc-int

default-codec tch-f amr

default-codec tch-h amr

nitb

subscriber-create-on-demand

assign-tmsi


Спасибо за внимание!
 

Сверху Снизу