Я пытаюсь отправить bMessage из кода С# на компьютере Win7 на телефон Samsung Note 2. У меня есть 32-битная библиотека Bluetooth, и я использую 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
Я заменил личную информацию с помощью (redacted), но фактический текстовый файл содержит собственные имена и номера. Я нахожусь в Великобритании, поэтому SMS_GSM должен быть прав, насколько мне известно.
Любая помощь будет принята с благодарностью!
Обновление: я установил терминал Bluetooth на целевом телефоне и подтвердил, что сообщение получено, отправив одни и те же данные на виртуальный порт на устройстве, а не на сервер доступа к сообщениям. Не уверен, что это была проблема с терминальной программой, но последняя строка сообщения была добавлена на передний план и пропустила с конца. Я добавил разрыв строки до конца файла, который исправил эту проблему, но до сих пор не радует, когда я отправляю bMessage в MAS.
Я также пробовал несколько различных подходов к записи потоков:
1) удаление обертки обозревателя StreamWriter - тот же результат 2) отправка каждого байта в последовательности из цикла - аналогичный результат, по-прежнему нет действий на телефоне.
Если есть какие-либо специалисты по коммуникациям Bluetooth, я бы очень признателен за некоторые советы! Не обязательно должен быть доступ к сообщениям для профиля, а не обязательно С#.
Я предполагаю, что моим следующим шагом было бы увидеть, смогу ли я найти современный автомобиль с поддержкой Bluetooth для MAP-сервисов и может подключиться к телефону и, возможно, обнюхать пакеты при использовании аналогичных функций.
03/02/16 - Понюхали пакеты между моим телефоном и новым автомобилем, отправляя/получая сообщения в обоих направлениях, и сравнивали это с обнюхавшими пакетами между моим компьютером/кодом и телефоном (спасибо Android! dev options изначально позволяют пакет BT и смог сбрасывать это в Wireshark для анализа). Мой код использует BluetoothClient, который работает по RFCOMM в стек протокола BT, тогда как автомобиль использует L2CAP. L2CAP - это уровень ниже RFCOMM в стеке BT, а 32Feet имеет эквивалентный L2CapClient для работы на этом уровне. Внедрили это, но это порождает ошибку. Оказывается, хотя L2CAP поддерживается не для всех профилей, которые его используют, и MAP является одним из них.
Я собираюсь ответить на этот вопрос, чтобы дать возможные варианты любому, кто наткнулся на него.