Набор Bluetooth с 32feet.net и С#

Я пытаюсь предоставить кому-то решение «щелчок для набора» для устройства Bluetooth, такого как мобильный телефон. Я пытался сделать это с помощью Bluetooth API 32feet.net.

На самом деле я ничего не делал с Bluetooth (со времен at-команд через последовательный порт Bluetooth), но я соединил рассматриваемое устройство, которое поддерживает услугу громкой связи с ПК. У меня есть следующий код, чтобы попытаться подключиться и отправить команду набора номера.

String deviceAddr = "11:11:11:11:11:11";
BluetoothAddress addr = BluetoothAddress.Parse(deviceAddr);
BluetoothEndPoint rep = new BluetoothEndPoint(addr, BluetoothService.Handsfree);
BluetoothClient cli = new BluetoothClient();
cli.Connect(rep);
Stream peerStream = cli.GetStream();

String dialCmd = "ATD 0000000000\r\n";
Byte[] dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd);
peerStream.Write(dcB, 0, dcB.Length);

// Begin Edit ------------------------------------------------------------
Byte[] sResponse = new Byte[100];
peerStream.Read(sResponse, 0, 99);
TextBox1.Text = System.Text.Encoding.ASCII.GetString(sResponse);
// End Edit --------------------------------------------------------------

peerStream.Close();
cli.Close();
MessageBox.Show("Done");

Поскольку кажется, что он проходит через эти строки кода, требуется соответствующее время для подключения в соответствующем месте или происходит сбой, если адрес устройства неверен и он не может подключиться. Очевидно, что AT-команда не подходит для ее отправки.

Может ли кто-нибудь просветить меня относительно того, что мне может понадобиться отправить на устройство Bluetooth через профиль громкой связи, чтобы заставить его набирать номер?

Начать редактирование ----------------------------------------------------------

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

Ответ, который я прочитал из потока:

ERROR

Кодов ошибок и прочего вроде нет.

Конец редактирования ------------------------------------------------------------

Редактировать ------------------------------------------------- -

Отправленная команда: AT+CMER\r

Результат: ОК

тогда

Отправленная команда: AT+CIND=?\r

Результат: +CIND: ("service",(0-1)),("вызов",(0-1)),("callsetup",(0-3)),("battchg",(0-5 )),("сигнал",(0-5)),("роуминг",(0-1)),("удержание вызова",(0-2))

тогда

Отправить команду: ATD 0000000000\r

Результат: OK D: ("service",(0-1)),("call",(0-1)),("callsetup",(0-3)),("battchg",(0-5 )),("сигнал",(0-5)),("роуминг",(0-1)),("удержание вызова",(0-2))

Все равно не звонит :(

Конец редактирования -------------------------------------------------------------

Решение ----------------------------------------------

Следующий код теперь работает для набора номера через мой iPhone. На данный момент это действительно сложно, так как я только что проверял, смогу ли я заставить это работать. Этого достаточно, чтобы начать для всех, кто хочет сделать что-то подобное.

String deviceAddr = "00:00:00:00:00:00"; 
        BluetoothAddress addr = BluetoothAddress.Parse(deviceAddr);
        BluetoothEndPoint rep = new BluetoothEndPoint(addr, BluetoothService.Handsfree);

        BluetoothClient cli = new BluetoothClient();
        cli.Connect(rep);
        Stream peerStream = cli.GetStream();

        String dialCmd1 = "AT+CMER\r";
        String dialCmd2 = "AT+CIND=?\r";
        String dialCmd3 = "AT+BRSF=\r";
        String dialCmd4 = "ATD 0000000000;\r";

        Byte[] dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd1);
        peerStream.Write(dcB, 0, dcB.Length);

        Byte[] sRes = new Byte[200];
        peerStream.Read(sRes, 0, 199);
        textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);

        dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd2);
        peerStream.Write(dcB, 0, dcB.Length);

        peerStream.Read(sRes, 0, 199);
        textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);

        dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd3);
        peerStream.Write(dcB, 0, dcB.Length);

        peerStream.Read(sRes, 0, 199);
        textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);

        dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd4);
        peerStream.Write(dcB, 0, dcB.Length);

        peerStream.Read(sRes, 0, 199);
        textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);

        peerStream.Close();
        cli.Close();

person Tim    schedule 11.05.2011    source источник
comment
Ага. Когда я подключаюсь к своему телефону wm6, соединение RFCOMM с HF закрывается сразу после его открытия, и когда я пытаюсь подключиться к iPhone, я вижу результат ERROR для команды ATD.   -  person alanjmcf    schedule 12.05.2011
comment
Можно ли отправлять команды набора через любые другие профили Bluetooth, если используется профиль HF, а профиль последовательного порта недоступен. Например, AVRCP, A2DP или PBAP? Я знаю, что они для других целей, но возможно ли это?   -  person Tim    schedule 20.05.2011
comment
Если введено более 39 символов или где-либо в командной строке обнаружена синтаксическая ошибка, модем возвращает результирующий код ОШИБКА, а ввод команды игнорируется. Значит, синтаксическая ошибка? что не так с моей командой ATD?   -  person Tim    schedule 24.05.2011
comment
Просто отметим, что в различных стеках ... MSFT имеет SCO API на уровне драйвера, но каждый пакет должен обрабатываться AFAICS. Widcomm имеет API «использовать аудио». API BlueSoleil поддерживает HFP/HSP как для AG, так и для HS, поэтому, например, имеет функцию Btsdk_HFAP_Dial. Поэтому, если вы можете изменить стек, попробуйте сначала BlueSoleil, а затем Widcomm.   -  person alanjmcf    schedule 25.05.2011
comment
Хорошая вещь! Вероятно, сейчас это неактуально, или, может быть, для некоторых телефонов: я просто хотел отметить, что часто в телефоне зарегистрирована одна гарнитура, и, возможно, телефон необходимо настроить для использования ПК (и, следовательно, потребуется запустите BluetoothListener для гарнитуры на ПК).   -  person alanjmcf    schedule 01.06.2011


Ответы (2)


Попробуйте найти ответ на AT\r (или) ATH\r. Если ответ «ОК\r\n», попробуйте выполнить команду набора номера без пробела после ATD и номера.

person Umesh CHILAKA    schedule 23.05.2011
comment
Спасибо. AT\r возвращает AT+OK... ATH\r возвращает ERROR, как и ATDxxxxxxxxxx\r - person Tim; 24.05.2011
comment
попробуйте ATDxxxxxxxxxx;\r точка с запятой в конце предназначена для голосового вызова для проверки попробуйте отправить SMS с помощью AT-команд - person Umesh CHILAKA; 24.05.2011
comment
Я вернул точку с запятой в конец строки набора номера, как и в начале, плюс добавил другие команды, и теперь он набирает, как и ожидалось. Спасибо. :) - person Tim; 25.05.2011

Как сопровождающий 32feet.NET, я хотел бы найти ответ на этот вопрос. Надеюсь, кто-нибудь со знанием HSP/HFP объяснит, почему это не работает. Мое единственное общее предположение состоит в том, что, поскольку мы не принимаем/не создаем канал SCO для аудиоканала, телефон отказывается от соединения.

Однако в вашем случае один раз... AT-команды заканчиваются CR (0Dh); или точка с запятой действует так же??

person alanjmcf    schedule 11.05.2011
comment
Спасибо. С тех пор я пытался добавить возврат каретки в конец AT-команды, но безуспешно. - person Tim; 12.05.2011
comment
Также добавлен код для обратного чтения из потока, что приводит к ответу: ERROR - person Tim; 12.05.2011