Отправьте 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, но я могу запустить его с помощью простого голосового вызова на текущем этапе проекта.

Другие вопросы по тегам