- 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 Mapclass client ที่เป็นตัวเรียกใช้งาน utility class การใช้งานเรียบง่ายแค่ระบุ port ที่จะติดต่อและเรียกคำสั่งส่ง SMS โดยใส่เลขหมายปลายทางและข้อความที่ต้องการส่ง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; } }
import java.util.*; import javax.comm.*; public class Client { public static void main(String[] args) throws Exception { //choose port MaplistPort = 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