200: OK 201: Created
3.6 HTTP Request với AJA
3.6.1 Javascript
Là chương trình chạy với chế độ thông dịch ở cả client và server. Ở client, các script bổ sung vào trang web cho phép tạo ra các trang web tương tác, có những hiệu ứng động dựa vào mô hình đối tượng trình duyệt (BOM: browser object model). Còn ở server, cho phép phát triển nhanh và dễ dàng các chương trình đơn giản hơn là các ngôn ngữ lập trình dạng biên dịch như C,
C++,Java,C#, v.v… Tuy nhiên hiện nay hầu hết các ứng dụng thường gặp thì Javascript được chạy ở phía client.
JavaScript có thể làm được gì ?
- Tập hợp các công cụ cho phép tạo ra các trang web tương tác, có thể thay đổi nội dung và thể hiện.
- Điều khiển trình duyệt.
- Xử lý dữ liệu trong các ứng dụng cilent-side, kiểm tra tính hợp lệ dữ liệu trong các form.
- Lưu các trạng thái trong cookies. JavaScript không thể làm được gì ?
- Không đọc / ghi file - Không hỗ trợ mạng.
3.6.2 Viết chương trình web dùng JavaScript
Toàn bộ mã JavaScript được đặt bên trong cặp thẻ <SCRIPT> và </SCRIPT>. Khi trình duyệt xử l tệp tin HTML, gặp thẻ <SCRIPT> nó sẽ đọc toàn bộ các dòng lệnh cho đến khi gặp thẻ </SCRIPT>, thông dịch và thực hiện lệnh, nếu có lỗi sẽ thông báo trên cửa sổ alert.
Ví dụ : Một trang web được viết có chương trình JavaScript
<HTML> <HEAD> <SCRIPT language="JavaScript"> <!- dấu mã JavaScript đối với những trình duyệt cũ -> // các lệnh, hàm JavaScript </SCRIPT> </HEAD> <BODY> <SCRIPT language="JavaScript"> <!- dấu mã JavaScript đối với những trình duyệt cũ -> // các lệnh, lời gọi hàm JavaScript </SCRIPT> <NOSCRIPT>
<!-Các thẻ HTML thay thế nếu trình duyệt không hỗ trợ JavaScript -> </NOSCRIPT>
</BODY> </HTML>
3.6.3 AJAX
Bình thường, mỗi khi browser gởi 1 yêu cầu lên server thì nó phải reload lại trang web, tức là yêu cầu server gửi lại toàn bộ trang web.
Kĩ thuật Ajax (Asynchronous Javascript And XML) giúp cho browser có thể gửi yêu cầu đến server và nhận response mà không cần reload lại trang web. Ngoài ra, request này có thể được thực hiện 1 cách bất đồng bộ ( trong quá trình chờ response, người dùng vẫn có thể tương tác với trang web)
Kĩ thuật này sử dụng đối tượng XMLHttp để thực hiện các truy vấn lên server. Ta sẽ sử dụng javascript để thao tác trên đối tượng XMLHttp.
3.6.4 Tạo đối tượng XMLHttp Request
Bước đầu tiên cần phải thực hiện trong việc sử dụng đối tượng XMLHttp là phải tạo nó. Đối với các trình duyệt khác nhau thì việc tạo đối tượng này sẽ khác nhau.
Đối với Internet Explorer (IE), đối tượng này được cài đặt dưới dạng 1 ActiveXObject. Do đó, để tạo được nó, cần phải thực hiện câu lệnh javascript sau:
var XmlHttp = new ActiveXObject("Microsoft.XMLHttp");
Trong đó Microsoft.XMLHttp là loại đối tượng ActiveXObject cần tạo.
Tuy nhiên, có nhiều phiên bản IE khác nhau nên để đối tượng XMLHttp cũng có nhiều phiên bản khác nhau. Các phiên bản này là: • Microsoft.XMLHttp • MSXML2.XMLHttp • MSXML2.XMLHttp.3.0 • MSXML2.XMLHttp.4.0 • MSXML2.XMLHttp.5.0
Đối với các trình duyệt : Mozilla Firefox, Safari, và Opera thì câu lệnh javascript để tạo đối tượng XMLHttp giống nhau:
var XmlHttp = new XMLHttpRequest();
Ví dụ: câu lệnh sử dụng trong đề tài này, tổng quát cho 2 loại trên:
if(window.XMLHttpRequest) {
req = new XMLHttpRequest(); led = new XMLHttpRequest(); }
else if(window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP"); led = new ActiveXObject("Microsoft.XMLHTTP"); }
Sau khi đã tạo đối tượng XMLHttp, ta bắt đầu thực hiện việc tạo request đến server. Bước đầu tiên là gọi phương thức open, dùng để khởi tạo đối tượng. Phương thức này nhận vào 3 tham số: Request Type: là 1 chuỗi cho biết loại request cần thực hiện, có thể là GET hoặc POST.
URL: là chuỗi URL cho biết địa chỉ cần gởi request đến.
Async: là một giá trị boolean, cho biết request có được thực hiện 1 cách bất đồng bộ hay không. Tham số này rất quan trọng, nó xác định cách thức mà javascript thực hiện request. Khi được thiết lập là true, request sẽ được thực hiện 1 cách bất đồng bộ, và các đoạn lệnh javascript vẫn tiếp tục được thực hiện mà không cần phải chờ response từ server. Vì vậy, ta cần phải cài đặt 1 hàm xử lí sự kiện có nhiệm vụ chờ response từ server. Nếu async là false thì các đoạn lệnh javascript kế tiếp sẽ không được thực hiện cho đến khi server gởi xong dữ liệu về. Nếu như thời gian mà server trả response về là lâu thì sẽ gây bất tiện vì người dùng không thể tương tác được với trang web trong khoảng thời gian đó. Vì vậy, cách tốt nhất là gán cho async giá trị True khi gọi hàm open.
Ví dụ:
req.open("GET", "/cgi-bin/toggle_led?id" + Math.random(), true);
Đối tượng XMLHttp có 1 thuộc tính là readyState, tham số này sẽ thay đổi khi mà request được thực hiện và khi client nhận được response từ server. Thuộc tính này có 5 giá trị như sau:
• 0 (Uninitialized): Đối tượng mới đựơc tạo nhưng hàm open chưa được gọi. • 1 (Loading): Hàm open mới được gọi nhưng request chưa được gởi
• 2 (Loaded): Request vừa mới được gởi
• 3 (Interactive): Client đã nhận được một phần response từ server
• 4 (Complete): Tất cả dữ liệu đã được server gởi về client và kết nối đã đóng lại.
Mỗi lần thuộc tính readyState thay đổi giá trị thì sự kiện readystatechange được phát sinh và hàm xử lí sự kiện onreadystatechange được gọi. Do các browser cài đặt đối tượng XMLHttp khác nhau nên để đảm bảo trang web của mình có thể chạy được trên nhiều browser thì ta chỉ nên dùng các giá trị sau của thuộc tính readyState: 0, 1 và 4
Trong hầu hết các trường hợp, ta chỉ cần xét trường hợp thuộc tính readyState có giá trị là 4, tức là khi toàn bộ dữ liệu từ server đã gởi đến client.
if(led.readyState == 4) {
if(led.status == 200) {
document.getElementById("ledstate").innerHTML = "<div>" + led.responseText + "</div>";
} }
Trong đoạn lệnh ở trên, ta định nghĩa 1 hàm onreadystatechange có chức năng hiển thị 1 dialog box để thông báo.
Bước cuối cùng là gọi hàm send(), hàm này sẽ thực sự gởi request lên server. Hàm này có 1 tham số, đó là chuỗi chứa phần body của request. Đối với request loại GET thì không cần phần body này, do đó, ta gọi hàm send với tham số là NULL. Đối với loại request là POST thì tham số này khác null.
Ví dụ: hàm send với loại request GET XmlHttp.send(null);
Sau khi gọi hàm này thì request được gởi đi, khi toàn bộ dữ liệu được nhận về thì hàm
onreadystatechange sẽ được gọi và ở đây, ta sẽ thực hiện các xử lí tương ứng với dữ liệu nhận được. Dữ liệu này được lấy thông qua 1 trong 2 thuộc tính responseText hoặc responseXML. Thuộc tính responseText chứa chuỗi response trong khi responseXML chứa 1 đối tượng tài liệu XML. Thuộc tính responseXML chỉ được dùng khi loại dữ liệu trả về là text/xml. Trong trường hợp yêu cầu nội dung file info.txt trong ví dụ trên thì ta chỉ cần dùng thuộc tính responseText. Nếu sử dụng thuộc tính responseXML thì cần tìm hiểu thêm về DOMDocument vì
responseXML chính là 1 đối tượng DOMDocument. Có thể tìm thông tin về loại đối tượng này trong MSDN 2003 với từ khóa “DOMDocument”.
Một đoạn code ví dụ sử dụng thuộc tính responseXML
var xmldoc = httpRequest.responseXML;
var root_node = xmldoc.getElementsByTagName(root).item(0); alert(root_node.firstChild.data);
Chương 4 Xây dựng mô hình mạng, giải thuật giao tiếp 4.1 Giải thuật giao tiếp với các module cảm biến, điều khiển 4.1.1 Cảm biến Gas/Khói
Là cảm biến sử dụng trong gia đình và trong công nghiệp để phát hiện trong không khí có LPG (Gas hóa lỏng), iso-butane, propane, LNG (Gas hóa lỏng tự nhiên - CH4). Nó cũng có thể phát hiện ra khói bếp hoặc khói thuốc lá.
Thông số kỹ thuật:
- Nguồn cung cấp: 5V ±0.1 (AC hoặc DC) - Điện trở trong điều kiện bình thường: 20 kΩ - Điện trở khi phát hiện sự cố giảm đến: 33 Ω ±5%
- Điều kiện làm việc (chuẩn) : nhiệt độ 20 0C ± 2 0C, độ ẩm: 65% ± 5%. - Phạm vi phát hiện : 200-10000ppm (LPG, iso-butane, propane, LNG) - Độ nhạy cao với các loại khí gas, độ nhạy thấp khi dùng phát hiện khói
Trong đó: Rs: điện trở cảm biến.
Ro: điện trở cảm biến tại điểm có 1000ppm LPG trong không khí sạch Giải thuật giao tiếp:
Vì điện trở cảm biến thay đổi theo nồng độ phát hiện được trong không khí nên ta dùng chức năng ADC để đọc điện áp ra của cảm biến khi đã được cấp nguồn 5VDC theo mạch điện được nhà sản xuất khuyến khích:
Hình 4.2: Sơ đồ mạch cảm biến gas MQ-6 Hình ảnh thực tế module hoàn chỉnh :
Hình 4.3: Module cảm biến gas hoàn chỉnh thực tế
Module được hoàn thành với sự hỗ trợ của bạn Thái Xuân Hồng Nhật, K09 Câu lạc bộ Nghiên cứu khoa học khoa Điện – Điện tử.
4.1.2 Cảm biến nhiệt độ TMP100 – Texas Instrument Tính năng cơ bản:
- Hỗ trợ giao tiếp số: SMBus và I2C.
- Độ phân giải cao, từ 9 – 12 bit và cho phép người dùng lựa chọn. - Sai số : ±2.0°C đối với tầm −25°C - 85°C (max)
±3.0°C đối với tầm −55°C - 125°C (max) - Dải nguồn vào rộng: 2.7V – 5.5V
- Kiểu chân dán, kích thướt nhỏ.
Hình 4.4: Cấu tạo cảm biến TMP100 Giải thuật giao tiếp:
Trong đề tài thực hiện giao tiếp với cảm biến thông qua giao thức I2C. Bên trong cảm biến hỗ trợ các thanh ghi để lưu trữ nhiệt độ hiện tại, cài đặt độ phân giải. Muốn truy cập các thanh ghi này phải thông qua thanh ghi Pointer Register. Giải thuật giao tiếp được thể hiện như sơ đồ bên dưới:
Hình 4.5: Sơ đồ thanh ghi - Cài đặt độ phân giải:
Send Configure Reg Address (0x01)
MCU TMP100
ACKSTART START
Send Pointer Address (0x90)
ACK
Send Value to configure
ACKSTOP STOP
Hình 4.6: Giải thuật cài đặt độ phần giải (9 – 12 bit) - Đọc nhiệt độ từ cảm biến:
Hình 4.7: Giải thuật đọc nhiệt độ hiện tại từ cảm biến Sơ đồ mạch phần cứng:
Hình 4.8: sơ đồ mạch cảm biến nhiệt độ TMP100 SCL R2 4.7k SDA 4 2 1 6 5 3 V c c GN D SCL SDA ADD0 ADD1/ALRT R1 4.7k J1 Connector 1 2 3 4 C1 100n VCC VCC
Hình ảnh thực tế:
Hình 4.9: Module cảm biến nhiệt TMP100 hoàn chỉnh thực tế 4.1.3 Quang trở
Là linh kiện điện tử có điện trở thay đổi theo cường độ sáng kích thích. Ở điều kiện không có ánh sáng (tối) thì điện trở hai đầu vào khoảng 2 MΩ còn khi đặt ở nơi có ánh sáng mạnh thì điện trở hai đầu giảm xuống dười 100 kΩ. Dựa vào tính chất này, ta có thể xem quang trở như một cảm biến độ sáng.
Đề tài sử dụng phương pháp đọc ADC giữa 2 đầu quang trở, khi độ sáng thay đổi thì điện áp này cũng thay đổi. Chia điện áp đọc về giữa hai khoảng khi có độ sáng cao nhất và thấp nhất thành 10 đoạn (ứng với 10 mức sáng).
Hình 4.10: sơ đồ mạch module quang trở 4.1.4 Module RFID
Công nghệ RFID
RFID (Radio-frequency identification): là một kỹ thuật nhận dạng sóng vô tuyến từ xa, cho phép dữ liệu trên một con chíp được đọc từ xa không thông qua một kết nối vật lý nào mà qua đường dẫn sóng vô tuyến ở khoảng cách từ 50 cm tới 10 mét, tùy theo kiểu của thẻ nhãn RFID. Hệ thống RFID gồm hai thành phần: thứ nhất là những chiếc thẻ nhãn nhỏ (cỡ vài cm) có gắn chip silicon cùng ăng ten radio (hay còn gọi là tag) và thành phần thứ hai là bộ đọc cho phép giao tiếp với thẻ nhãn và truyền dữ liệu tới hệ thống máy tính trung tâm (module reader). Tag chia làm 2 loại: chỉ đọc (passive) và loại đọc ghi (active).
Tần số sóng radio sử dụng được chuẩn hóa ở một số dải tần số sau:
Bảng 4.1: Bảng dải tần số sử dụng trong RFID (Theo wikipedia.org)
Dải tần số Khoảng cách
đọc
Ứng dụng Giá tag
120–150 kHz (LF) 10cm Quản lý vật dụng (thay thế barcode), quản lý nhân viên, …
1$ 10K R1 - Quang tro 100K R2 1 2 3 P1 Header 3 GND VCC
13.56 MHz (HF) 1m Thẻ thông minh 0.5$ 433 MHz (UHF) 1-100m ứng dụng quốc phòng với thẻ
active 5$ 865-868 MHz (Europe) 902-928 MHz (North America) UHF 1-2m 0.15$ (passive tag) 2450-5800 MHz (microwave)
1-2m 802.11 WLAN, Bluetooth 25$ (active
tag)
3.1–10 GHz (microwave) 1-200m 5$
Một số thông số và tính năng cơ bản của module RFID - Nguồn vào: DC 5V (±5%).
- Tần số: 125 kHz.
- Khoảng cách đọc: 50mm – 100mm (phụ thuộc vào tag). - Giao tiếp UART với baudrate 9600 bps.
Hình 4.12: Module RFID và sơ đồ chân Giải thuật giao tiếp:
Module tự động trả về dữ liệu đọc được từ tag khi có một tag nằm trong khoảng cách nhất định. Tùy theo mức áp cấp vào chân I (sw) trên module mà định dạng dữ liệu trả về cũng khác nhau.
Đệm Number code Number Keytag Đệm
2 byte 1 byte 4 byte 3 byte
Hình 4.13: Cấu trúc gói dữ liệu từ module RFID khi I = 1
Đệm 10 ASCII Character Đệm
2 byte 10 byte 3 byte
Hình 4.14: Cấu trúc gói dữ liệu từ module RFID khi I = 0
Trong đề tài kết nối chân I với GND (tức I = 0) nên trong khung dữ liệu truyền về thực hiện tách 10 kí tự ASCII (mỗi tag có 10 kí tự xem như là ID number). Dữ liệu nhận về thông qua cổng UART với baudrate 9600 bps.
Hình 4.16: Hình ảnh module RFID 125 kHz 4.1.5 Rờ le (Relay)
Rờ-le là loại linh kiện đóng ngắt điện cơ đơn giản ứng dụng hiệu ứng điện từ. Nó gồm 2 phần chính là nam châm điện và các tiếp điểm. Trong một số loại máy tính đời đầu đã sử dụng rờ-le để thực hiện phép toán nhị phân (boolean).
Rờ-le có cấu tạo hết sức đơn giản, gồm 4 bộ phận sau đây: -Nam châm điện
-Lõi sắt -Lò xo
-Các tiếp điểm
Thông số kỹ thuật cơ bản và cấu tạo:
- Nguồn cuộn dây (đóng cắt): 3 – 24 VDC. - Khả năng đóng ngắt: 10A – 250 VAC.
- Dòng đóng ngắt (dòng qua cuộn dây): 100 mA tại 5 VDC. - Cấu tạo & sơ đồ chân:
Hình 4.17: Cấu tạo và sơ đồ chân rờ le Omron. Sơ đồ mạch đóng ngắt tải AC dùng rờ le:
Hình 4.18: Sơ đồ mạch đóng ngắt tải AC rờ le Hình ảnh module hoàn chỉnh:
Hình 4.19: hình ảnh module rờ le thực tế 4.1.6 Module SIM908 – SimCom
Module SIM908
Module Sim tích hợp chức năng GSM, GPRS và GPS của hãng SimCom thích hợp với các ứng dụng định vị giám sát và điều khiển từ xa qua điện thoại, mạng. Thiết kế nhỏ gọn, kiểu chân dán. Có nhiều cải tiến để chịu được điều kiện khắc nghiệt hơn các phiên bản trước, thuận lợi cho sử dụng trong môi trường công nghiệp. Tiết kiệm công suất, tầm nguồn vào rộng.