Как отправить данные с устройства USB на DJI SDK? - PullRequest
0 голосов
/ 22 января 2019

Так что это может быть немного основным вопросом, но у меня нет большого опыта в аппаратной части вещей.Я использую DJI Android Mobile SDK для связи с контроллером полета M600 и имею устройство FTDI CU / TTY, которое я пытаюсь отправить информацию туда и обратно.

Это успешно работает для отправки «Hello World» на мое USB-устройство:

//sends data to onboard sdk device
final byte[] helloWorld = "HelloWorld".getBytes();
mFlightController.sendDataToOnboardSDKDevice(helloWorld, new CommonCallbacks.CompletionCallback() {
    @Override
    public void onResult(DJIError djiError) {
        if (djiError != null) {
            showToast(djiError.getDescription());
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(djiError.getDescription(), "sendOnboardErrorFile.txt");
        } else {
            showToast("Hopefully Hello World");
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(helloWorld.toString(), "sendOnboardSuccessFile.txt");
        }
    }
});

Я вижу это, когда запускаю одно из следующих действий в терминале:

screen /dev/cu.usbserial-BLAHBLAH 38400
screen /dev/tty.usbserial-BLAHBLAH 38400

Появляется куча тарабарщины / иероглифы, и затем каждый раз, когда я нажимаю кнопку, вызывающую приведенный выше код DJI, всплывает текст «Hello World».

Теперь я хочу получить обратную сторону этогоработает, т.е. отправляет что-то обратно с USB на SDI DJI, используя следующее:

if (mFlightController.isOnboardSDKDeviceAvailable()) {
    showToast("Set Onboard SDk Callback");
    mFlightController.setOnboardSDKDeviceDataCallback(new FlightController.OnboardSDKDeviceDataCallback() {
        @Override
        public void onReceive(byte[] bytes) {
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(bytes.toString(), "onboardCallbackFile.txt");
        }
    });
}

Беда в том, что я никогда не получаю ничего в ответ.

Согласно этот вопрос, я удостоверился, что у меня есть разрешение на чтение на устройстве USB:

chmod o+rw /dev/ttyS1

И я попробовал все виды команд echo и cat (я не знаю, какая из них предназначена для чтения и записи),Они либо говорят, что устройство занято, либо, если нет, они, кажется, открывают порт связи (терминал мигает бесконечно), но на мое устройство ничего не отправляется.

Команды, которые я пробовал:

echo 'HelloTest' > /dev/cu.usbserial-BLAHBLAH

Ничего особенного не происходит, идет к следующей строке терминала

echo 'HelloTest' > /dev/tty.usbserial-BLAHBLAH

Терминал возвращает HelloTest

echo 'HelloTest' < /dev/tty.usbserial-BLAHBLAH

Курсор мигает бесконечно

echo 'HelloTest' < /dev/cu.usbserial-BLAHBLAH

Терминал возвращает HelloTest

cat < /dev/cu.usbserial-BLAHBLAH
cat -v < /dev/tty.usbserial-BLAHBLAH
cat -v > /dev/tty.usbserial-BLAHBLAH
cat -v > /dev/cu.usbserial-BLAHBLAH

Нет такого файла или каталога (я полагаю, мне для этого нужны 2 терминала?)

Вопросы

Это связано сСкорость передачи данных?Я настроил это в DJI Assistant.В чем разница между TTY и CU и Echo и Cat?Я перепробовал все виды комбинаций.Я могу использовать экранную команду с cu и tty.Наконец, что это за простой привет мир, который я могу отправить обратно на SDK, чтобы увидеть, что я на самом деле получаю данные с моего USB-устройства?Я думаю, что эхо будет успешным, но я ничего не получаю.

Редактировать

Я почти чувствую, что мне нужно использовать что-то вроде usb-serial-для-андроида ;Тем не менее, я не подключаю USB-устройство к моему устройству Android.Вместо этого я подключаюсь к контроллеру DJI RC, который подключается к Lightbridge / M600, который подключается через порт API к моему USB-устройству.

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Если у вас есть устройство FTDI, вам нужен драйвер FTDI.:)

Вы случайно установили что-то подобное?https://www.ftdichip.com/FTDrivers.htm

Для эмуляции последовательного порта через USB требуется программное обеспечение виртуального последовательного порта.

0 голосов
/ 13 марта 2019

Полагаю, вам нужно понимать DJI OpenProtocol, чтобы это работало.«Куча тарабарщины» на самом деле проблема здесьЭта тарабарщина - это протокол, который беспилотники DJI используют для правильной ретрансляции связи.

Для отправки с «Встроенного» на «Мобильный» с последним кодом вам необходим идентификатор 0xFE CMD_Set в качестве заголовка ваших данных:

https://developer.dji.com/onboard-sdk/documentation/protocol-doc/open-protocol.html

Итак, либо определите правильный формат ваших данных, либо купите дешевый ПК и установите OSDK.

0 голосов
/ 24 января 2019

Я также сталкивался с этой проблемой некоторое время назад, используя Matrice M100 с ROS onboardSDK.

if (mFlightController.isOnboardSDKDeviceAvailable()) {
    showToast("Set Onboard SDk Callback");
    mFlightController.setOnboardSDKDeviceDataCallback(new FlightController.OnboardSDKDeviceDataCallback() {
        @Override
        public void onReceive(byte[] bytes) {
            WriteFileAppendAsync writeAppend = new WriteFileAppendAsync();
            writeAppend.execute(bytes.toString(), "onboardCallbackFile.txt");
        }
    });
}

Где ты это называешь? Вот как я решил свою проблему: я написал функцию:

private void addCallback()
{
        mFlightController.setOnboardSDKDeviceDataCallback(new 
         FlightController.OnboardSDKDeviceDataCallback() {
            @Override
            public void onReceive(byte[] bytes) {
                // Do stuff with the data here..
            }
        });
}

Тогда в моем onResume методе я сделал что-то вроде:

@Override
    public void onResume() {
        Log.e(TAG, "onResume");

        super.onResume();
        if (mFlightController != null) {
            addCallback();
        }
    }

Это не самый элегантный способ, но, похоже, он помог мне. Вы можете найти мое решение здесь . Хотя я давно над этим работал!

...