LẬP TRÌNH KẾT NỐI THIẾT BỊ
Arduino ilà imột ibo imạch iđược idùng iđể ilập itrình itương itác ivới icác ithiết ibị iphần
icứng ikhác inhư icảm ibiến, iđộng icơ,... iThêm inữa, ivì iArduino ilà imột inền itảng iđược
ichuẩn ihóa, inên iđã icó irất inhiều ibo imạch imở irộng icó ithể icắm ichồng ilên imạch ichủ
iArduino inhư ilà ithư iviện icủa icác ingôn ingữ ilập itrình. i
Lập itrình icho iArduino idùng ingôn ingữ iC/C++, iso ivới ilập itrình ilập itrình itrực
itiếp ivới ivi iđiều ikhiển, ilập itrình ivới iArduino iđơn igiản ihơn inhiều ivì ichỉ iphải igiao itiếp
ivới iphần icứng ithông iqua icác ithư iviện.
Hình 2.2-7: Cài đặt môi trường Java.
Hình 2.2-9: Arduino IDE.
Một chương trình viết trên bo mạch Arduino dùng ngôn ngữ C/C++, được gọi là sketch với 2 phương thức quan trọng là setup() và loop().
Những lệnh trong setup() thường là những khai báo biến và các hàm chức năng, sẽ được chạy khi chương trình khởi động.
Những lệnh trong loop() được chạy lặp đi lặp lại cho tới khi ngắt nguồn hoặc nút reset được nhấn trên bo mạch chủ Arduino.
Sketch sau đó được build và nạp lên bo mạch chính qua cổng giao tiếp USB.
Hình 2.2-11: Cấu trúc của Sketch.
HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU SQL SERVER
SQL, itừ iviết itắt icủa iStructured iQuery iLanguage, ilà ingôn ingữ itruy ivấn icó icấu
itrúc, icho iphép itruy icập ivà ithao itác ivới icác icơ isở idữ iliệu iđể itạo, ixóa, isửa iđổi, itrích ixuất
idữ iliệu.
Microsoft SQL Server là một hệ quản trị cơ sở dữ liệu quan hệ được phát triển bởi Microsoft, bao gồm phần mềm quản lý, tổ chức, lưu itrữ ivà ikhai ithác idữ iliệu icho
ingười idùng ichuyên inghiệp ivà icho idoanh inghiệp. i
Một ivài ihệ iquản itrị icơ isở idữ iliệu imã inguồn imở icũng iđã iphát itriển, inhưng
iMicrosoft iSQL iServer ivẫn idễ isử idụng ivà icó inhiều itính inăng ihơn. iNó icũng ihỗ itrợ iđầy
iđủ icác itrình ikích ihoạt. iSQL iServer iluôn icập inhật ivà ikhông ingừng itung ira inhững
iphiên ibản imới, ivì ivậy imà inó ivẫn ilà ihệ iquản itrị icơ isở idữ iliệu ihàng iđầu iđược ilựa ichọn
itrong icác idự ián ilớn ingày inay.
SQL iServer ihoạt iđộng itự inhiên ivới icác iứng idụng ichạy itrên inền itảng i.NET, ido
iđó, inó ilà isự ilựa ichọn itối iưu icho iphần imềm ichạy itrên imáy ichủ iWindows ihoặc imáy
itính iđể ibàn.
Hình 2.2-13: Mô hình liên kết dữ liệu với ứng dụng
LẬP TRÌNH ỨNG DỤNG WEB VỚI iASP.NET MVC
ASP.NET iiiMVC iiilà iiimột iiimô iiihình iiiphát iiitriển iiiphần iiimềm iiimới, iiiđây iiiđược
iiixem iiilà iiisự iiilựa iiichọn iiitiếp iiitheo iiicho iiiviệc iiixây iiidựng iiicác iiiứng iiidụng iiiWeb iiidựa iiitrên
iiinền iiitảng iiiASP.NET. ii
MVC iiLà iimột iiframework iiđược iiđược iixây iidựng iibởi iiMicrosoft, iithực iithi iimô
iihình iiMVC ii(model–view–controller). iiASP.NET iiMVC iilà ii1 iiphần iimềm iimã iinguồn
iimở, iitách iirời iivới iithành iiphần iiđộc iiquyền iiASP.NET iiWeb iiForms, iitối iiưu iiứng iidụng,
iidễ iidàng iichỉnh iisửa iicode iixử iilý iihoặc iigiao iidiện iingười iidùng. iiASP.NET iiMVC iiđang
iinổi iilên iilà iiphương iipháp iiphát iitriển iiweb iimạnh iivà iiphổ iibiến iinhất iitrên iinền iiASP.NET
Hình 2.2-14: Mô hình MVC trong phát triển ứng dụng.
Hình 2.2-15: Kiến trúc ASP.NET MVC
Những ưu điểm mà ASP.Net MVC mạng lại so với mô hình cũ:
Do isử idụng imô ihình iMVC inên itrong iASP.Net iMVC iđã itách ibiệt iđược icác itầng itrong imô ihình ilập itrình iweb, igiúp itối iưu iứng idụng ivà igiản iđơn itrong iviệc iviết icode, ibảo itrì.
Giao idiện itrong iASP.Net iMVC isử idụng icông inghệ ithiết ikế iweb iHTML,
iCSS inên iviệc ithiết ikế igiao idiện itrở inên ilinh ihoạt ivà idễ idàng ihơn.
ASP.Net iiMVC iikhông iisử iidụng iithuộc iitính iiview iistate iinhư iimô iihình iicũ
iivì iivậy iitrang iiweb iikhông iibị iităng iikích iithước, iido iiđó iimà iihiệu iinăng
iihoạt iiđộng iikhông iibị iigiảm.
Sự kết hợp của .NET và MVC thành một nền tảng mới với các tính năng:
Kiểm tra hướng phát triển (TDD) : .NET MVC hỗ trợ mô hình Phát
triển ứng dụng nhanh. Cùng với đó, vì mô hình MVC cho phép các ứng dụng web được phát triển theo từng phần, việc kiểm tra trở nên dễ dàng hơn. Kiểm thử và phát triển ứng dụng được làm việc đồng bộ trong mọi giai đoạn phát triển. Bằng cách này, sản phẩm cuối cùng được phân phối nhanh chóng và với mức độ hài lòng cao.
Tích hợp dễ dàng với JavaScript : .NET MVC của Microsoft có khả
năng cung cấp bất kỳ mức độ tương tác nào với JavaScript.
Tính khả dụng của cộng đồng nguồn mở : Vì .NET MVC framework
là mã nguồn mở, có rất nhiều nhà phát triển web trên khắp thế giới chia sẻ ý tưởng và hỗ trợ cùng nhau, liên tục đưa ra các bản nâng cấp.
Tính linh hoạt cao với khả năng tương thích đa nền tảng : Khung
này tương thích với tất cả các nền tảng, cụ thể là hệ điều hành Windows, Linux và Mac. Vì vậy, việc phát triển ứng dụng .NET có thể được thực hiện trên nền tảng ưa thích của lập trình viên mà không phải lo lắng về việc thực thi môi trường ứng dụng. Khi ứng dụng được phát triển và chạy thành công trên một nền tảng cụ thể, nó chắc chắn sẽ hoạt động trơn tru trên các nền tảng còn lại.
CÔNG NGHỆ SIGNAL-R
HTTP ihoạt iđộng itheo imô ihình iyêu icầu ivà iphản ihồi, itrong iđó iyêu icầu icần iđược igửi iđến imáy ichủ iđể inhận ibất ikỳ icập inhật inào itừ iđó. iĐiều inày itạo ira inhững ithách ithức itrong iviệc ixử ilý imột ivài itình ihuống, itrong iđó ichúng ita icần idữ iliệu ithời igian ithực: ingười idùng imở imột itrang iweb ithì inó icần iđược icập inhật ikhi icó ithay iđổi itrên imáy ichủ, inhưng itheo ikiến itrúc iHTTP, iphải icó iyêu icầu igửi iđến itừ imáy ikhách iđể inhận iđược imột ibản icập inhật itừ imáy ichủ. iĐiều inày itạo ira itrải inghiệm ixấu icho ingười idùng ivì ivô itình ikhông ibiết inhững ithay iđổi idữ iliệu itừ iphía iserver iđể igởi iyêu icầu ilấy ibản icập inhật imới.
Hình 2.2-16: HTTP request – respond mô hình yêu cầu và phản hồi
Để ixử ilý icác ikịch ibản inày, icông inghệ iAJAX iđã igiúp iích irất inhiều ikhi icho iphép igửi iyêu icầu i(tương iđối irất inhỏ) ivà icập inhật igiao idiện ingười idùng idựa itrên iphản ihồi, ituy ivậy, ivẫn icòn imột isố ihạn ichế ibao igồm ihành ivi ikhác inhau icủa itrình iduyệt ivề icác itính inăng ivà ihỗ itrợ. iTừ iquan iđiểm ihiệu isuất, iviệc isử idụng itài inguyên ibăng ithông imạng icủa imáy ichủ ivà icác ivấn iđề ikhác, ita ithấy irằng ikhông ithể igửi imột icách imù iquáng inhiều iyêu icầu iđến imáy ichủ. i
Signal-R ira iđời inhư ilà imột ithư iviện icấp icao igiúp icho iviệc iphát itriển icác iứng idụng iweb ithời igian ithực. iCó ithể ixây idựng iứng idụng iweb ithời igian ithực ivới icác icông inghệ ikhác inhư iAJAX ihay iForever iFrame ihoặc imột isố icách igiải iquyết ikhác, inhưng ichúng ikhá iphức itạp ivà ilogic ikhác inhau ilà icần ithiết icho icác itình ihuống ikhác inhau. iSignal-R iẩn itất icả icác iphức itạp iliên iquan ivà ihoạt iđộng itrơn itru itrên itất icả icác itrình iduyệt ibao igồm icác iphiên ibản ikhác inhau. iNó irất imạnh imẽ ivà icho iphép igiao itiếp ihai ichiều igiữa imáy ikhách ivà imáy ichủ. iMáy ichủ ikhông ibắt ibuộc iphải ichờ iyêu icầu icủa ikhách ihàng igửi iphản ihồi, ithay ivào iđó, inó icó ithể iđẩy iphản ihồi imột icách ihợp ilý ikhi icó idữ iliệu imới. i
Kết inối igiữa iclient ivà iserver ilà iliên itục, ikhông igiống inhư ikết inối iHTTP icổ iđiển, icái imà isẽ ithành ilập ilại ikết inối icho imỗi ilần igiao itiếp.
SignalR isử idụng inhiều icông inghệ itruyền itải ivà ichọn imột icông inghệ iphù ihợp inhất icho ikịch ibản.
SignalR ilà imột itầng itrừu itượng itrên imột isố itruyền itải imà iyêu icầu iđể ilàm icông iviệc ithời igian ithực igiữa iclient ivà iserver. iMột ikết inối iSignalR ibắt iđầu inhư imột iHTTP, ivà itiếp itheo iđược iđẩy ilên imột ikết inối iWebSocket inếu inó ilà icó isẵn. i
WebSocket ilà imột iý itưởng itruyền itải icho iSignalR, ivì inó ilàm icho iviệc isử idụng ibộ inhớ iserver ihiệu iquả inhất, icó iđộ itrễ ithấp inhất, ivà icó inhững itính inăng icơ ibản inhất i(như igiao itiếp ihai ichiều iđầy iđủ igiữa iclient ivà iserver), inhưng inó icũng icó inhững iyêu icầu inghiêm ingặt inhất ivề ichứng ithực, ibảo imật. iNếu inhững iyêu icầu inày ikhông iđược iđáp iứng, iSignalR isẽ icố igắng iđể isử idụng inhững itruyền itải ikhác iđể ilàm inhững ikết inối icủa nó.
AJAX POLLING:
Polling ilà imột ikỹ ithuật iđược isử idụng itrong icác iứng idụng iAJAX, iý itưởng icủa inó ilà iclient isẽ igọi itới iserver imột icách iliên itục iđể iyêu icầu idữ iliệu imới i(polls/requests idata). iClient isẽ itạo ira imột irequest ivà iđợi ikết iquả itrả ivề itừ iServer, inếu iServer ikhông itìm ithấy ihoặc itrả ikết iquả ivề ilà irỗng i(empty), ithì imột iempty iresponse isẽ iđược igửi ivề.
1. Client tiến hành mở một connection và request dữ liệu từ Server thông qua cổng kết nối HTTP.
2. Những request trên sẽ được gửi đến Server theo định kỳ, ví dụ theo mỗi khoảng thời gian ngắn cố định sẽ có một yêu cầu được chuyển đi. 3. Server sẽ tính toán và trả dữ liệu về thông qua cổng kết nối HTTP. 4. Phía Client sẽ lặp lại các bước trên để có thể lấy được dữ liệu mới nhất
từ máy chủ.
HTTP LONG-POLLING
Đây ilà imột ibiến ithể icủa iHTTP iPolling itruyền ithống, icho iphép iServer ichủ iđộng iđẩy ithông itin itới iClient ikhi icó idữ iliệu imới, ibằng icách iClient isẽ igửi irequest itới iServer imà ikhông icần iServer iphải itrả idữ iliệu ivề ingay itức ithì imà isẽ ilàm itheo ilogic inhư ibên idưới:
Nếu iServer ikhông icó idữ iliệu imới, ithay ivì ikhông itrả ivề ihay itrả ivề idữ iliệu irỗng, ithì iServer isẽ igiữ irequest iđó ivà iđợi icho itới ikhi icó idữ iliệu imới ivề.
Khi idữ iliệu iđã isẵn isàng ithì iServer isẽ igửi itrả i(response) ivề icho iClient. iNgay ilúc iđó iClient ilại itiếp itục igửi imột irequest itới iServer, ivì ithế iở iphía iServer isẽ iluôn iluôn icó imột irequest imà inó icó ithể isử idụng iđể iluôn icập inhật idữ iliệu ivề iphía iClient.
1. Client itạo imột iHTTP irequest ivề iphía iServer ivà ichờ iđợi itới ikhi icó iresponse itrả ivề.
2. Server isẽ ichờ icho itới ikhi icó idữ iliệu itrả ivề ihoặc iquá ithời igian itime-out. 3. Khi icó idữ iliệu iServer isẽ itrả ivề icho iClient i(HTTP irespone)
4. Client isau ikhi inhận iđược idữ iliệu itrả ivề ihoặc iquá itime-out isẽ igửi itiếp imột iHTTP iLong-Polling iđến iServer. iLúc inày isẽ icó imột ikhoảng ithời igian itrễ igiữa ilúc iclient inhận ivà igửi irequest imới, inhưng ithời igian itrễ inày itạm ichấp inhận iđược.
5. Mỗi iHTTP iLong-Polling isẽ icó imột ikhoảng itime-out, inếu iquá ithời itime-out iconnection isẽ iđóng ilại ivà imở ilại imột iconnection imới.
WEB-SOCKET
Websocket ilà igiao ithức ichuẩn icho itrao iđổi idữ iliệu ihai ichiều igiữa iclient ivà iserver ihay igọi ilà ikênh iFull iDuplex. iGiao ithức iWebSocket ithực ihiện itrên igiao ithức iTCP ichứ ikhông ichạy itrên iHTTP
Nó icung icấp imột iphương ithức iliên itục igiữa iClient ivà iServer imà icả ihai ibên icó ithể igửi idữ iliệu icho inhau ibất ikỳ ilúc inào.Kết inối giữa Client ivới iServer ithông iqua iWebsocket ibằng imột icú ibắt itay i(WebSocket ihandshake).
Người ita ithường idùng iWebsocket ithay ivì iHTTP icho inhững itrường ihợp iyêu icầu thời igian ithực ibởi ivì igói itin icủa iWebSockets inhẹ ihơn iHTTP irất inhiều, igiảm iđộ itrễ icủa inetwork ivà ikhông icần iphải igửi irequest iliên itiếp inhư cách vận hành iHTTP.
Điều inày iđược ihiện ithực ibằng icung icấp imôt ichuẩn ihóa itruyền itin igiữa iServer ivà iclient ithông iqua icổngiws://ihoặc iwss:// icó ithêm ibảo imật. iVà idữ iliệu itruyền iđi ichấp inhận ikiểu iString ivà iBinary iType i( ilarge iobjects i(blobs), iArrayBuffers).
SERVER-SENT EVENTS (SSES)
SSEs icũng igần igiống ivới iLong-Polling inhưng ikhác ilà iconnection isẽ iđược ilưu itrữ i(persistent) isử idụng icho imột ithời igian idài i(long-terms) imà ikhông icó itime-out ivà ichỉ icó iServer isẽ isử idụng iconnection inày iđể igửi idữ iliệu ivề icho iClient, ivà iclient ichỉ icó irequest i(GET) idữ iliệu imà ikhông iđược iphép igửi idữ iliệu i(POST) ilên iServer.
Vòng iđời icủa icủa iSSEs
1. Client iyêu icầu ilữ iliệu itừ iServer isử idụg ikết inối iHTTP ithông ithường. 2. Connection igiữa iclient ivà iserver isẽ iđược imở ivà iduy itrì.
SSEs icũng igiống iWebSocket ilà ithích ihợp ivới icác iứng idụng ithời igian ithực i(real itime) inhưng ikhác ilà iSSEs ichỉ ilà imột ichiều i(Half iduplex) igiữa iServer itới iClient.
CHƯƠNG 3: THI CÔNG HỆ THỐNG 3.1 LẮP RÁP MÔ HÌNH
3.1.1 SƠ ĐỒ MẠCH ĐIỆN
Hình 3.1-1: Mạch điện mô phỏng.
Mô hình được xây dựng giả lập với 4 cảm biến vật cản đại diện cho 4 vị trí đỗ xe ở 1 tòa nhà 2 tầng (mỗi tầng có 2 vị trí đỗ). Khi triễn khai thực tế, một tầng có thể có nhiều phân khu và mỗi phân khu có nhiều vị trí đỗ.
3.1.2 HÌNH ẢNH THỰC TẾ
Hình 3.1-3: Mô hình bãi xe hoàn thiện phía trước.
Hình 3.1-5: Mô hình khi kết nối với hệ thống điều khiển trung tâm.
3.2 LẬP TRÌNH HỆ THỐNG
3.2.1 ĐIỀU KHIỂN THIẾT BỊ
Đầu tiên, khai báo và khởi tạo một số biến hệ thống. Định nghĩa các chân Clock_Port, Latch_Port và Data_Port cùng các mãng quản lý trạng thái từng vị trí đỗ.
Các hàm chức năng khởi tạo ban đầu khi hệ thống được cấp nguồn hoặc được khởi động lại.
Mở port với mức baudrate 9600 (bits/giây)
Chương trình chính : một vòng lặp vô tận nhận diện và kiểm tra các thông số tín hiệu.
Nếu là tín hiệu đặt chỗ : đánh dấu vị trí bằng màu vàng.
Nếu là tín hiệu đỗ xe vào vị trí : Hủy đặt chỗ và bật đèn đỏ đánh dấu vị trí đỗ, giảm số lượng vị trí còn trống đi 1 ở bảng điều khiển điện tử.
Nếu là tín hiệu đánh xe ra : Bật đèn xanh đánh dấu vị trí ở trạng thái sẵn sàng, tăng số lượng vị trí trống lên 1.
Sau khi bật các tín hiệu trạng thái theo từng vị trí đỗ, vòng lặp chạy qua đoạn lệnh shiftOut(DATA_PORT, CLOCK_PORT, MSBFIRST, Seg([numberOfParking]) ; cập nhật lại bộ đếm và hiển thị nội dung bằng đèn led 7 đoạn.
3.2.2 CƠ SỞ DỮ LIỆU
Cơ sở dữ liệu lưu trữ với các bảng chính :
ParkingSlots : Ghi nhận trạng thái đỗ cho từng vị trí bên trong tòa nhà.
ErrorLogs : Chứa các nhật ký bảng ghi thông tin về lỗi hệ thống thu thập để hiệu chỉnh, phát triển.
__MigrationHistory : Phiên bản phát hành phần mềm ứng dụng.
3.2.3 ĐỒNG BỘ DỮ LIỆU
Cài đặt thư viện SignalR vào project để thực hiện chức năng đồng bộ dữ liệu theo thời gian thực.
KHỐI HUB NOTIFICATION
Một NotificationHub là một class mà phục vụ như một high-level pipeline để xử lý giao tiếp Client-Server. Kế thừa từ SignalR Hub, quản lý những kết nối và phân chia 2 nhóm phương thức được gọi:
SendNotification: từ hệ thống phần cứng lên web app. BookSlot: từ web app xuống hệ thống phần cứng bên dưới. KHỐI XỬ LÝ TRUNG TÂM WORKER APPICATION
Là một module chạy ngầm, để liên lạc và điều phối tín hiệu đến các khối Parking Slot, Database và Notification Hub.
Khi được khởi động, nó thiết lập các thông số cấu hình, mở port kết nối với hệ thống phần cứng và lắng nghe sự kiện.
Khi nhận được tín hiệu từ bãi xe có thay đổi trạng thái vị trí đỗ, phương thức ChangeSlotState của lớp Service được gọi để cập nhật cơ sở dữ liệu trên cloud.
Tiếp theo HubProxy kích hoạt phương thức SendNotification để đồng bộ dữ liệu với tất cả các thiết bị phía client đang kết nối đến.
Một nhiệm vụ nữa của khối này là lắng nghe dữ liệu Notification Hub những thông tin đặt chỗ từ web app. Khối sau đó chuyển tín hiệu điện để gởi về hệ thống phần cứng cập nhật (bật đèn vàng) tại vị trí được book.