Witam!
Usiłuję połączyć się telefonem z Androidem do urządzenia bazującego na FTDI.
Terminale z marketu Play działają bezproblemowo, a niestety przykład np. "enumerator" z Qt nie wykrywa urządzenia..
Doczytałem że na androidzie FTDI nie działa tak jak na np. linuxie, tzn. nie pojawia się np. /dev/ttyUSB0.
Urządzenie jest całkowicie niewidoczne, a aplikacja potrzebuje "swoje" sterowniki.
Podobno można takie sterowniki pisać w javie. ponieważ Android non-root daje tylko taką możliwość.
Znalazłem projekt "https://github.com/mavlink/qgroundcontrol" gdzie zainteresowało mnie:
# PLIK qgroundcontrol.pro
#-------------------------------------------------------------------------------------
# Android
AndroidBuild {
include($$PWD/libs/qtandroidserialport/src/qtandroidserialport.pri)
message("Adding Serial Java Classes")
QT += androidextras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
OTHER_FILES += \
$$PWD/android/AndroidManifest.xml \
$$PWD/android/res/xml/device_filter.xml \
$$PWD/android/src/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/CommonUsbSerialDriver.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/Cp2102SerialDriver.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/FtdiSerialDriver.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/ProlificSerialDriver.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/UsbId.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/UsbSerialDriver.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/UsbSerialProber.java \
$$PWD/android/src/com/hoho/android/usbserial/driver/UsbSerialRuntimeException.java \
$$PWD/android/src/org/qgroundcontrol/qgchelper/UsbDeviceJNI.java \
$$PWD/android/src/org/qgroundcontrol/qgchelper/UsbIoManager.java
DISTFILES += \
android/gradle/wrapper/gradle-wrapper.jar \
android/gradlew \
android/res/values/libs.xml \
android/build.gradle \
android/gradle/wrapper/gradle-wrapper.properties \
android/gradlew.bat
}
Skopiowałem pliki do projektu, poprawiłem plik *.pro oraz przygotowałem takie źródełko:
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QScrollArea>
#include "qserialport/qserialport.h"
#include "qserialport/qserialportinfo.h"
QT_USE_NAMESPACE
#include <jni.h>
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
Q_UNUSED(reserved);
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
QSerialPort::setNativeMethods();
return JNI_VERSION_1_6;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QVBoxLayout *layout = new QVBoxLayout;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
QString s = QObject::tr("Port: ") + info.portName() + "\n"
+ QObject::tr("Location: ") + info.systemLocation() + "\n"
+ QObject::tr("Description: ") + info.description() + "\n"
+ QObject::tr("Manufacturer: ") + info.manufacturer() + "\n"
+ QObject::tr("Serial number: ") + info.serialNumber() + "\n"
+ QObject::tr("Vendor Identifier: ") + (info.hasVendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString()) + "\n"
+ QObject::tr("Product Identifier: ") + (info.hasProductIdentifier() ? QString::number(info.productIdentifier(), 16) : QString()) + "\n"
+ QObject::tr("Busy: ") + (info.isBusy() ? QObject::tr("Yes") : QObject::tr("No")) + "\n";
QLabel *label = new QLabel(s);
layout->addWidget(label);
}
QWidget *workPage = new QWidget;
workPage->setLayout(layout);
QScrollArea area;
area.setWindowTitle(QObject::tr("Info about all available serial ports."));
area.setWidget(workPage);
area.show();
return a.exec();
}
Dalej nic, funkcja "jint JNI_OnLoad(JavaVM* vm, void* reserved)" się nie odpala, a w znalezionym projekcie nie znalazłem do niej odwołania.
Udało się komuś odpalić serial porta na androidzie w QT?
Co robię źle?