Отправьте bMessage на сервер доступа к сообщениям из Windows, используя библиотеку 32feet.net в C#
Я пытаюсь отправить bMessage из кода C# на ПК с Win7 на телефон Samsung Note 2. У меня есть библиотека Bluetooth на 32 фута, и я использую Visual Studio 2013 Community Edition.
Вот код, который у меня сейчас есть:
string sendMessage = "";
sendMessage = File.ReadAllText(file_path);
BluetoothClient btClient = new BluetoothClient();
btClient.Connect(btEp);
Stream clientStream = btClient.GetStream();
using (StreamWriter utfWriter = new StreamWriter(clientStream, Encoding.UTF8))
{
utfWriter.Write(sendMessage);
}
btEp - это конечная точка Bluetooth, переданная функции для отправки сообщения и определенная в другом месте следующим образом:
BluetoothEndPoint BtEp;
Это построено с использованием переменных:
BtEp = new BluetoothEndPoint(device.DeviceInfo, mapServiceId);
Оба значения берутся из устройства во время выполнения и принимают следующие значения во время выполнения:
- mapServiceId {00001132-0000-1000-8000-00805f9b34fb} System.Guid
+ BtEp {BC20A4164A8C:0000113200001000800000805f9b34fb} InTheHand.Net.BluetoothEndPoint
При этом BC20A4164A8C является адресом устройства, сообщаемым устройством.
Соединение с телефоном работает и работает с правильным сервисом, потому что, когда я выполняю код, телефон спрашивает меня, хочу ли я принять соединение с сервером сообщений с моего компьютера. Это происходит, когда оператор 'btClient.Connect(btEp);' выполнен.
Насколько мне известно, текстовый файл, который я читаю и отправляю на телефон через поток, является правильно отформатированным bMessage, как определено в спецификации Bluetooth MAP и проверено в другом месте. Он построен следующим образом:
BEGIN:BMSG
VERSION:1.0
STATUS:UNREAD
TYPE:SMS_GSM
FOLDER:TELECOM/MSG/OUTBOX
BEGIN:VCARD
VERSION:2.1
N:(redacted)
TEL:(redacted)
END:VCARD
BEGIN:BENV
BEGIN:VCARD
VERSION:2.1
N:(redacted)
TEL:(redacted)
END:VCARD
BEGIN:BBODY
ENCODING:G-7BIT
LENGTH:47
BEGIN:MSG
This is a short message
END:MSG
END:BBODY
END:BENV
END:BMSG
Я заменил личную информацию на (отредактирован), но текстовый файл содержит имена и номера. Я живу в Великобритании, поэтому насколько я знаю, SMS_GSM должен быть верным.
Будем очень благодарны любой помощи!
Обновление. Я установил терминал Bluetooth на целевой телефон и подтвердил, что сообщение принимается, отправив те же данные на виртуальный порт устройства, а не на сервер доступа к сообщениям. Не уверен, что это была проблема с терминальной программой, но последняя строка сообщения добавлялась вперед и пропускалась с конца. Я добавил разрыв строки в конец файла, который исправил эту проблему, но все еще не радует, когда отправляю сообщение bMessage в MAS.
Я также попробовал несколько различных подходов к записи потока:
1) удаление обертки StreamWriter Encoding - тот же результат 2) отправка каждого байта в последовательности из цикла - аналогичный результат, все еще бездействующий на телефоне.
Если есть какие-либо эксперты по Bluetooth, я буду очень признателен за совет! Не обязательно должен быть специфичным для профиля доступа к сообщениям или C#.
Я предполагаю, что моим следующим шагом будет посмотреть, смогу ли я найти современный автомобиль, который имеет Bluetooth-соединение для служб MAP и может подключиться к телефону и, возможно, прослушивать пакеты при использовании аналогичных функций???
02/02/16 - прослушивал пакеты между моим телефоном и новым автомобилем, отправляя / получая сообщения в обоих направлениях, и сравнивал это с прослушиваемыми пакетами между моим ПК / кодом и телефоном (благодаря Android! Опции dev изначально поддерживают протоколирование пакетов BT и были возможность сбросить это в Wireshark для анализа). Мой код использует BluetoothClient, который работает через RFCOMM в стеке протоколов BT, тогда как автомобиль использует L2CAP. L2CAP - уровень ниже RFCOMM в стеке BT, и 32Feet имеет эквивалентный L2CapClient для работы на этом уровне. Реализовали это, но выдает ошибку. Оказывается, что, хотя L2CAP поддерживается, не все профили, которые его используют, и MAP, похоже, один из них.
Я собираюсь ответить на этот вопрос, чтобы дать возможные варианты любому, кто наткнется на него.
3 ответа
Я пытаюсь добиться того же, что и OP, и наткнулся на те же проблемы с библиотекой 32feet.
Однако я заметил, что на MAC есть приложение под названием Handsfree, которое реализует набор номера и отправку сообщений через Bluetooth. Я использовал Android Bluetooth HCI Snoop Log, чтобы понять, как он работает. Журнал можно скачать здесь: https://www.dropbox.com/s/34ol5kd0o3oceib/btsnoop_hci.log?dl=0
Журнал содержит пример отправки сообщения. Также есть сообщение с уведомлением по телефону. Надеюсь, это поможет решить проблемы с отправкой SMS.
Итак, я сделал еще несколько копаний. Я использовал blucat для сканирования доступных служб на моем телефоне. Среди сервисов были: "MAP SMS / MMS" - btgoep: // 980D2E0CFB51: 4. Согласно спецификации MAP, MAP представляет собой профиль, построенный поверх протокола OBEX. Поэтому имеет смысл использовать ссылку OBEX для подключения к этой услуге. BTGOEP = общий протокол обмена Bluetooth-объектами. Я пытался подключиться к MAP, используя ссылку выше, используя API Java Bluecove, но я получил код ответа 198, что означает OBEX_HTTP_NOT_ACCEPTABLE.
Тогда я нашел этот пост. Последний ответ: вы в основном создаете два сеанса OBEX: Служба доступа к сообщениям (MAS), которая затем регистрируется на устройстве для получения уведомлений с использованием службы уведомлений о сообщениях (MNS). Как только вы зарегистрируетесь, устройство откроет сеанс MNS с вами и уведомит вас о входящих сообщениях. Вам также нужно будет рекламировать свою услугу MNS с помощью Bluetooth SDP.
Поэтому я думаю, что я не подключился должным образом к службе MAP и получил код ответа 198. Возможно, существует другой способ подключения к службе MAP, путем регистрации с помощью телефона.
Думаю, я установил, что делать это с помощью 32Feet/C# не будет жизнеспособным. Если вы хотите получить доступ к серверу / профилю / клиенту доступа к сообщениям Bluetooth телефона (MAS MAP MAC), вы не можете сделать это, используя функции высокого уровня в библиотеке 32Feet.Net. Вместо этого вам нужно будет использовать код более низкого уровня в C++, как подробно описано в MSDN:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff536674%28v=vs.85%29.aspx
19/02/16 - Мне удалось использовать ссылку Bluetooth на профиль Hands Free на своем мобильном телефоне, чтобы инициировать вызов (это было что-то еще, что я хотел сделать, но я ошибочно думал, что SMS будет проще!). Я использовал AT-команды для достижения этой цели. Затем я попытался использовать AT-команды для отправки SMS, но, видимо, мой телефон не реализует AT-команды для этого при реализации HFP. Так что до сих пор нет текстовых сообщений.
У меня есть несколько посылок SMS-сообщений по Bluetooth между моим телефоном и автомобилем, поэтому посмотрим, как это будет сделано в какой-то момент. Мне нужно отсортировать SMS, но я могу запустить его с помощью простого голосового вызова на текущем этапе проекта.