import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import javax.bluetooth.*;
import java.io.*;
import javax.microedition.io.*;
import java.net.URI;
/**
*
* Minimal Services Search example.
*/
public class OOBDFlash {
public static void main(String[] args) {
String downloadURL = "https://github.com/stko/oobd/blob/master/interface/Designs/CORTEX/STM32F103C8_Eclipse_GCC/D2/flashfiles/AllinOne/Flashloader_Package.zip?raw=true";
String flashFileName = "";
String dongleMAC = "";
File tempDownloadFile = null;
//parsing the command line
if (args.length > 0) { //Arguments?
if (args.length % 2 != 0) { //as the arguments are always pairs, the number of args must be even
usage();
}
for (int i = 0; i < args.length; i += 2) {
if ("-l".equalsIgnoreCase(args[i])) {
downloadURL = new File(args[i + 1]).toURI().toString();
} else {
if ("-u".equalsIgnoreCase(args[i])) {
downloadURL = args[i + 1];
} else {
if ("-f".equalsIgnoreCase(args[i])) {
flashFileName = args[i + 1];
} else {
if ("-d".equalsIgnoreCase(args[i])) {
dongleMAC = "btspp://" + args[i + 1] + ":1;authenticate=false;encrypt=false;master=false";
} else {
System.err.println("unknown option: " + args[i]);
usage();
}
}
}
}
}
}
// No local firmware file given? Then we need to download it
if (flashFileName.equalsIgnoreCase("")) {
try {
tempDownloadFile = File.createTempFile("OOBD_Firmware_Download", ".zip");
} catch (IOException ex) {
ex.printStackTrace();
System.err.println("Error: can not create temporary download file - Terminating..");
System.exit(1);
}
if (OOBDFileHandler.download(downloadURL, tempDownloadFile.getAbsolutePath())) {
OOBDFileHandler.getFilelist("", 0);
} else {
System.err.println("Error: can not download firmware Archive from " + downloadURL + " - Terminating..");
System.exit(1);
}
}
if (dongleMAC.equalsIgnoreCase("")) { // no Dongle MAC given? So we are interactive
// First run RemoteDeviceDiscovery and use discoved device
Vector < OOBDDongleDescriptor > serviceFound = new Vector < OOBDDongleDescriptor > ();
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String cmd = "d";
while (!cmd.equalsIgnoreCase("e")) {
if (cmd.equalsIgnoreCase("d")) { //scan for dongles
System.err.print("scan for dongles:");
serviceFound = OobdBtWrapper.discover();
for (int i = 0; i < serviceFound.size(); i++) {
OOBDDongleDescriptor oobdDongleDescr = (OOBDDongleDescriptor) serviceFound.get(i);
System.err.print("d");
if (!OOBDFlashHandler.examine(oobdDongleDescr)) {
serviceFound.remove(i);
i--;
}
OOBDFlashHandler.close();
}
}
System.err.println("\n--------------------------------------------------------\nNr. of Dongles found: " + Integer.toString(serviceFound.size()));
if (serviceFound.size() > 0) {
System.err.println("Select the number of the dongle to flash");
for (int i = 0; i < serviceFound.size(); i++) {
System.err.print("\t" + Integer.toString(i + 1) + ":");
System.err.print("\t" + ((OOBDDongleDescriptor) serviceFound.get(i)).friendlyName);
System.err.print("\t" + ((OOBDDongleDescriptor) serviceFound.get(i)).hardwareID);
System.err.print("\t" + ((OOBDDongleDescriptor) serviceFound.get(i)).revision);
//System.err.print("\t" + ((OOBDDongleDescriptor) serviceFound.get(i)).url);
System.err.println();
}
System.err.println("-or-");
}
System.err.println("Select one of the commands");
System.err.println("\td:\tnew Device discovery");
System.err.println("\te:\tEnd");
System.err.print(">");
try {
cmd = buffer.readLine();
} catch (IOException ex) {
ex.printStackTrace();
}
int device = 0;
try {
device = Integer.parseInt(cmd);
} catch (NumberFormatException ex) {
device = 0;
}
if (device > 0 && device <= serviceFound.size()) {
OOBDDongleDescriptor oobdDongleDescr = (OOBDDongleDescriptor) serviceFound.get(device - 1);
System.err.println("Flashing " + oobdDongleDescr.friendlyName);
if (OOBDFlashHandler.switchToFlashMode(oobdDongleDescr.url)) {
if (flashFileName.equalsIgnoreCase("")) {
if (!OOBDFileHandler.OpenPreferedFirmwareInputStream()) {
System.err.println("Error:Can not read from download archive:" + downloadURL + "- Terminating");
System.exit(1);
}
YModem1K myYModem = new YModem1K();
if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), OOBDFileHandler.getPreferedFirmwareInputStream(), OOBDFileHandler.getPreferedFirmwareName(), OOBDFileHandler.getPreferedFirmwareSize())) {
// if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), fileInputStream, file.getName(), file.length())){
System.err.println("Dongle successfully Flashed!");
}
OOBDFileHandler.ClosePreferedFirmwareInputStream();
} else { // flash local firmware file
FileInputStream fileInputStream = null;
File file = null;
try {
fileInputStream = new FileInputStream(flashFileName);
file = new File(flashFileName);
} catch (IOException ex) {
System.err.println("Error:Can not read local firmware file:" + flashFileName + "- Terminating");
System.exit(1);
}
YModem1K myYModem = new YModem1K();
// if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), OOBDFileHandler.getPreferedFirmwareInputStream(),OOBDFileHandler.getPreferedFirmwareName(), OOBDFileHandler.getPreferedFirmwareSize())){
if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), fileInputStream, file.getName(), file.length())) {
System.err.println("Dongle successfully Flashed!");
} else {
System.err.println("Error: Dongle not flashed :-(");
}
try {
fileInputStream.close();
} catch (IOException ex) {}
}
OOBDFlashHandler.resetDongle();
} else {
System.err.println("Flash mode NOT reached!");
}
OOBDFlashHandler.close();
}
}
} else { //non -interactive mode
if (OOBDFlashHandler.switchToFlashMode(dongleMAC)) {
if (flashFileName.equalsIgnoreCase("")) {
if (!OOBDFileHandler.OpenPreferedFirmwareInputStream()) {
System.err.println("Error:Can not read from download archive:" + downloadURL + "- Terminating");
System.exit(1);
}
YModem1K myYModem = new YModem1K();
if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), OOBDFileHandler.getPreferedFirmwareInputStream(), OOBDFileHandler.getPreferedFirmwareName(), OOBDFileHandler.getPreferedFirmwareSize())) {
// if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), fileInputStream, file.getName(), file.length())){
System.err.println("Dongle successfully Flashed!");
}
OOBDFileHandler.ClosePreferedFirmwareInputStream();
} else { // flash local firmware file
FileInputStream fileInputStream = null;
File file = null;
try {
fileInputStream = new FileInputStream(flashFileName);
file = new File(flashFileName);
} catch (IOException ex) {
System.err.println("Error:Can not read local firmware file:" + flashFileName + "- Terminating");
System.exit(1);
}
YModem1K myYModem = new YModem1K();
// if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), OOBDFileHandler.getPreferedFirmwareInputStream(),OOBDFileHandler.getPreferedFirmwareName(), OOBDFileHandler.getPreferedFirmwareSize())){
if (myYModem.ymodemtransfer(OOBDFlashHandler.getInputStream(), OOBDFlashHandler.getOutputStream(), fileInputStream, file.getName(), file.length())) {
System.err.println("Dongle successfully Flashed!");
} else {
System.err.println("Error: Dongle not flashed :-(");
}
try {
fileInputStream.close();
} catch (IOException ex) {}
}
OOBDFlashHandler.resetDongle();
} else {
System.err.println("Flash mode NOT reached!");
}
OOBDFlashHandler.close();
}
}
static void usage() {
System.err.println("oobdflash - flashes OOBD Dongles easily");
System.err.println("OOBDFlash is part of the OOBD.org tool set");
System.err.println();
System.err.println("Usage:");
System.err.println("java -jar OOBDFlash.jar [-d BT-MAC] [-f firmwarefile | -u Download-URL | -l Archivefile]");
System.err.println();
System.err.println("Options:");
System.err.println();
System.err.println("-d BT-MAC : Uses given Dongle Bluetooth MAC address (Format: 12 char hex string: 00112233445566) to contact Dongle");
System.err.println("if not given, device discovery is started");
System.err.println();
System.err.println("-f firmwarefile : Uses local firmwarefile to flash");
System.err.println("if not given, Firmware archive is downloaded and extracted from Internet");
System.err.println();
System.err.println("-u Download-URL : Uses alternative URL to download firmware archive");
System.err.println("for local files use option -l instead");
System.err.println("if not given, build-in default URL is used");
System.err.println();
System.err.println("-l Archivefile : Uses local file as firmware archive");
System.err.println();
System.exit(0);
}
}