- AT Command
- API ที่ผู้ผลิตอุปกรณ์แต่ละแห่งพัฒนาขึ้นมา
การ เชื่อมต่อแบบนี้ Windows จะมองอุปกรณ์สื่อสารของเราเสมือนว่าเป็น modem และใช้ชุดคำสั่ง AT Command ในการสื่อสารกัน เริ่มต้นการสื่อสารเราอาจใช้ HyperTerminal ที่มีใน Microsoft Windows การทดสอบก่อน
- เริ่มจากเชื่อมต่ออุปกรณ์สื่อสารเข้ากับ PC
- เปิด program HyperTerminal จากนั้นเลือก port ที่เชื่อมต่ออยู่กับอุปกรณ์สื่อสารให้ถูกต้อง
- ทดลองพิมพ์คำสั่ง AT ถ้าผลลัพธ์ตอบกลับมา OK แสดงว่าเราเชื่อมต่ออุปกรณ์สื่อสารสำเร็จแล้ว
ผู้ผลิตอุปกรณ์แต่ละแห่งก็ implement ชุดคำสั่งไม่เท่ากัน หรือแม้แต่ผู้ผลิตอุปกรณ์แห่งเดียวกันแต่ละรุ่นก็มีชุดคำสั่งไม่เท่ากัน ดังนั้นก่อนที่เราจะใช้งานควรทดสอบก่อนว่าอุปกรณ์นั้นรองรับชุดคำสั่งที่เรา ต้องการหรือไม่ โดยการพิมพ์คำสั่ง AT ตามด้วย +<คำสั่งที่เราจะทดสอบ>=? เช่นถ้าต้องการทดสอบการรับ SMS AT+CMGR=? ถ้าค่าออกมาเป็น OK แสดงว่าอุปกรณ์รองรับคำสั่งนี้ แต่ถ้าออกมาเป็น ERROR แสดงว่าไม่รองรับคำสั่งดังกล่าว
การ สั่งงานควบคุมโดยการใช้ HyperTerminal เป็นวิธีที่ตรงไปตรงมาแต่การใช้งานจริงเราอาจต้องเขียนโปรแกรมเพื่อควบคุม อุปกรณ์สื่อสารอีกที วิธีที่เราจะเขียนโปรแกรมควบคุมอุปกรณ์สื่อสารโดยใช้ AT Command ทำได้หลายวิธีขึ้นอยู่กับ API ของแต่ละภาษา แต่ในตัวอย่างนี้เป็นโปรแกรมที่ใช้ส่ง SMS โดยใช้ภาษา Java เชื่อมต่อกับอุปกรณ์สื่อสารผ่าน Java Communication API
การทำงานของโปรแกรมตัวอย่างนี้เขียนเป็นขั้นตอนได้ดังนี้
- เชื่อมต่อกับอุปกรณ์สื่อสารโดยเราต้องระบุ port ที่ทำการเชื่อต่อ
- เมื่อเชื่อมต่อได้สำเร็จจะคุยกันผ่าน Java I/O Stream โดยการส่งคำสั่ง AT Command
import java.io.*;
import java.util.*;
import javax.comm.*;
import com.sun.comm.*;
class Mobile {
private static final int RESPONSE_TIMEOUT = 50;
private static final int DEVICE_TIMEOUT = 1000;
private static final String NEWLINE = "\n";
private static final String ENTER = "\r";
private static final String CTRL_Z = "\u001A";
private static final String CONNECTION = "connect";
private InputStream in;
private OutputStream out;
private SerialPort port;
private CommPortIdentifier portID;
public Mobile(String appName, CommPortIdentifier portID) throws IOException, PortInUseException, UnsupportedCommOperationException {
this.portID = portID;
port = (SerialPort) portID.open(appName, DEVICE_TIMEOUT);
port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
port.setFlowControlMode(port.FLOWCONTROL_NONE);
in = port.getInputStream();
out = port.getOutputStream();
}
public void close() throws IOException {
in.close();
out.close();
port.close();
}
public static Map listPort() throws IOException {
Map listPort = new Hashtable();
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
CommPortIdentifier portID = (CommPortIdentifier) portList.nextElement();
listPort.put(portID.getName(), portID);
}
return listPort;
}
public String sendSMS(String tel, String msg) throws IOException, InterruptedException {
String result = null;
sendCommand("AT+CMGF=1");
writeRequest("AT+CMGS=\"" + tel + "\"");
result = sendCommand(msg + CTRL_Z);
return result;
}
public String sendCommand(String cmd) throws IOException, InterruptedException {writeRequest(cmd);
return readResponse();
}
private void writeRequest(String req) throws IOException {
out.write(new String(req + ENTER).getBytes());
out.flush();
}
private String readResponse() throws IOException, InterruptedException {
String strIn = "";
for (int i=0; i 0){
byte[] bb = new byte[numChars];
in.read(bb, 0, numChars);
strIn += new String(bb);
}
if (strIn.indexOf(">" + ENTER + NEWLINE) != -1) {
break;
}
if (strIn.indexOf("OK" + ENTER + NEWLINE) != -1) {
break;
}
if (strIn.indexOf("ERROR") != -1 &&
strIn.indexOf(ENTER + NEWLINE, strIn.indexOf("ERROR") + 1) != -1) {
break;
}
Thread.sleep(100);
}
return strIn;
}
}
class client ที่เป็นตัวเรียกใช้งาน utility class การใช้งานเรียบง่ายแค่ระบุ port ที่จะติดต่อและเรียกคำสั่งส่ง SMS โดยใส่เลขหมายปลายทางและข้อความที่ต้องการส่งimport java.util.*;
import javax.comm.*;
public class Client {
public static void main(String[] args) throws Exception {
//choose port
Map listPort = Mobile.listPort();
System.out.println(listPort);
Mobile mobile = new Mobile("SMS/GSM Nokia N73", listPort.get("COM12"));
System.out.println(mobile.sendSMS("+66123456789", "Hello World"));
System.out.println("---");
}
}
แน่นอนครับว่านอกจากส่ง sms แล้วยังสามารถทำอย่างอื่นได้อีกถ้าสนใจลองดูได้จากชุดคำสั่ง Nokia Wiki ATCommands
โดยสรุปแล้วการสื่อสารผ่าน AT Command มีข้อดีและข้อเสียดังนี้
- ข้อ ดีของการสื่อสารกันผ่าน AT Command คือเป็นชุดคำสั่งมาตรฐานที่ให้ผู้ผลิตอุปกรณ์นำไป implement ลงในอุปกรณ์สื่อสารของตัวเอง ดังนั้นเราโปรแกรมที่เขียนจึงไม่ต้องกังวลว่าจะใช้สื่อสารกับอุปกรณ์อื่นไม่ได้
- ข้อเสียคือเนื่องจาก AT Command เป็นชุดคำสั่งที่ Microsoft เป้นผู้คิดขึ้นมาจึงไม่อาจนำไปใช้ต่างระบบปฏิบัติการได้

No comments:
Post a Comment