Набросал тестовый менеджер сокетов. Нужен для упрощения доступа к интернету из эльфов.
APN пишем в файле 'apn.txt', ничего лишнего не пишем, даже переводов каретки не должно быть. Кидаем файл в корень раздела '/a/' (все маленькими буквами).
Если эльф нормально запускается, без ребутов, можно прописать в автозапуск.
Требуются новые функции в либе!
Эльф менеджер сокетов:
Эльф должен быть запущен, чтобы демонстрация работала.
Эльф пример работы итернета с исходниками, демонстрация работы:
Наблюдаем сообщения в мидвее. Запускаем (блокируются все кнопки, красная - выход), жмем 0 - создается сокет (ждем "SockAnsw: CREATE"), жмем 1 - устанавливается соединение с motofan.ru, к порту 80 (ждем включения GPRS и строку "SockAnsw: READY"), 2 - записать в сокет запрос "GET / HTTP/1.1\n..." (полностью текст запроса можно посмотреть в исходниках), если все нормально, то в мидвее будет много строк с ответом от motofan.ru с текстом главной страницы, будет видно, что страница приходит по частям (Внимание! главная страница мотофана не маленькая). 3 - прочитать с сокета (хотя врятли там чтото будет, все читается по приходу ивента), 4 - закрыть сокет, 5 - удалить сокет (GPRS выключается, показывается сколько байт за сеанс).
Схема подключения и работы с нэтом для разработчиков:
0. Основные описания в файле synsock_api.h в исходниках с демонстрацией работы.
1. При старте эльфа создаем запрос(ивент) к менеджеру. Ждем ответа от него на указанный вами ивент.
Если эльф с ГУИ, то можно это делать в Init стэйте, ждать пока прийдет ивент EV_GRANT_TOKEN и ответ от менеджера и только потом переключать стэйт. Там же можно запустить таймер на 0,1 сек, если поймали от таймера, значит менеджер не запущен.
2. При ответе нужно запомнить адреса функций, которые будете использовать.
3. Сначала создаем сокет (функция socket), первый параметр тип соединения (SOCK_TCP/SOCK_UDP), второй - по какому ивенту менеджер будет оповещать о событиях с этим сокетом. Функция возвращает уникальный идентификатор сокета, который нужно запомнить и через него обращаться.
4. Ждем ивент, заданный вторым параметром. В данных к этому ивенту будет код ответа сокета (SOCK_ANSW_CREATE - создание) и статус (успешно/не успешно).
На самом деле событие будет сразу, по окончании ф-ции из которой вызвали socket, без задержек.
5. Вызываем socket_connect. Параметры: идентификтор сокета (запоминили его при создании), имя домена или IP, порт к которому коннект. Возвращает -1 в случае ошибки или 0 если все нормально.
6. Ждем ивент, с кодом SOCK_ANSW_READY. Ивент означает, что gprs включен и соединение установлено.
Ивент прийдет не сразу! Нужно подождать пока все включится. Приложение в это время может делать что угодно.
7. В принципе все, соединение установлено, можно писать в него.
8. Ивент с ответом SOCK_ANSW_DATA означает что в буфере сокета есть данные, их нужно забрать.
Используйте socket_read. Параметры: идентификатор сокета, указатель на буфер куда можно скинуть данные, размер буфера. Возвпажает -1 в случае ошибки или количество байт, записанных в буфер.
Внимание! Данные приходят по частям, генерируя ивент с ответом SOCK_ANSW_DATA. Ваше приложение должно это учитывать.
9. Ивент с ответом SOCK_ANSW_DELETE означает что сокет простаивает уже больше минуты и менеджер его удаляет. В данных к ивенту также есть идентификатор сокета.
10. Ивент с ответом SOCK_ANSW_ERROR означает об ошибке. На данный момент возникат только при ошибке конфигурирования прокси.
Также разработчикам:
Данные с ответом от менеджера идут не в аттаче а в данных ивента (event->data). Можно в каждой функии, обработчике ивента использовать примерно следующее:
но удобнее модифицировать обьединение EVENT_DATA_T в SDK:
Максимальное количество одновременно существующих сокетов - 8.
Таймаут простоя сокета - 60 сек. По истечении сокет будет удален и приложение, создавшее его, будет оповещено об этом через ивент.
В заключение: можно не использовать это приложение, а работать напрямую с мотороловским DL_DSMA. Конфликтов не должно быть.
Все это очень сырое, исключительные ситуации почти не рассматриваются. Хотелось бы комментариев, предложений по улучшению.
Synsock mod3 by om2804
apn, login, password, время простоя беруться из Web-сессии.
Synsock mod by lavmen
для l7e подобных
Сообщение отредактировал om2804 - 24.5.2009, 16:54
APN пишем в файле 'apn.txt', ничего лишнего не пишем, даже переводов каретки не должно быть. Кидаем файл в корень раздела '/a/' (все маленькими буквами).
Если эльф нормально запускается, без ребутов, можно прописать в автозапуск.
Требуются новые функции в либе!
Эльф менеджер сокетов:
![]() ![]() |
Эльф должен быть запущен, чтобы демонстрация работала.
Эльф пример работы итернета с исходниками, демонстрация работы:
![]() ![]() |
Наблюдаем сообщения в мидвее. Запускаем (блокируются все кнопки, красная - выход), жмем 0 - создается сокет (ждем "SockAnsw: CREATE"), жмем 1 - устанавливается соединение с motofan.ru, к порту 80 (ждем включения GPRS и строку "SockAnsw: READY"), 2 - записать в сокет запрос "GET / HTTP/1.1\n..." (полностью текст запроса можно посмотреть в исходниках), если все нормально, то в мидвее будет много строк с ответом от motofan.ru с текстом главной страницы, будет видно, что страница приходит по частям (Внимание! главная страница мотофана не маленькая). 3 - прочитать с сокета (хотя врятли там чтото будет, все читается по приходу ивента), 4 - закрыть сокет, 5 - удалить сокет (GPRS выключается, показывается сколько байт за сеанс).
Схема подключения и работы с нэтом для разработчиков:
0. Основные описания в файле synsock_api.h в исходниках с демонстрацией работы.
1. При старте эльфа создаем запрос(ивент) к менеджеру. Ждем ответа от него на указанный вами ивент.
Если эльф с ГУИ, то можно это делать в Init стэйте, ждать пока прийдет ивент EV_GRANT_TOKEN и ответ от менеджера и только потом переключать стэйт. Там же можно запустить таймер на 0,1 сек, если поймали от таймера, значит менеджер не запущен.
2. При ответе нужно запомнить адреса функций, которые будете использовать.
3. Сначала создаем сокет (функция socket), первый параметр тип соединения (SOCK_TCP/SOCK_UDP), второй - по какому ивенту менеджер будет оповещать о событиях с этим сокетом. Функция возвращает уникальный идентификатор сокета, который нужно запомнить и через него обращаться.
4. Ждем ивент, заданный вторым параметром. В данных к этому ивенту будет код ответа сокета (SOCK_ANSW_CREATE - создание) и статус (успешно/не успешно).
На самом деле событие будет сразу, по окончании ф-ции из которой вызвали socket, без задержек.
5. Вызываем socket_connect. Параметры: идентификтор сокета (запоминили его при создании), имя домена или IP, порт к которому коннект. Возвращает -1 в случае ошибки или 0 если все нормально.
6. Ждем ивент, с кодом SOCK_ANSW_READY. Ивент означает, что gprs включен и соединение установлено.
Ивент прийдет не сразу! Нужно подождать пока все включится. Приложение в это время может делать что угодно.
7. В принципе все, соединение установлено, можно писать в него.
8. Ивент с ответом SOCK_ANSW_DATA означает что в буфере сокета есть данные, их нужно забрать.
Используйте socket_read. Параметры: идентификатор сокета, указатель на буфер куда можно скинуть данные, размер буфера. Возвпажает -1 в случае ошибки или количество байт, записанных в буфер.
Внимание! Данные приходят по частям, генерируя ивент с ответом SOCK_ANSW_DATA. Ваше приложение должно это учитывать.
9. Ивент с ответом SOCK_ANSW_DELETE означает что сокет простаивает уже больше минуты и менеджер его удаляет. В данных к ивенту также есть идентификатор сокета.
10. Ивент с ответом SOCK_ANSW_ERROR означает об ошибке. На данный момент возникат только при ошибке конфигурирования прокси.
Также разработчикам:
Данные с ответом от менеджера идут не в аттаче а в данных ивента (event->data). Можно в каждой функии, обработчике ивента использовать примерно следующее:
Код
UINT32 * params = (UINT32 *)(&event->data);
но удобнее модифицировать обьединение EVENT_DATA_T в SDK:
Код
typedef union
{
UINT8 key_pressed;
// ...
UINT32 params[16];
// ... прочие структуры
} EVENT_DATA_T;
{
UINT8 key_pressed;
// ...
UINT32 params[16];
// ... прочие структуры
} EVENT_DATA_T;
Максимальное количество одновременно существующих сокетов - 8.
Таймаут простоя сокета - 60 сек. По истечении сокет будет удален и приложение, создавшее его, будет оповещено об этом через ивент.
В заключение: можно не использовать это приложение, а работать напрямую с мотороловским DL_DSMA. Конфликтов не должно быть.
Все это очень сырое, исключительные ситуации почти не рассматриваются. Хотелось бы комментариев, предложений по улучшению.
Synsock mod3 by om2804
![]() ![]() |
apn, login, password, время простоя беруться из Web-сессии.
Synsock mod by lavmen
![]() ![]() |
Сообщение отредактировал om2804 - 24.5.2009, 16:54