Набор по Bluetooth с 32 футами.сеть и c#

#c# #mobile #bluetooth #telephony

#c# #Мобильный #bluetooth #телефония

Вопрос:

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

Я действительно ничего не делал с 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 0000000000rn";
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
  

Кажется, нет кодов ошибок или чего-то еще.

Завершение редактирования ———————————————

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

Отправленная команда: НА CMER r

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

затем

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

Результат: CIN: («service»,(0-1)),(«call»,(0-1)),(«callsetup»,(0-3)),(«battchg»,(0-5)),(«signal»,(0-5)),(«roam»,(0-1)),(«callheld»,(0-2))

затем

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

Результат: OK D: («service»,(0-1)),(«call»,(0-1)),(«callsetup»,(0-3)),(«battchg»,(0-5)),(«signal»,(0-5)),(«roam»,(0-1)),(«callheld»,(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 CMERr";
        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   "nr----------nr"   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   "nr----------nr"   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   "nr----------nr"   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   "nr----------nr"   System.Text.Encoding.ASCII.GetString(sRes);

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

Комментарии:

1. Ага. Когда я подключаюсь к своему телефону wm6, соединение RFCOMM с HF закрывается сразу после его открытия, и когда я пробую это с iPhone, я вижу результат ОШИБКИ для команды ATD.

2. Возможно ли отправлять команды набора через любые другие профили Bluetooth, если используется профиль HF, а профиль последовательного порта недоступен. Например, AVRCP, A2DP или PBAP? Я знаю, что они предназначены для других целей, но возможно ли это?

3. Если введено более 39 символов или где-либо в командной строке обнаружена синтаксическая ошибка, модем возвращает код результата ОШИБКИ, и ввод команды игнорируется. Значит, синтаксическая ошибка? что не так с моей командой ATD?

4. Просто к сведению, в разных стеках… MSFT имеет SCO API на уровне драйвера, но каждый пакет должен обрабатываться AFAICS. Widcomm имеет API «использовать аудио». API BlueSoleil поддерживает HFP / HSP как AG, так и HS, поэтому имеет функцию, называемую Btsdk_HFAP_Dial, например. Итак, если вы можете изменить стек, попробуйте сначала BlueSoleil, затем Widcomm.

5. Отличная штука! Возможно, сейчас это не имеет значения, или, возможно, для некоторых телефонов: я просто обратил внимание, что часто на телефоне есть одна зарегистрированная гарнитура, и, возможно, телефон нужно настроить для использования с ПК (и, таким образом, нужно будет запустить BluetoothListener для гарнитуры на ПК).

Ответ №1:

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

Комментарии:

1. Спасибо. AT r возвращается при OK… ATH r возвращает ОШИБКУ, как и ATDxxxxxxxxxx r

2. попробуйте ATDxxxxxxxxxx; r точка с запятой в конце используется для голосового вызова, для проверки попробуйте отправить SMS с помощью AT-команд

3. Я вернул точку с запятой в конец строки набора, как и в начале, плюс добавил другие команды, и теперь набор выполняется так, как ожидалось. Спасибо. 🙂

Ответ №2:

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

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

Комментарии:

1. Спасибо. С тех пор я пытался добавить возврат каретки в конец команды AT, но по-прежнему безуспешно.

2. Также добавлен код для обратного чтения из потока, что приводит к ответу: ОШИБКА