2011-10-18 83 views
2

背景Android應用程序:升級的外部主板

我們創造了一個Android應用程序,目前通過藍牙連接的外部主板通信。該電路板會發出命令,以不同的速度運行一個或多個電機。 (此應用程序專爲航海行業的特定任務而構建)

我們的目標是增強應用程序,以便Android移動用戶(未來)能夠通過在應用程序上發出命令來升級主板的固件通過藍牙連接。

該主板使用舊標準通信協議YMODEMhttp://en.wikipedia.org/wiki/YMODEM主板支持此功能,目前我們能夠在Windows平臺上使用超級終端處理固件升級。

我的問題是

是否有可能使用YMODEM協議在Android應用程序進行重新閃光?

如果是,如何?任何幫助將不勝感激!!感謝您的關注!

回答

7

對遲到的反應抱歉,但它可能有幫助...是的,這是絕對有可能的。我已經用nexus 7和帶有ARM處理器的外部設備完成了這項工作。 nexus 7必須啓用USB調試。我用wugfresh's nexus root工具包 - 這很容易。

接下來(抓住你的座位),你必須編寫你的應用程序來使用YModem協議。一種選擇是使用android NDK(Native開發工具包)編譯用C/C++編寫的YModem協議(嘗試Tixy's)。你需要cygwinmingw在安裝NDK之前,如果你使用Windows。

所以我們假設你使用windows,並且你在c:\android-ndk-r8b-windows\android-ndk-r8b中安裝了NDK。您可以在安裝了adt插件的情況下使用Eclipse,假設您的項目的新工作區是c:\ android-workspace。您可以使用批處理文件來執行NDK從你的項目(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/的文件夾中。下載文件瀏覽器以查看它們。