Skip to content

Instantly share code, notes, and snippets.

@osipxd
Last active January 24, 2024 04:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save osipxd/45630ac85ddffdd10b70acd603f8e5c4 to your computer and use it in GitHub Desktop.
Save osipxd/45630ac85ddffdd10b70acd603f8e5c4 to your computer and use it in GitHub Desktop.
Редактирование номера телефона SIM-карты на Android

Что нужно?

  • Root
  • ADB (или любое приложение Terminal на телефоне)

Шаги

Подключение

Подключитесь к телефону через ADB и в открывшейся консоли переключитесь в режим Super User:

$ adb shell
$ su

Теперь мы можем общаться с модемом телефона, используя AT команды. Но сначала нужно понять в какое устройство эти команды отправлять. Тут в зависимости от модема могут быть разные варианты: /dev/smd[0,7] (Qualcomm) или /dev/radio/atci[0-9] (MTK) Проверить можно командой ls:

# ls -la /dev/smd* || ls -la /dev/radio/atci*

crw-rw---- 1 radio     radio     244,   7 1972-12-20 09:23 /dev/smd11
crw-rw---- 1 bluetooth bluetooth 244,   5 1972-12-20 09:23 /dev/smd7
crw------- 1 root      root      244,   6 1972-12-20 09:23 /dev/smd8
crw-r----- 1 radio     radio     244,   4 1972-12-20 09:23 /dev/smdcntl8

Тут ещё нужно разобраться. В разных источниках видел, что обычно посылают команды в smd0 или smd7, но в моём случае владелец radio только у устройства /dev/smd11. Команды отправлять и принимать удаётся, врочем как и в smd7 у которого владелец bluetooth. Если кто-то объяснит почему так, буду признателен.

Я в примерах дальше буду использовать smd11, не забудьте исправить на свой.

Отправлять команды модему можно через echo, а слушать ответ через cat. Чтобы проверить что вы нашли правильный девайс выполните команды:

# cat /dev/smd11 &
# echo -e "AT\r" > /dev/smd11

OK

Если в ответ не вывелось никакое сообщение, проверьте, что не забыли символ перевода каретки (\r) в конце команды. Если видите OK, значит девайс может принимать AT команды.

Каждый раз писать конструкцию с echo не хочется, поэтому напишем однострочную функцию для отправки AT команд:

# function AT() { echo -e "AT$*\r" > /dev/sdm11; }
# AT

OK

Вместо $* в эту функцию будут подставляться все аргументы, которые мы передадим при вызове

Меняем номер

Теперь когда мы мониторим вывод через cat и можем посылать команды через AT, можем приступать к изменению номера. Нам понадобятся следующие команды:

  • AT+CPBS (PhoneBook Storage) - Для выбора области телефонной книги SIM-карты в которую хотим внести изменения
  • AT+CPBW (PhoneBook Write) - Для записи номера в SIM-карту
  • AT+CNUM - Для проверки, что номер привязан к SIM-карте

Общий для AT команд синтаксис который нужно знать. Если после команды добавить ?, будет выведено текущее значение или ERROR, если команда не поддерживает вывод значения. Если добавить =? будет выведена справка по параметрам, которые принимает команда. Чтобы выполнить каманду с параметрами, нужно добавить = и перечислить параметры через запятую ,.

  1. Нас интересует область телефонной книги ON (Own Numbers), проверим можно ли выбрать эту область:
# AT +CPBS=?
+CPBS: ("SM","DC","MC","ME","RC","EN")

OK

В моём случае выбрать ON оказалось нельзя. Нагуглил, что нужно выставить свойство AT$QCPBMPREF в значение 1, чтобы сделать область ON доступной:

# AT '$QCPBMPREF=1'
OK

# AT +CPBS=?
+CPBS: ("DC","FD","MC","ME","RC","EN","ON")

OK

# AT '+CPBS="ON"'
OK

# AT +CPBS?
+CPBS: "ON",0,2

OK

Обязательно нужно либо заключать команду в одинарные кавычки, либо экранировать символы " и $ через слеш \, иначе они не долетят.

Из вывода команды +CPBS? видно, что сейчас выбрана область телефонной книги ON и в ней лежат 0 из 2-х возможных номеров. Запишем номер:

# AT '+CPBW=1,"+79991234567"'
OK

# AT +CNUM
+CNUM: ,"+79991234567",145

OK

Теперь нужно обязательно перезагрузить телефон и номер отобразится в настройках в секции "О телефоне".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment