Отправьте bMessage на сервер доступа к сообщениям из Windows, используя библиотеку 32feet.net в С#

Я пытаюсь отправить 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 является одним из них.

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

Ответ 1

Думаю, я установил, что делать это с помощью 32Feet/С# не будет жизнеспособным. Если вы хотите получить доступ к серверу доступа к Интернету Bluetooth/профилю/клиенту (MAS MAP MAC), вы не сможете сделать это, используя функции высокого уровня в библиотеке 32Feet.Net. Вместо этого вам нужно будет использовать код нижнего уровня на С++, как описано в 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, но может запускаться с простым инициированием голосового вызова для текущего этапа проекта.

Ответ 2

Я пытаюсь добиться того же, что и OP, и я наткнулся на те же проблемы с библиотекой 32feet.

Однако я заметил, что есть приложение на MAC, называемое Handsfree, которое реализует набор и отправку сообщений через Bluetooth. Я использовал журнал регистрации Bluetooth Bluetooth HCI для получения информации о том, как это работает. Журнал можно скачать здесь: https://www.dropbox.com/s/34ol5kd0o3oceib/btsnoop_hci.log?dl=0

В журнале содержится пример отправки сообщений. Также есть сообщение, отправленное по телефону. Надеюсь, это поможет решить проблемы отправки SMS.

Ответ 3

Итак, я сделал еще несколько копаний. Я использовал blucat для сканирования доступных сервисов на моем телефоне. Среди услуг было: "MAP SMS/MMS" - btgoep://980D2E0CFB51: 4. Согласно спецификации MAP, MAP является профильной сборкой поверх протокола OBEX. Таким образом, имеет смысл использовать ссылку OBEX для подключения к этой службе. BTGOEP = общий протокол обмена объектами bluetooth. Я попытался подключиться к MAP, используя ссылку выше, используя bluecove java API, но получил код ответа 198, что означает OBEX_HTTP_NOT_ACCEPTABLE.

Затем я нашел этот пост. Последний ответ: Вы в основном создаете два сеанса OBEX: Служба доступа к сообщениям (MAS), которая затем регистрируется с устройством для получения уведомлений с помощью службы уведомлений о сообщениях (MNS). После регистрации устройство откроет вам сеанс MNS и сообщит вам о входящих сообщениях. Вам также необходимо будет рекламировать свою услугу MNS с помощью Bluetooth SDP.

Итак, я думаю, что я неправильно подключился к службе MAP, и получил код ответа 198. Может быть, есть еще один способ подключения к службе MAP, зарегистрировавшись с телефоном каким-то образом.