Вопрос: Добрый день. Пару дней назад я купил сим-карту оператора, который поддерживает 3G, т.к. мне нужен быстрый мобильный интернет. И вдруг я столкнулся с непредвиденной проблемой: на телефон стали приходить какие-то непонятные сообщения с иероглифами под названием «Оповещение населения». Сообщения приходят сотнями и их приходится удалять по одному.
Но самое раздражающее даже не это, а то, что эти оповещения мгновенно садят батарею. Ведь телефон постоянно пищит и вибрирует. Поэтому, я вынужден заряжать телефон по 3 раза в день — и дома, и на работе.
Ещё я так понимаю, что это как-то зависит от моего перемещения по городу — в каком-то месте телефон находится в состоянии покоя, а в другом снова Пару часов может быть тишина, а потом всплывающие сообщения «оповещение населения» снова начинают приходить. У меня смартфон Lenovo A1000, который я купил месяц назад. До этого использовался другой оператор, который работает в режиме 2G, и таких проблем на этом же смартфоне не было.
SMS Cell Broadcast Messages: How to Enable and Disable ? (Android)
Итак, в этой статье мы попытаемся собрать всевозможные решения. К сожалению, одним помогает одно, другим — совершенно другое. Некоторые решения можно условно назвать решениями — это скорее способ обойти проблему.
Что такое широковещательная передача (Cell Broadcast)
Cell Broadcast (оно же «Широковещательные сообщения», «Сообщения сети» или «Информация БС») — это стандартная функция GSM-сети, призванная облегчить жизнь абоненту. Зачастую она служит для отображения названия текущей станции метро, ближайшего населенного пункта или телефонного кода местности. На старых телефонах, вроде Nokia 3310, информация сети удобно отображалась на экране под названием оператора. Но на новых смартфонах широковещательные сообщения приходят как SMS-ки: со звуковым сигналом и отображаются в приложении Сообщения. Стоит помнить, что включенная функция Cell Broadcast в любом случае дополнительно разряжает батарею.
Как отключить оповещение населения
Решение №1. Отключить широковещательную передачу (Cell Broadcast)
В смартфонах Lenovo:
Сообщения → Настройки → Параметры SMS/MMS → Менеджер сообщений по умолчанию → Оповещение населения.
Выберите SIM-карту, для которой нужно отключить оповещения, и снимите галки.
Отключение сообщений от базовой станции в Samsung Galaxy:
Зайдите в Сообщения .
Нажмите клавишу Меню (или долгое нажатие по клавише Недавние приложения ).
Выберите Настройки .
Сообщения сети (или Настройки сообщений сети ).
Нажмите на переключатель или снимите флажок, чтобы выключить:
Решение №2. Сменить канал широковещательной передачи
Войдите в Сообщения .
Вызовите меню и выберите Настройки .
Выберите Конфигурация каналов → Каналы приема → Мой канал .
После этого нажмите Добавить канал и введите номер (допустим, 10). По умолчанию используется канал №50, поэтому нужно указать какой-нибудь другой.
Cell Broadcast for Public Warning
Решение №3. Переставить карту в другой слот
Этот способ реально помог моему знакомому отключить спам «оповещение населения» с иероглифами на смартфоне Lenovo A1000 с Android 5. Причем, интересно то, что во втором слоте SIM-карта тоже работает в режиме полноценного 3G (у некоторых моделей двухсимочных аппаратов в режиме 3G может работать лишь один из двух слотов). До конца не понятно, почему так происходит, но решение помогло избавиться от спама.
Решение №4. Сменить режим 3G на 2G
Если не помогло ничего из описанного выше, то напоследок расскажу вам еще об одном способе избавиться от назойливого оповещения населения на вашем телефоне. Переключите карту в режим 2G. На некоторых операторах это решает проблему. Естественно, скорость передачи данных будет снижена.
Войдите в Настройки → Другие сети → Мобильные сети → Режим сети .
Выберите 2G или Только GSM .
Это скорее «костыль», нежели решение… Однако если вы не пользуетесь Интернетом на телефоне, то у вас есть дополнительный шанс избавиться от широковещательного спама.
Послесловие
В завершение могу сказать еще вот о чем. Интернете пишут, что якобы оповещение население реально отключить на стороне оператора, выполнив какую-то USSD-команду, но нам такого решения найти не удалось. Операторы отсылают с данной проблемой к производителю смартфона. Поэтому, очень хотелось бы услышать мнение представителей компании Lenovo касательно данной проблемы на их аппаратах.
Возле ректора 23 декабря 2011 в 19:52
Получение Cell Broadcast сообщений
Cell Broadcast (CB) — широковещательная передача сообщений в сотовой сети. CB используется для массовой рассылки SMS-сообщений в сетях стандартов GSM, CDMA, WCDM.
Сообщения могут состоять как из одной, так и из нескольких страниц. Максимальное количество страниц для одного сообщения – 15.
Для работы с CBM (CB messages) в Symbian реализована специальная библиотека etel.lib . Она non-public, а это означает, что для нее нет описание в официальной документации. Тем не менее, некую информацию к этой библиотеке можно почерпнуть в хидере — «etelmm.h» , или интернете.
Первое, что необходимо сделать, подключиться к сервису телефона, который содержит информацию о сообщениях, звонках, системных фильтрах.
RTelServer iServer;
iServer.Connect();
iServer.LoadPhoneModule(«phonetsy.tsy»);
TInt enumphone;
iServer.EnumeratePhones(enumphone));
RTelServer::TPhoneInfo iPhoneInfo;
iServer.GetPhoneInfo(0, iPhoneInfo));
Для получения доступа к этой информации есть класс RMobilePhone :
RMobilePhone iPhone;
iPhone.Open(iServer, iPhoneInfo.iName);
Нам нужны лишь CB сообщения, соответственно создаем объект класса RMobileBroadcastMessaging . Еще необходимо создать буфер, в который мы будем сохранять полученное сообщение (если пролистать стандарт CBM, то наткнемся на информацию, что максимальная длинна тела сообщения — 88 байт). Так же необходимо создать объект TRequestStatus , который позволит следить за ходом выполнения запроса. Объект RMobileBroadcastMessaging содержит дополнительные атрибуты сообщения, в нашем случае они не используется.
TRequestStatus iReqStatus;
TBuf8 iGsmMsgdata;
RMobileBroadcastMessaging iBroadcastMsg;
iBroadcastMsg.Open(iPhone);
RMobileBroadcastMessaging::TMobileBroadcastAttributesV1 iAttrInfo;
TPckg iDes(iAttrInfo);
Все настроено. Оставляем в системе запрос на получение сообщения. Теперь, когда телефон получит новое CB сообщение, оно будет помещено в буфер iGsmMsgdata , а объект iReqStatus будет содержать результат выполнения запроса.
IBroadcastMsg.ReceiveMessage(iReqStatus, iGsmMsgdata, iDes);
User::WaitForRequest(iReqStatus);
if(iReqStatus.Int() == KErrNone)
// Обрабатываем полученное сообщение.
else
// В процесе получения сообщения возникла ошибка. Необходимо ее обработать.
>
User::WaitForRequest блокирует поток выполнения. Как вариант, сервис получения CB сообщений можно поместить в отдельный поток.
В конце, необходимо закрыть все используемые подключения:
IBroadcastMsg.Close();
iPhone.Close();
iServer.UnloadPhoneModule(KGsmModuleName);
iServer.Close();
Следующий этап – декодирование полученного сообщения .
CB сообщение имеет следующий формат :
Байты 00-01: ID сообщения;
Байты 02-03: канал, с которого сообщение получено;
Байт 04: схема кодирования сообщения;
Байт 05: параметры полученной страницы (четыре младших бита – общее количество страниц, из которых состоит сообщение; четыре старших бита – номер полученной страницы);
Байты 06-88: тело сообщения.
Схема кодировки, указывает способ декодирования сообщения. Самые распространённые: GSM 7bit (задается «0х01») и UCS-2 (задается «0х58» или «0х59»). Описание остальных схем кодирования можно найти в стандарте CB.
Кодировка GSM 7bit означает, что символ кодируется не 8, а 7 битами.
UCS-2 – под символ выделяется два байта.
Первых шесть байт сообщение содержать служебную информацию. (pData – дескриптор строки с сообщением).
Int msgID;
memcpy(
msgID = msgID
endian_swap(msgID);
unsigned short channel;
memcpy(
channel = channel
endian_swap(channel);
int dcScheme;
memcpy(
dcScheme = dcScheme
char pageParam;
memcpy(
pageParam = pageParam
int pageId = pageParam >> 4; //get hi byte
int pagesTotal = pageParam //get lo byte
Теперь о том, как декодировать .
В случае с GSM 7bit работает с С строками:
Char cbuf;
int char_cnt = 0;
unsigned int bb = 0;
unsigned char ur = 0;
unsigned char curr = 0;
unsigned char prev = 0;
int readPos = 0;
while (readPos > (7 — bb);
prev = curr;
if (ur == 0xd)
break;
>
msgData = ur;
bb = ++bb % 7;
char_cnt++;
if (bb == 0)
msgData = prev;
prev = 0;
>
>
msgData = «