Не понял этого выражения: T>Проблема в том, что структура адреса и имя сервиса у меня определено.
А в чем тогда проблема? Или даже так — а почему в этом проблема?
Почему (в чём) проблема, что "структура адреса и имя сервиса" определено?
Короче я не понял вопроса.
Я вот понимаю что определено, но не так. Значит надо провильно определить. Или что?
T>Сам пишу на дельфи и с C почти незнаком. T>Пример ( хотя бы общие вещи ) на дельфи не подкинешь.
С точностью до наоборот.-) Доже на слух морщусь от слова Pascal
T>Благодарю за помошь.
Здравствуйте, Tsnok, Вы писали:
T>Дело в том, что для связи с мобильным устройством использую сокеты — WINSOCK, и ком порт(эмуляция его работы) мне не подходит
А где ты увидел COM порт? Если ты про (TComm), то это базовый класс работы с портами (это мной написано поэтому не ищи в справке) от которого наследуются классы для работы уже с COM, IrDA, Bluetooth.
И в функцию описанную выше
bool OBEX_FTP::Open(TComm *p)
Я уже передаю готовый открытый порт (а что это за порт это не важно).
Просто если это COM порт то его надо предварительно перевести (на мобильном устройстве) в двоичный (точнее в данном случае OBEX, потому что существуют и другие режимы) режим AT коммандой (какой зависит от устройсва, фирмы, модели).
А в случае с открытием через Инфракрасный порт или BT посредством сокетов ты указывая в свойсвах SOCKADDR_IRDA "OBEX"
Ты говоришь ему по какому протоколу будешь общаться через этот сокет. Потому что есть ещё масса других протоколов (и тот же СОМ потр, и печать на принтере, и нискоуровневые. А у Bluetooth я вообще молчу)
Конечно нужно и другие поля этой струкруры заполнить. Ты же ещё не сказал к какому конкретно устройству будешь обращаться (а ведь можно сразу параллельно к нескольким).
что то типа того (это выдержки из моего кода для понимания):
#define DEVICE_LIST_LEN 10
unsigned char DevListBuff[sizeof(DEVICELIST) -
sizeof(IRDA_DEVICE_INFO) +
(sizeof(IRDA_DEVICE_INFO) * DEVICE_LIST_LEN)];
int DevListLen = sizeof(DevListBuff);
PDEVICELIST pDevList = (PDEVICELIST) &DevListBuff;
pDevList->numDevice = 0;
getsockopt(sock, SOL_IRLMP, IRLMP_ENUMDEVICES,
(char *) pDevList, &DevListLen);
if (pDevList->numDevice == 0) // Не найдено ни одного устройства
{
...
}
else
{
for (int i = 0; i < (int) pDevList->numDevice; i++)
{
memcpy(&SockAddr.irdaDeviceID[0], &pDevList->Device[i].irdaDeviceID[0], 4);
}
}
остаётся только запросить нужный сервис у OBEX (пример кода я приводил выше). Он же не только просмотр файлов обеспечивает:
Здравствуйте, Tsnok, Вы писали:
T>Открыть сокет мне удалось, мобильник определяет подключение.
T>Возникли следующие вопросы, если несложно, T> 1. Как можно прочитать каталоги с файлами.( и вообще как работать с каталогами )\\ например"image/jpeg"
Т.е. до этого такого вопроса не возникало
Вот с этого момента при работе с OBEX и начинается гимморой!
После того как ты открыл сокет, нужно открыть OBEX сессию. Код я приволил выше, прничём это рабочий код! http://www.rsdn.ru/Forum/?mid=1470363
А устройств должно тебе ответить тоже пачкой байтов которую нужно "расшифровать".
Вот пример из того файла.
Client Request: bytes Meaning
Opcode 0x80 CONNECT, Final bit set
0x0011 packet length = 17
0x10 version 1.0 of OBEX
0x00 flags, all zero for this version of OBEX
0x2000 8K is the max OBEX packet size client can accept
0xC0 HI for Count header (optional header)
0x00000004 four objects being sent
0xC3 HI for Length header (optional header)
0x0000F483 total length of hex F483 bytes
Server
Response:
response code 0xA0 SUCCESS, Final bit set
0x0007 packet length of 7
0x10 version 1.0 of OBEX
0x00 Flags
0x0400 1K max packet size
Т.е. мобилка тебе когда ответит то первый байт должен быть 0xA0.
Потом, два байта, длина всего этого пакета 0x0007 включая и первый байт. Т.е. ты можешь всегда при
работе с OBEX сначала читать три первых байта, потом зная сколько он тебе должен прислать читаешь остатки, а потом
разбараешь уже что там тебе прислали.
Даже если устройство вернёт ошибку оно вернет 3 байта (ну иногда больше) где первй байт код ошибки и 2 байта (с числом 0x0003) это длина.
Короче тебе теперь нужно дабиться открытия OBEX сессии (кстати закрывать её тоже надо, для этого есть коды, описаны в указанном файле).
А потом уже можно двигаться дальше, запрашивать нужные сервисы у сервера (удаленное устройство является сервером OBEX по отношению к клиенту — ПК).
T> 2. Как можно задать скорость соединения.
А этот вопрос пусть вообще тебя не волнует. Во всяком случае пока. Связь устанавливается по умолчанию на максимально возможной скорости. Ты можешь только понижать скорость влезая в эту кухню. И то это ещё надо суметь, а оно тебе надо?
T>Я кончно извиняюсь за глупый вопрос, но как связать сокет и порт.
А ты упорный. Ещё чуть-чуть и у тебя получиться.
Конечно говоря о портах может возникнуть некоторая путаница, потому что разные вещи называются портами.
Но в данном контексте я имею ввиду сокет = порт. Ты открыл сокет, это и есть порт. Тебе остаётся только посылать и принимать байты через этот сокет.
T>И какими функциями можно воспользоваться для отправки в порт, и чтения из порта. \\предполагаю что сенд и ресайв, но неуверен.
Совершенно верно. Только зачем извращать и без того извращенное? Функции называются своими именами латинскими буквами:
int send (
SOCKET s,
const char FAR * buf,
int len,
int flags
);
Ну и другая, как там ты её обозвал.
Как видишь при вызове указывается сокет (SOCKET s) который ты открыл (открыл?) и никаких там портов.
Другой вопрос что лучше бы перевести сокет из режима по умолчанию в "не блокирующий" (асинхронный) режим, о то можно навсегда уйдти в ожидание ответа с порта. Но это тебе к книгам по программированию сокетов, мобильные устройства тут не причем.
Но это всё потом. Если не бросишь всё это.
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, kiborg, Вы писали:
>>> // opcode|length |version|flag|packsize|HI|data length|data(uuid) >>> // 80 | 001A |10 |00 |0x2000 |46|0013 |6B01CB31410611D49A770050DA3F471F >>> Всё это описано в спецификации на протокол OBEX
T>Попытался реализовать OBEX сессию, но возникли проблемы.
Хотя я и не понимаю паскаль конкретно, но принцип то любого языка понятен.
И глядя на твой код вижу что ты пока не ведаешь что творишь.
Конечно он работать не будет, потому как в каждой первой строке ошибки.
T> BUF_S : array [ 0 .. 4096 ] of Char;
Хотя это не принципиально, но максимальный размер пакета
в OBEX 8КБ может быть, вроде как я понял читая спецификацию
Ты скачал спецификацию?
Далее, забудь про символы. Ты посылаешь конкретно пакет байтов который сам формируешь.
Т.е. 80h это число в шестнадцатеричной системе (в десятичной 128), а не код символа.
T> Buf_s[ 0 ] := chr( $80 );
Т.о. здесь должно быть, как то так:
Buf_s[ 0 ] := 128;
или вместо лучше 128 в шестнадцатеричной системе, но я не знаю как в Паскале
наверно так:
Buf_s[ 0 ] := $80;
Далее в следующей строке сразу две ошибки
T> Buf_s[ 1 ] := chr( $001A ); Во первых 001Ah это длина (length) пакета в байтах (26 байт)
Конкретно вот этого:
Если ты посчитаешь количество этих байт то получишь 26.
80 — один, 00 — два, 1A — три, 10 — четыре....
Но это длина моего пакета. У твоего длина другая (хотя у тебя вообще не пакет пока а мусор)
Во вторых 001A это ДВА байта. Т.е. на Си я писал бы так
*((unsigned short *)&Buf_s[1]) = ((unsigned short)0x001A);
Но я не знаю как на Паскале преобразовавать типы. Суть в том что должно быть так
Buf_s[ 1 ] := $00;
Buf_s[ 2 ] := $1A;
Понимаешь? А уже потом
Buf_s[ 3 ] := $10; и т.д.
T> Buf_s[ 2 ] := chr( $10 ); T> Buf_s[ 3 ] := chr( $00 );
Соответсвенно это тоже бред T> Buf_s[ 4 ] := chr( $0800 );
А это вообще что? T> Buf_s[ 5 ] := chr( $70 ); T> Buf_s[ 6 ] := chr( $13 );
Далее соответственно ты посылаешь не строку (что ты зачем то пылался сделать завершая символом $13).
Поэтому нельзя вичислить длину. Поэтому никаких length
Но ты точно знаешь количество посылаемых байт, потому что ты сам формируешь паакет, вот его и указываешь.
И в Buf_s[ 1 ], Buf_s[ 2 ] и в функции send()
T> send( Sock, BUF_S, length( BUF_S ) + 1, 0 );
T> Sleep( 500 );
Это кто тебя научил так делать?
Самое главное бессмысленно. recv не завершиться пока не считает байты (в синхронном режиме конечно, но он и есть по умолчанию)
И опять же пол секунды зачем ждать, а если считает быстрее, зачем лишний тормоз?
T> recv( Sock, BUF_SND, length( BUF_SND ) + 1, 0 );
T> Посмотрел доку по OBEX, и попробывал открыть сессию ... при передаче данных инфракрасник начинает сильнее моргать примерно на 150 милисекунд, а затем как обычно, в режиме ожидания, но в буфере который читает полученную информацию ничего нет.
Ну а чё бы ему не мигать, ты же посылаешь свой мусор в эфир через сокет.
Вот когда пошлешь на языке понятном для сервера, он тебе и ответит.
T>ПОдскажите, что не так делаю ... ? T>\\при отрпавке сокет создан + установлен коннект с мобилкой( мобила информирует об установленном соединении )
T>Благодарю за помощь!
Ну а где благодарность? Хотя бы ввиде оценок и плюсиков???
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, kiborg:
T>оформил пакет, ( не уверен, чтио правильно, но пока только так, )
Думаешь с той стороны кто-то сидит и небольшие неточности твои исправляет?
Увы. Тогда тебе к гумманитариям. Они могут седня так бла-бла, завтра диаметрально противоположно.
А тут либо поедет, либо нет.
Тык вот. Я тебе зачем писал что ты байты должен передпвать?
Почему ты их упорно превращаешь в коды символов? ЗАЧЕМ??? Ты применяешь функцию chr???
В Buf_s[ 0 ] должно быть число $80.
в результате выполнения chr
выдается буква, порядковый номер которой (ASCII код) равен аргументу функции
T> BUF_S, T> BUF_R : packed array [ 0 .. 8192 ] of Char; //Real;
T> Buf_s[ 0 ] := chr( $80 ); T> Buf_s[ 1 ] := chr( $00 ); T> Buf_s[ 2 ] := chr( $07 ); T> Buf_s[ 3 ] := chr( $10 ); T> Buf_s[ 4 ] := chr( $00 ); T> Buf_s[ 5 ] := chr( $01 ); T> Buf_s[ 6 ] := chr( $00 );
Напиши напротив каждой строки выше тобой приведённой, что ты имеешь ввиду под байтом присваемым тобобой
в каждую ячейку.
А где у тебя uuid сервиса OBEX для которого выполняется операция???
T> View_BUF_SND.AppendBuffer( @BUF_S, 7 ); T> View_BUF_SND.SelStart := 0;
T> recv( Sock, BUF_R, sizeof( BUF_R ), 0 ); T> View_BUF_RCV.AppendBuffer( @BUF_R, 256 ); T> View_BUF_RCV.SelStart := 0;
T>в ответ получаю, соедующее [ A0 00 07 10 00 01 00 ]
Даже не буду анализировать потому что этого не может быть.
T>начало вроде правильно( если смореть спецификацию ), но все остальное дублирует отправляемое ...
T>при отправке [ 81 00 03 ] это, как я понимаю разрыв сесси, получаю [ A0 00 07 10 00 01 ]
А этого тем более не может быть потому что показано что должно быть 7 байт в пакете, а ты привел 6.
K>>В Buf_s[ 0 ] должно быть число $80. T>все дело в том, что раньше не приходилось работать с подобной системой представления и преобразования информации ;(. T>поэтому не очень получается.
Хочешь сказать ты только с символами работал?
T>// opcode|length |version|flag|packsize|HI|data length|data(uuid) T>// 80 | 001A |10 |00 |0x2000 |46|0013 |6B01CB31410611D49A770050DA3F471F
T> BUF_S[ 0 ] := $80 ; //$80
T> Buf_s[ 1 ] := $14 ; //длинна пакеты в байтах
Ты надо мной издеваешься?
Длина пакета задаётся ДВУМЯ БАЙТАМИ ВСЕГДА!!!
Если у тебя длина $14 то должно быть в массиве так
Т.е. дальше можно не смотреть уже здесь бага.
Тут ещё не понятно, если ты скопировал мой пример, то почему у тебя
длина $14?? Догда когда она $1A. К чему здесь творческая переработка? Это не литературная проза, в который раз пытаюсь дать понять. Тут всё точно, ло бита.
T> Buf_s[ 2 ] := $10 ; //version T> Buf_s[ 3 ] := $00 ; //flag T> Buf_s[ 4 ] := $20 ; //packsize T> Buf_s[ 5 ] := $00 ; //packsize T> Buf_s[ 6 ] := $46 ; //HI T> Buf_s[ 7 ] := $00 ; //data length T> Buf_s[ 8 ] := $13 ; //data length
K>>А где у тебя uuid сервиса OBEX для которого выполняется операция??? T>а вот с этим большая проблема, как правильно можно uuid поместить в буфер
K>>А этого тем более не может быть потому что показано что должно быть 7 байт в пакете, а ты привел 6. T>он возвращает семь байт просто там нули 00, и я их не стал писать ...
А я должен был додумать? А что нули уже не данные???
Есть большая разница между $1A и $1A00 например.
T>изучил ваши замечания и по попробывал реализовать фомирование пакета с учетом все выше рассмотренного, но все равно в ответ отклик неважнецкий 17 10 04 80
Назову вещи своими именами — ЭТО совсем не отклик OBEX!
Такого отклика не может быть в принципе!
Итак, читай ВНИМАТЕЛЬНО:
Первый байт в OBEX пакете всегда кокой-нибудь код. ВСЕГДА понимаещь?
И когда посылаешь и когда принимаешь, всегда первый байт это код.
В данном случае, ты ждешь отклика от устройства, значит должен анализировать коды ответа.
$A0 или $20 — успешно
$90 или $10 — Запрос на продолжение.
и т.д. см. спецификацию
Почему некоторые коды могут иметь два числа одного и того же результата я не знаю. Спецификаторы не договорились наверно.
Но реально зависит от производителя устройства. Может то, а может это посылать. Кто-то тут хотел универсальную прогу для всех устройств?-) Блажен кто верует... Это ещё цветочки.
Ну тык вот.
Далее после первого байта ВСЕГДА идут ДВА байта длины пакета. Понимаешь всегда?
А вот далее уже от обстоятельств.
Тут можно использовать такую стратегию, читай внимательно:
Сначала ВСЕГДА читаешь ТРИ первых байта.
Анализируешь первый. Если не совпадает ни с какими кодами (как в твоём собственно примере вверху), то это мусор. Можешь дальше не мучаться — это не OBEX.
Если совпало с кодом, то в зависимоти от кода во-первых, а во-вторых анализируешь длину пакета в бвух следующих байтах и если она больше 3 то остатки надо принять (длина — 3).
Ну а что там — читай спецификацию.
T>// opcode|length |version|flag|packsize|HI|data length|data(uuid) T>// 80 | 001A |10 |00 |0x2000 |46|0013 |6B 01 CB 31 41 06 11 D4 9A 77 00 50 DA 3F 47 1F
T> BUF_s[ 0 ] := $80;
T> BUF_s[ 1 ] := $00; //length T> BUF_s[ 2 ] := $1A; //length длинна пакета 26 байт T> BUF_s[ 3 ] := $10; //VERSION T> BUF_s[ 4 ] := $00; //FLAG T> BUF_s[ 5 ] := $20; //PACKSIZE T> BUF_s[ 6 ] := $00; //PACKSIZE T> BUF_s[ 7 ] := $46; //HI T> BUF_s[ 8 ] := $00; //DATA LENGTH T> BUF_s[ 9 ] := $13; //DATA LENGTH
Ну у тут... Сколько ты будешь наступать на одни и теже грабли в одном и том же месте. Причем тебе ещё и говорят что тут грабли???
Ты должен послать ровно столько байт, сколько ты сформировал в пакете, а не сколько у тебя буфер размером.
Ты вообще понимаешь, что возвращает sizeof( @BUF_S )???
Вот именно столько будет посылаться байт функцией send. И все эти байты будет пытаться анализировать принимающее устройство.
Те же яйца — вид сбоку.
Ты пытаешься принять с устройства sizeof( @BUF_R ) байт. Функция будет ждать пока ей не прилетит именно столько байт.
А между тем тебе точно известно сколько устройство посылает тебе байт.
Стратегию я описал выше.
T>Благодарю за помощь.
Где тогда мне оценки???
T>Если при задании структуры адреса T>указать следующее
T> irADRR.irdaAddressFamily := AF_IRDA; T> irADRR.irdaServiceName := 'OBEX'; T> и т.д.
T>и при этом послать в порт, что угодно получаю следующий отклик A0 00 07 10 00 и т.д.
А это что-то не логично. Как это что угодно? Что если полсать скажем один байт на пример $00,
то всё равно получишь то что ты написал?
И кстати A0 00 07 10 00 и т.д. это ведь успешный отклик. Еслиб ты всё написал можно точно сказать, а так
начало неплохое...
T>но если структуру определить как
T> irADRR.irdaAddressFamily := AF_IRDA; T> irADRR.irdaServiceName := 'IrDA:IrCOMM';
T>то в этом случае в ответ вываливается мусор, что в полне логично.
Вот именно логично.
T>Вот. T>По поводу длинны T> View_BUF_SND.AppendBuffer( @BUF_S, 26 ); T> ,,,,,,, T> когда пробую просмотреть свой сформированный пакет вижу запрошенные 26 байт, судя по всему столько же отправляется в телефон, T> вот то что отображается в буфере
T> 80 00 00 00 00 00 00 00 1A 00 00 00 10 00 00 00 T> 00 00 00 00 20 00 00 00 00 00
T> объясните если несложно, почему струтура пакета отличается от той что была задана, если я определил, что весь пакет заполнен данными а здесь только 6 байт в перемешку с нулями.
Как я это объясню? Я же не стою у тебя за спиной не смотрю что ты там творишь. Откуда ты берёщь эти байты.
T> if send( Sock, BUF_S, 26 , 0 ) = SOCKET_ERROR then T> ,,,,,,,
T> recv( Sock, BUF_R, 26, 0 );
Это по-прежнему не правильнро. Стратегию я описывал раньше. С какого потолка ты получаешь 26 байт?
T> View_BUF_RCV.AppendBuffer( @BUF_R, 26 ); T> ,,,,,,,
T> даже если определить динну пакета в 26 байт то в ответ все равно вываливается 17 04 80 и т.д.
Вот у меня вопросы.
Что за устройство с которым ты работаешь?
Есть ли у тебя программа вообще какая нибудь, которая с ним работает? То есть ты вообще видел сам чтобы с ним ктонибудь работал?
Если да, может ли твоё устройство работать по COM порту? Если да, то можно подглядеть что там работающая программа посылает в порт. Я например, довольно долго этим занимался, потому что все производители вставляюта свои особенности в протокол.
Пробовал ли ты свой код на других устройствах?
Здравствуйте, Tsnok, Вы писали:
T>>и при этом послать в порт, что угодно получаю следующий отклик A0 00 07 10 00 и т.д. >>А это что-то не логично. Как это что угодно? Что если полсать скажем один байт на пример $00, >>то всё равно получишь то что ты написал? >>И кстати A0 00 07 10 00 и т.д. это ведь успешный отклик. Еслиб ты всё написал можно точно сказать, а так >>начало неплохое... T>\Это действительно так. Если описать имя сервиса ОБЕКС, и послать в порт что угодно хот $00 то в ответ получаетм именно такой отклик. Если интересно то могу скинуть исходные коды, убедитесь сами.
Не ну всякое бывает. Только это не правильно. Тут ничего случайного не должно быть.
T>>> if send( Sock, BUF_S, 26 , 0 ) = SOCKET_ERROR then T>>> ,,,,,,,
T>>> recv( Sock, BUF_R, 26, 0 ); K>>Это по-прежнему не правильнро. Стратегию я описывал раньше. С какого потолка ты получаешь 26 байт? T> BUF_s[ 0 ] := $80;
T> BUF_s[ 1 ] := $00; //length T> BUF_s[ 2 ] := $1A; //length
T> BUF_s[ 3 ] := $10; //VERSION T> BUF_s[ 4 ] := $00; //FLAG T> BUF_s[ 5 ] := $20; //PACKSIZE T> BUF_s[ 6 ] := $00; //PACKSIZE T> BUF_s[ 7 ] := $46; //HI T> BUF_s[ 8 ] := $00; //DATA LENGTH T> BUF_s[ 9 ] := $13; //DATA LENGTH
T> {uuid}
T> BUF_s[ 10 ] := $6B; BUF_s[ 11 ] := $01; BUF_s[ 12 ] := $CB; BUF_s[ 13 ] := $31; T> BUF_s[ 14 ] := $41; BUF_s[ 15 ] := $06; BUF_s[ 16 ] := $11; BUF_s[ 17 ] := $D4; T> BUF_s[ 18 ] := $9A; BUF_s[ 19 ] := $77; BUF_s[ 20 ] := $00; BUF_s[ 21 ] := $50; T> BUF_s[ 22 ] := $DA; BUF_s[ 23 ] := $3F; BUF_s[ 24 ] := $47; BUF_s[ 25 ] := $1F;
T> 25 плюс нулевой байт в итоге имеем 26 байт. Или все таки что то не так.
Я говорю про функцию recv( Sock, BUF_R, 26, 0 );
Откуда здесь 26???
K>>Вот у меня вопросы. K>>[list] K>>Что за устройство с которым ты работаешь? T> Мобильный телефон — Siemens s35
Сименсы самые нормальные в этом отношении телефоны (по-моему). У меня самого S65 (а есть и M45, M50, CF65). И все работают (в смысле OBEX).
K>>Есть ли у тебя программа вообще какая нибудь, которая с ним работает? То есть ты вообще видел сам чтобы с ним ктонибудь работал? T> Обмен между ним и ещё одним мобильником проиходит — обменивался картинками.
При обмене между мобильниками используется OBEX Push! А не OBEX folder-listing. OBEX Push сервер принимает объект и ложит в папку по-умолчанию. Он не выдает список файлов по запросу. Другой вопрос что если поддерживается сервис OBEX Push то и как правило OBEX folder-listing. Но это разные сервисы понимаешь?
K>>Если да, может ли твоё устройство работать по COM порту? Если да, то можно подглядеть что там работающая программа посылает в порт. Я например, довольно долго этим занимался, потому что все производители вставляюта T>свои особенности в протокол. T>если не секрет, не подскажите какими программами можно просматривать, что отправляется в порт.
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, kiborg,:
T>Извиняюсь за настойчивость, но неподскажите как можно просмотреть списки какталогов в телефоне, записать файл на телефон, скопировать файл файл с телефона на ПК.
Соответственно программами. Но для разных моделей разные.
Например Sumsung вообще OBEX не поддерживает. Всё через AT комманды. Их ещё узнать надо. И даже родной софт у них к одним подходит, к другим нет.
Вот Сименсы самые нормальные. OBEX поддерживают с самых ранних моделей.
Даже самая старая программа (dataexchangesoftware) называетсяя (опять же повторюсь поиск рулит!) работает со всеми моделями.
Для Сименсов ещё могу SiMoCo посоветовать.
Тут по моему http://www.siemens-club.ru/soft.php
Ну соответственно другие модели другие программы.
Всем привет.
Пишу программу на д7 по обмену данными между пк и мобилкой на основе ик порта. Работаю через сокеты.
Набросал пример в котором инициализируется финсокет, создается сокет, и вытягивются данные о модели телефона.
Но вот подключться к телефону по обексу не получается.
Господа программеры помогите разобраться в пробеле.
if pbuf.numDevice = 0 then
List.Items.Add( 'Mibile device NOT FOUND......' )
else
for i := 0 to pbuf.numDevice — 1 do
begin
Name := '';
DEV_INFO_0 := pbuf.Device[ i ];
for j := 0 to 22 do
Name :=Name + DEV_INFO_0.irdaDeviceName[ j ];
List.Items.Add( 'Device ' + inttostr( i + 1 ) + '....' + Name );
List.Items.Add( '..............................' );
end;
Здравствуйте, Tsnok, Вы писали:
T>Всем привет. T>Пишу программу на д7 по обмену данными между пк и мобилкой на основе ик порта. Работаю через сокеты. T>Набросал пример в котором инициализируется финсокет, создается сокет, и вытягивются данные о модели телефона. T>Но вот подключться к телефону по обексу не получается. T>Господа программеры помогите разобраться в пробеле.
Для того чтобы законнектиться по OBEX SOCKADDR_IRDA ддолжна быть.
Проблема в том, что структура адреса и имя сервиса у меня определено.
Сам пишу на дельфи и с C почти незнаком.
Пример ( хотя бы общие вещи ) на дельфи не подкинешь.
Открыть сокет мне удалось, мобильник определяет подключение.
Возникли следующие вопросы, если несложно,
1. Как можно прочитать каталоги с файлами.( и вообще как работать с каталогами )\\ например"image/jpeg"
2. Как можно задать скорость соединения.
Здравствуйте, kiborg, Вы писали:
K>т.е. ты должен послать такую последовательность в порт
Я кончно извиняюсь за глупый вопрос, но как связать сокет и порт.
И какими функциями можно воспользоваться для отправки в порт, и чтения из порта. \\предполагаю что сенд и ресайв, но неуверен.
Здравствуйте, kiborg, Вы писали:
>> // opcode|length |version|flag|packsize|HI|data length|data(uuid) >> // 80 | 001A |10 |00 |0x2000 |46|0013 |6B01CB31410611D49A770050DA3F471F >> Всё это описано в спецификации на протокол OBEX
>> А устройств должно тебе ответить тоже пачкой байтов которую нужно "расшифровать". >> Вот пример из того файла.
>> Client Request: bytes Meaning >> Opcode 0x80 CONNECT, Final bit set >> ..........
Попытался реализовать OBEX сессию, но возникли проблемы.
Посмотрел доку по OBEX, и попробывал открыть сессию ... при передаче данных инфракрасник начинает сильнее моргать примерно на 150 милисекунд, а затем как обычно, в режиме ожидания, но в буфере который читает полученную информацию ничего нет.
ПОдскажите, что не так делаю ... ?
\\при отрпавке сокет создан + установлен коннект с мобилкой( мобила информирует об установленном соединении )
... T>Попытался реализовать OBEX сессию, но возникли проблемы.
T> BUF_S : array [ 0 .. 4096 ] of Char;
T> Buf_s[ 0 ] := chr( $80 ); T> Buf_s[ 1 ] := chr( $001A ); T> Buf_s[ 2 ] := chr( $10 ); T> Buf_s[ 3 ] := chr( $00 ); T> Buf_s[ 4 ] := chr( $0800 ); T> Buf_s[ 5 ] := chr( $70 ); T> Buf_s[ 6 ] := chr( $13 ); T> send( Sock, BUF_S, length( BUF_S ) + 1, 0 ); T> Sleep( 500 ); T> recv( Sock, BUF_SND, length( BUF_SND ) + 1, 0 );
T> Посмотрел доку по OBEX, и попробывал открыть сессию ... при передаче данных инфракрасник начинает сильнее моргать примерно на 150 милисекунд, а затем как обычно, в режиме ожидания, но в буфере который читает полученную информацию ничего нет.
T>ПОдскажите, что не так делаю ... ?
Все не так http://64.233.183.104/search?q=cache:RPbQFs0ZwvsJ:www.pocketpcdn.com/articles/obex.html+obex+cpp&hl=ru — рабочий код чтения/записи через IrDA OBEX
Надо прочитать и перестать глупости спрашивать.
T>\\при отрпавке сокет создан + установлен коннект с мобилкой( мобила информирует об установленном соединении )
T>Благодарю за помощь!
Здравствуйте, Tsnok, Вы писали:
T>Всем привет. T>Пишу программу на д7 по обмену данными между пк и мобилкой на основе ик порта. Работаю через сокеты. T>Набросал пример в котором инициализируется финсокет, создается сокет, и вытягивются данные о модели телефона. T>Но вот подключться к телефону по обексу не получается. T>Господа программеры помогите разобраться в пробеле.
T>GLOB VAR T> WSAData_ : WSAdata; T> Sock : TSocket; T> devlist : PWINDOWS_DEVICELIST; T> irADRR : SOCKADDR_IRDA;
T> var T> buf: array[ 0..4096 ]of char; T> temp: integer; T> res: integer; T> pbuf: PWINDOWS_DEVICELIST; T> DEV_INFO_0 : _windows_IRDA_device_info; T> i,j : longint; T> Name : string; T> time : longint; {debug var} //\\\\\\\\\\\
T> is_rec : IAS_SET; //irADRR : TirDASockADRR ;// = ( AF_IRDA,0,0,0,0,''#0'' );
T> tmp : longint; T>begin T> Sock:= Socket( AF_IRDA, SOCK_STREAM, 0);
T> temp := 4096; T> res := getsockopt(Sock, SOL_IRLMP, IRLMP_ENUMDEVICES, buf, temp); T> pBuf := @buf;
T> irADRR.irdaAddressFamily := AF_IRDA; T> for i := 0 to 4 do T> irADRR.irdaDeviceID[ i ] := pbuf.numDevice; T> irADRR.irdaServiceName := 'IrDA:IrCOMM'; T> tmp := connect( Sock, TSockAddr(( @irADRR )^), sizeof( irADRR ) );
T> List.Items.Add( 'Count found device"s...' + IntToStr( pbuf.numDevice ) ); // List.Items.Add( PCHAR( DEV_INFO_0.irdaDeviceID ) );
T> if pbuf.numDevice = 0 then T> List.Items.Add( 'Mibile device NOT FOUND......' ) T> else T> for i := 0 to pbuf.numDevice — 1 do T> begin T> Name := ''; T> DEV_INFO_0 := pbuf.Device[ i ];
T> for j := 0 to 22 do T> Name :=Name + DEV_INFO_0.irdaDeviceName[ j ]; T> List.Items.Add( 'Device ' + inttostr( i + 1 ) + '....' + Name ); T> List.Items.Add( '..............................' ); T> end;
T>ЗЫ T>Благодарю за помощь!
Уважаемый Tsnok, столкнулся с такой же задачей (связать телефон с компом по ИК). Только у меня успехов еще меньше
Я так же как и Вы дружу больше с Делфи чем с Си. Если вы добились каких-либо результатов — помогите мне. Во-первых, что надо подключить чтобы хотябы приведенный вами код давал признаки жизни? а если можете, не могли бы вы выложить полный листинг. (обещаю использовать только в ознакомительных целях ) Благодарю!
Здравствуйте, Tsnok, Вы писали:
T>Подключи winsock. T>Если закончу свой труд( — надеюсь на это ), скорее всего выложу
WinSock я подключил. У меня ругается вот так:
[Error] Unit1.pas(24): Undeclared identifier: 'PWINDOWS_DEVICELIST'
[Error] Unit1.pas(25): Undeclared identifier: 'SOCKADDR_IRDA'
по-моему, надо подключить что-то типа af_irda.h в Си
Здравствуйте, Mickey_Mouse, Вы писали:
M_M>Здравствуйте, Tsnok, Вы писали:
T>>Подключи winsock. T>>Если закончу свой труд( — надеюсь на это ), скорее всего выложу
M_M> WinSock я подключил. У меня ругается вот так:
M_M> [Error] Unit1.pas(24): Undeclared identifier: 'PWINDOWS_DEVICELIST' M_M> [Error] Unit1.pas(25): Undeclared identifier: 'SOCKADDR_IRDA' M_M>по-моему, надо подключить что-то типа af_irda.h в Си
из ддк бери заголовочный файл, портируй под д, и подключай в проектте ...
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, Mickey_Mouse, Вы писали:
M_M>>Здравствуйте, Tsnok, Вы писали:
T>>>Подключи winsock. T>>>Если закончу свой труд( — надеюсь на это ), скорее всего выложу
M_M>> WinSock я подключил. У меня ругается вот так:
M_M>> [Error] Unit1.pas(24): Undeclared identifier: 'PWINDOWS_DEVICELIST' M_M>> [Error] Unit1.pas(25): Undeclared identifier: 'SOCKADDR_IRDA' M_M>>по-моему, надо подключить что-то типа af_irda.h в Си
T>из ддк бери заголовочный файл, портируй под д, и подключай в проектте ...
Извини если кажусь бронелобым, но не мог бы ты с этого места поподробней немного.
1. Ссылка на заголовочный файл (не могу найди в ддк)
2. Как его отпортировать под делфу?
Здравствуйте, Mickey_Mouse, Вы писали:
M_M>Перевел af_irda.h в делфовый формат (pas) утилкой c2pas32 M_M>но что дальше делать — не знаю. M_M> хелп!
положи в свой проект,( я надеюсь ты её проправил .т.к. эта утилита работает "немного грубо" ) подключи, и начинай писать, создай сокет, и попробуй сделать коннект. В общем смотри посты повыше.
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, Mickey_Mouse, Вы писали:
M_M>>Перевел af_irda.h в делфовый формат (pas) утилкой c2pas32 M_M>>но что дальше делать — не знаю. M_M>> хелп!
T>положи в свой проект,( я надеюсь ты её проправил .т.к. эта утилита работает "немного грубо" ) подключи, и начинай писать, создай сокет, и попробуй сделать коннект. В общем смотри посты повыше.
T>Удачи
Блин, чето эта утилка плохо перевела с-шный код в пас. теперь ошибки только в нем. ты бы не мог выложить готовый (исправленный) af_irda.pas?
заранее очень благодарю
Здравствуйте, kiborg, Вы писали:
K>В Buf_s[ 0 ] должно быть число $80.
все дело в том, что раньше не приходилось работать с подобной системой представления и преобразования информации ;(.
поэтому не очень получается.
Buf_s[ 2 ] := $10 ; //version
Buf_s[ 3 ] := $00 ; //flag
Buf_s[ 4 ] := $20 ; //packsize
Buf_s[ 5 ] := $00 ; //packsize
Buf_s[ 6 ] := $46 ; //HI
Buf_s[ 7 ] := $00 ; //data length
Buf_s[ 8 ] := $13 ; //data length
K>А где у тебя uuid сервиса OBEX для которого выполняется операция???
а вот с этим большая проблема, как правильно можно uuid поместить в буфер
Buf_s[ 9 ] := $6B01CB3 ;
Buf_s[ 10 ] := $1410611 ;
Buf_s[ 11 ] := $D49A770 ;
Buf_s[ 12 ] := $050DA3F4 ;
Buf_s[ 13 ] := $71F ;
K>А этого тем более не может быть потому что показано что должно быть 7 байт в пакете, а ты привел 6.
он возвращает семь байт просто там нули 00, и я их не стал писать ...
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, Mickey_Mouse, Вы писали:
M_M>>Перевел af_irda.h в делфовый формат (pas) утилкой c2pas32 M_M>>но что дальше делать — не знаю. M_M>> хелп!
T>положи в свой проект,( я надеюсь ты её проправил .т.к. эта утилита работает "немного грубо" ) подключи, и начинай писать, создай сокет, и попробуй сделать коннект. В общем смотри посты повыше.
T>Удачи.
Друг, ну помоги. Хреново перевелся в делфу заголовочный файл. а отладить не получается. все стоит на месте. короче я в ступоре. подгони пожалуйста нормаольный заголовочный делфовый файлик af_irda.
Обчень благодарю!
... M_M>Друг, ну помоги. Хреново перевелся в делфу заголовочный файл. а отладить не получается. все стоит на месте. короче я в ступоре. подгони пожалуйста нормаольный заголовочный делфовый файлик af_irda.
Больше проблем нет?
M_M>Обчень благодарю!
Здравствуйте, Mickey_Mouse, Вы писали:
M_M>Хреново перевелся в делфу заголовочный файл. а отладить не получается. все стоит на месте. короче я в ступоре. подгони пожалуйста нормаольный заголовочный делфовый файлик af_irda. M_M>Обчень благодарю!
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, Mickey_Mouse, Вы писали:
M_M>>Хреново перевелся в делфу заголовочный файл. а отладить не получается. все стоит на месте. короче я в ступоре. подгони пожалуйста нормаольный заголовочный делфовый файлик af_irda. M_M>>Обчень благодарю!
T>Давай мыло.
scorp@bvkt.kiev.ua
Заранее огромное данке!
изучил ваши замечания и по попробывал реализовать фомирование пакета с учетом все выше рассмотренного, но все равно в ответ отклик неважнецкий 17 10 04 80
то в этом случае в ответ вываливается мусор, что в полне логично.
Вот.
По поводу длинны
View_BUF_SND.AppendBuffer( @BUF_S, 26 );
,,,,,,,
когда пробую просмотреть свой сформированный пакет вижу запрошенные 26 байт, судя по всему столько же отправляется в телефон,
вот то что отображается в буфере
объясните если несложно, почему струтура пакета отличается от той что была задана, если я определил, что весь пакет заполнен данными а здесь только 6 байт в перемешку с нулями.
if send( Sock, BUF_S, 26 , 0 ) = SOCKET_ERROR then
,,,,,,,
В общем, сделал я нормальную структуры отправки, т.е. 80 00 1А и.т.д, но вот на счет правильности пакета у меня все равно сомнения, отклик получаю какой то не такой уже и пример из доки по обексу пробывал все равно не катит ..... подскажите пожалуйста в чем ошибка, даже не знаю чего делать
Здравствуйте, kiborg,
T>Если при задании структуры адреса T>указать следующее
T> irADRR.irdaAddressFamily := AF_IRDA; T> irADRR.irdaServiceName := 'OBEX'; T> и т.д.
T>и при этом послать в порт, что угодно получаю следующий отклик A0 00 07 10 00 и т.д. >А это что-то не логично. Как это что угодно? Что если полсать скажем один байт на пример $00, >то всё равно получишь то что ты написал? >И кстати A0 00 07 10 00 и т.д. это ведь успешный отклик. Еслиб ты всё написал можно точно сказать, а так >начало неплохое...
\Это действительно так. Если описать имя сервиса ОБЕКС, и послать в порт что угодно хот $00 то в ответ получаетм именно такой отклик. Если интересно то могу скинуть исходные коды, убедитесь сами.
T>> if send( Sock, BUF_S, 26 , 0 ) = SOCKET_ERROR then T>> ,,,,,,,
T>> recv( Sock, BUF_R, 26, 0 ); K>Это по-прежнему не правильнро. Стратегию я описывал раньше. С какого потолка ты получаешь 26 байт?
BUF_s[ 0 ] := $80;
25 плюс нулевой байт в итоге имеем 26 байт. Или все таки что то не так.
T>> View_BUF_RCV.AppendBuffer( @BUF_R, 26 ); T>> ,,,,,,,
K>Вот у меня вопросы. K>[list] K>Что за устройство с которым ты работаешь?
Мобильный телефон — Siemens s35
K>Есть ли у тебя программа вообще какая нибудь, которая с ним работает? То есть ты вообще видел сам чтобы с ним ктонибудь работал?
Обмен между ним и ещё одним мобильником проиходит — обменивался картинками.
K>Если да, может ли твоё устройство работать по COM порту? Если да, то можно подглядеть что там работающая программа посылает в порт. Я например, довольно долго этим занимался, потому что все производители вставляюта
свои особенности в протокол.
если не секрет, не подскажите какими программами можно просматривать, что отправляется в порт.
K>Пробовал ли ты свой код на других устройствах?
Да, результат аналогичный.
Извиняюсь за настойчивость, но неподскажите как можно просмотреть списки какталогов в телефоне, записать файл на телефон, скопировать файл файл с телефона на ПК.
Здравствуйте, kiborg, Вы писали:
K>Не ну всякое бывает. Только это не правильно. Тут ничего случайного не должно быть.
Я это понимаю. Специальо проверял на нескольких мобилках.
K>Я говорю про функцию recv( Sock, BUF_R, 26, 0 ); K>Откуда здесь 26???
Сделал считывание первых 3 байт, но как можно было предположить первый байт далеко не код операции 17 а потом остальные 10 04. Подскажите, что я неправильно делаю, пакет вроде правильный.
T>> Обмен между ним и ещё одним мобильником проиходит — обменивался картинками. K>При обмене между мобильниками используется OBEX Push! А не OBEX folder-listing. OBEX Push сервер принимает объект и ложит в папку по-умолчанию. Он не выдает список файлов по запросу. Другой вопрос что если поддерживается сервис OBEX Push то и как правило OBEX folder-listing. Но это разные сервисы понимаешь?
Не подскажите как можно просмотреть содежимое телефона, тоесть картинки и пр. Если несложно не поделитесь примером на С.
K>>Я говорю про функцию recv( Sock, BUF_R, 26, 0 ); K>>Откуда здесь 26??? T>Сделал считывание первых 3 байт, но как можно было предположить первый байт далеко не код операции 17 а потом остальные 10 04. Подскажите, что я неправильно делаю, пакет вроде правильный.
Как я уже писал запускай рабочие программы, и смотри что они шлют.
Если программа какая нибудь работает, значит ты что-то не так делаешь.
T>>> Обмен между ним и ещё одним мобильником проиходит — обменивался картинками. K>>При обмене между мобильниками используется OBEX Push! А не OBEX folder-listing. OBEX Push сервер принимает объект и ложит в папку по-умолчанию. Он не выдает список файлов по запросу. Другой вопрос что если поддерживается сервис OBEX Push то и как правило OBEX folder-listing. Но это разные сервисы понимаешь? T>Не подскажите как можно просмотреть содежимое телефона, тоесть картинки и пр.
В спецификации всё написано.
посылаешь соответствующую команду чтения каталога, устройство тебе возвращает список папок\файлов.
Хочешь перейдти в другой каталог, посылаешь соответствующую комманду перехода с именем каталога и опять читаешь содержимое.
И так пока не надоест.
T>Если несложно не поделитесь примером на С.
Не сложно, не поделюсь. Коммерческая тайна.
Да и зачем тебе, ты сначала открой OBEX сессию.
Здравствуйте, kiborg, Вы писали:
T>>Если несложно не поделитесь примером на С. K>Да и зачем тебе, ты сначала открой OBEX сессию.
Я хочу попытаться при отклике
irADRR.irdaAddressFamily := AF_IRDA;
irADRR.irdaServiceName := 'OBEX';
на следующую структуру. отклик вроде как по доке.
Это не пример того чего товарищь хочет. Здесь просто пихается файл в устройство используя сервис OBEX Push (чего тут не сказано кстати).
K>>Да и зачем тебе, ты сначала открой OBEX сессию.
Здравствуйте, Tsnok, Вы писали:
T>Здравствуйте, kiborg, Вы писали:
T>>>Если несложно не поделитесь примером на С. K>>Да и зачем тебе, ты сначала открой OBEX сессию. T>Я хочу попытаться при отклике T> irADRR.irdaAddressFamily := AF_IRDA; T> irADRR.irdaServiceName := 'OBEX'; T>на следующую структуру. отклик вроде как по доке.
Не ну если ты такой настырный...
Готовый код выкладывать не буду, а то тебе не интересно будет.
Но вот описание
//---------------------------------------------------------------------------
// Прочитать текущую директорию на устройстве
//
// 0x83 - Команда 83h для Чтение объекта.
// 0xXX \ - Два байта с указанием длины этого пакета.
// 0xXX /
// 0x42 - параметр OBEX_HDR_TYPE (42h) тип запрашиваемого объекта
// 0xXX \ - Два байта с указанием длины
// 0xXX /
// 0xXX..XX - "x-obex/folder-listing" запрос списка файлов
// Пдробности см. в спецификации
Ответ делжен быть SUCCES или если пакет разбит на части то CONTINUE и его нужно дочитать.
// Ответ:
// code | длина |идент-ор длины | длина объекта |HI |длина |
// 0x90 - CONTINUE | XXXX | 0xC3 |0xXXXXXXXX |0x48-Body|0xXXXX | тело
// 0xA0 - SUCCES | 0x49 - End-of-Body |0xXXXX | тело
Здравствуйте, kiborg, Вы писали:
K>Здравствуйте, alsemm, Вы писали:
A>>Здравствуйте, kiborg, Вы писали:
A>>...
T>>>>Если несложно не поделитесь примером на С. A>>http://64.233.183.104/search?q=cache:RPbQFs0ZwvsJ:www.pocketpcdn.com/articles/obex.html+obex+cpp&hl=ru K>>>Не сложно, не поделюсь. Коммерческая тайна. A>>нашел чего прятать
K>Это не пример того чего товарищь хочет. Здесь просто пихается файл в устройство используя сервис OBEX Push (чего тут не сказано кстати).
Товаришч хочет чтоб работало, это рабочий пример. Первую часть про то как принять файл с девайса можно пропустить — там описано как запустить OBEX сервер, т.е. как принять файло, если передачу инициирует не PC, а телефон. А вторая часть про то как с PC закинуть файл на телефон, т.е. описано как написать OBEX клиента. Сможет закинуть, сможет и прочитать.
Я правда "закинул" по первости так что все картинки с нокии потерлись но потом вроде работало.
K>>>Да и зачем тебе, ты сначала открой OBEX сессию.
K>>Это не пример того чего товарищь хочет. Здесь просто пихается файл в устройство используя сервис OBEX Push (чего тут не сказано кстати). A>Товаришч хочет чтоб работало, это рабочий пример. Первую часть про то как принять файл с девайса можно пропустить — там описано как запустить OBEX сервер, т.е. как принять файло, если передачу инициирует не PC, а телефон. А вторая часть про то как с PC закинуть файл на телефон, т.е. описано как написать OBEX клиента. Сможет закинуть, сможет и прочитать. A>Я правда "закинул" по первости так что все картинки с нокии потерлись но потом вроде работало.
Товаришч хочет (и это разумно) читать файлы и папки удаленного устройства. Переходить в любую папку.
И писать/читать из них.
А передача файла — это частный случай всего того чего он хочет. Это само-собой разумеется.
Здравствуйте, kiborg, Вы писали:
K>>>Это не пример того чего товарищь хочет. Здесь просто пихается файл в устройство используя сервис OBEX Push (чего тут не сказано кстати). A>>Товаришч хочет чтоб работало, это рабочий пример. Первую часть про то как принять файл с девайса можно пропустить — там описано как запустить OBEX сервер, т.е. как принять файло, если передачу инициирует не PC, а телефон. А вторая часть про то как с PC закинуть файл на телефон, т.е. описано как написать OBEX клиента. Сможет закинуть, сможет и прочитать. A>>Я правда "закинул" по первости так что все картинки с нокии потерлись но потом вроде работало.
K>Товаришч хочет (и это разумно) читать файлы и папки удаленного устройства. Переходить в любую папку. K>И писать/читать из них. K>А передача файла — это частный случай всего того чего он хочет. Это само-собой разумеется.
IMHO c ног на голову ты все поставил.
Tsnok попросил пример кода на С, что и получил. Дальше пусть сам разбирается, там разжевано все.
K>>А передача файла — это частный случай всего того чего он хочет. Это само-собой разумеется. A>IMHO c ног на голову ты все поставил.
A>Tsnok попросил пример кода на С, что и получил. Дальше пусть сам разбирается, там разжевано все.
А это не важно, что это не то что он просил?
Здравствуйте, kiborg, Вы писали:
K>>>А передача файла — это частный случай всего того чего он хочет. Это само-собой разумеется. A>>IMHO c ног на голову ты все поставил.
A>>Tsnok попросил пример кода на С, что и получил. Дальше пусть сам разбирается, там разжевано все. K>А это не важно, что это не то что он просил?
Человеку нужен код, который можно собрать и запустить и чтоб он чего-то сделал близкое к тому что он хочет.
Дальше отладчиком посмотрит как оно работает и решит по аналогии свою задачу.
K>Вообще-то в Сети есть и более интересные примеры, стоит только пять минут поискать: K>http://prdownloads.sourceforge.net/openobex/openobex-1.0.1.tar.gz?download K>или K>http://chaos.allsiemens.com/siefs/
Тут надо перелопатить гору кода, прежде чем доберешься до сути, а там два файла по 300 строк.
Не надо усложнять