對於SerialBuffer類有一點需要說明一下,就是在putChar和getMsg方法前必須加synchoronized關鍵字,這是因為這個類是在多線程中調用,由於在這兩個方法中訪問了共用資源,為了不出現髒資料,因此,必須加這個關鍵字。
readSerial類的實現
package com.message; import Java.io.*; // 這個類從指定的COM口讀資料,並將這些資料儲存在緩衝區中 // ReadSerial是一個線程類 public class ReadSerial extends Thread { private SerialBuffer comBuffer; private InputStream comPort; // 這個方法是ReadSerial類的建構函式,第一個參數將緩衝區傳入類中,第二個參數// 是被開啟的COM口的輸入資料流 public ReadSerial(SerialBuffer serialBuffer, InputStream port) { comBuffer = serialBuffer; comPort = port; } // 調用Thread的start方法後,運行run方法 public void run() { int c; try { while (true) { c = comPort.read(); // 一個字元、一個字元地從COM口讀資料 comBuffer.putChar(c); } } catch (IOException e) {} } }
接下來實現負責通過資料線和手機通訊的類OperateMobile。這個類可以通過send方法控制手機傳送簡訊。
public class OperateMobile
{
private MySerial mySerial;
private static char symbol = 10;
private static char symbol1 = 13;
public static boolean open(int port) {
mySerial = new MySerial(port);
if (mySerial.Initialize() == 1) {
return true;
}
else {
return false;
}
}
// 設定簡訊發送模式
private static boolean setMode(int mode)
String strReturn, strSend = “”;
try {
// 模式字串
strSend = "AT+CMGF=" + String.valueOf(mode) +
String.valueOf(symbol1);
// 將模式通過COM口寫入手機
mySerial.WritePort(strSend);
strReturn = "";
// 從手機讀出長度為6的返回資訊,如果包含“OK”,則說明設定成功
strReturn = mySerial.ReadPort(6);
if (strReturn.indexOf("OK", 0) != -1) {
return true;
}
return false;
}
catch (Exception ex) {
return false;
}
}
public static boolean send (String phoneCode, String msg) {
String strReturn = “”, strSend = “”;
char symbol2 = 34;
char symbol3 = 26;
if (setMode(1) != true) { // 設定簡訊發送模式
return false;
}
try {
strSend = "AT+CSMP=1,173,36,08" + String.valueOf(symbol1);
mySerial.writePort(strSend);
sleep(300);
strReturn = mySerial.ReadPort(6); // 讀返回字串
if (strReturn.indexOf("OK", 0) != -1) { // 如果成功,進行下一步
// 將對方的電話號傳入手機
strSend = "AT+CMGS=" + String.valueOf(symbol2) + phoneCode +
String.valueOf(symbol2) +
String.valueOf(symbol1);
mySerial.writePort(strSend);
strReturn = "";
sleep(200);
strReturn = mySerial.ReadPort(4);
byte[] str1 = null;
try {
str1 = msg.getBytes("GBK");
}
catch (Java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
// 將發送資訊變成十六進位發送
strSend = encodeHex(str1, msg) + String.valueOf(symbol3) +
String.valueOf(symbol1);
mySerial.writePort(strSend);
sleep(200);
strReturn = mySerial.ReadPort(8); // 讀資訊以確定是否發送成功
if (strReturn.indexOf("+CMGS", 0) != -1) {
System.out.println("OK");
return true;
}