背景:
我们创建了一个Android应用程序,目前通过蓝牙连接与外部主板通信。电路板依次发出命令以不同的速度运行一个或多个电机。 (此应用程序是为海洋工业中的特定任务而构建的)
我们的目标是增强应用程序,以便Android移动用户(将来)能够通过在通过蓝牙连接的应用程序上发出命令来升级主板的固件。
主板使用称为YMODEM
的旧标准通信协议。 http://en.wikipedia.org/wiki/YMODEM主板支持此功能,我们目前能够在Windows平台上使用超级终端处理固件升级。
我的问题是:
是否可以在Android应用程序中使用YMODEM协议来执行重新刷新?
如果是,怎么样?任何帮助将不胜感激!!感谢您对此进行调查!
答案 0 :(得分:7)
对迟到的回应道歉,但它可能会有所帮助......是的,这绝对是可能的。我使用nexus 7和带ARM处理器的外部设备完成了这项工作。 nexus 7必须以启用USB调试为根。我使用了wugfresh's nexus root工具包 - 非常简单。
接下来(保持座位),您必须编写应用程序以使用YModem协议。一种选择是使用android NDK(Native开发工具包)编译用C / C ++编写的YModem协议(Try Tixy's)。如果您正在使用Windows,则在安装NDK之前,您需要 cygwin 或 mingw 。
因此,假设您正在使用Windows,并在c:\android-ndk-r8b-windows\android-ndk-r8b
中安装了NDK。您可以在安装了adt插件的情况下使用Eclipse,并且假设您的项目新工作区是c:\ android-workspace。您可以使用批处理文件从项目中执行NDK make(c:\android-workspace\batch.bat
):
C:\android-ndk-r8b-windows\android-ndk-r8b\ndk-build.cmd
PAUSE
只需确保导出C / C ++函数,以便JAVA android应用程序可以使用它们。
Interface.cpp:
#include <string.h>
#include <jni.h>
#include <dirent.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ymodem_tx.h"
#include "ymodem_main.h"
extern "C" {
JNIEXPORT int JNICALL Java_com_example_ymupload_MainActivity_ymodemSent( JNIEnv* env, jobject obj, int portNumber, jstring fileName)
{
int status = 0;
if (portNumber >= 0)
{
const char* input = env->GetStringUTFChars(fileName, 0);
status = ymodem_sentFile(portNumber, input);
env->ReleaseStringUTFChars(fileName, input);
}
else
{
status = 0xFF;
}
return status;
}
JNIEXPORT int JNICALL Java_com_example_ymupload_MainActivity_YmodemGetTotalSize( JNIEnv* env, jobject obj)
{
return ymodem_getTotalSize();
}
JNIEXPORT int JNICALL Java_com_example_ymupload_MainActivity_YmodemGetTransferredSize( JNIEnv* env, jobject obj)
{
return ymodem_getTransferredSize();
}
JNIEXPORT bool JNICALL Java_com_example_ymupload_MainActivity_YmodemIsSending( JNIEnv* env, jobject obj)
{
return ymodem_bIsSending();
}
JNIEXPORT int JNICALL Java_com_example_ymupload_MainActivity_YmodemGetStatus( JNIEnv* env, jobject obj)
{
return ymodem_uGetStatus();
}
JNIEXPORT jstring JNICALL Java_com_example_ymupload_MainActivity_YmodemGetFileName( JNIEnv* env, jobject obj)
{
return env->NewStringUTF(ymodem_pGetFileName());
}
}
还要确保将该文件和其他.c
,.cpp
,.h
文件放在项目文件夹的jni
文件夹中,例如c:\android-workspace\prog-name\jni
以及Android.mk
文件(还有很多关于Android.mk
文件的其他堆栈问题。)
您可以将要闪存的二进制文件放在/sdcard/
的文件夹中。下载文件浏览器以查看它们。