#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. Также добавлен код для обратного чтения из потока, что приводит к ответу: ОШИБКА