Thiết kế phần mềm Server nhận, xử lý và lƣu trữ dữ liệu

Một phần của tài liệu Hệ thống giám sát hành trình phương tiện sử dụng công nghệ định vị GPS và công nghệ truyền dẫ GPRS (Trang 52)

3.4.1 Các chức năng chính

- Quản lý các kết nối socket từ các thiết bị

- Nhận, bóc tách và phân loại đƣợc các gói tin từ các thiết bị gửi về khác nhau - Ghép các gói tin hình ảnh thành bức ảnh rồi lƣu vào hệ thống file máy tính

3.4.2 Quản lý các kết nối socket từ các thiết bị

Ban đầu khi phần mềm server đƣợc bật lên, nó tự động tạo một đối tƣợng lắng nghe tại cổng mà các thiết bị sẽ kết nối tới.

‘ Đối tượng lắng nghe

Public Listener As Sockets.TcpListener ‘Tiến trình quản lý quá trình nhận kết nối

Public serverThread As New Threading.Thread(AddressOf AcceptClients) ‘Đối tượng quản lý tiến trình streaming video ra sang dạng chuẩn mjpeg để có thể xem ảnh realtime trên các ứng dụng khác

Public serverView As New ImageStreamingServer()

‘Khởi tạo đối tượng lắng nghe tại địa chỉ IP và cổng được nhập vào Listener = New Sockets.TcpListener(IPAddress.Parse(cbIpAddress.Text), txtCameraPort.Text)

‘Khởi tạo tiến trình server

serverThread = New Threading.Thread(AddressOf AcceptClients) ‘Bắt đầu lắng nghe

Listener.Start() ‘Bắt đầu tiến trình serverThread.Start()

‘Khởi tạo tiến trình streaming video

serverView = New ImageStreamingServer() ‘Bắt đầu tiến trình streaming video

serverView.Start(IPAddress.Parse(cbIpAddress.Text), txtViewerPort.Text)

Khi một thiết bị khởi động lên nó sẽ tự động tạo một kết nối socket tới phần mềm trên máy chủ server thông qua địa chỉ IP và một cổng nhất định đã đƣợc cấu hình sẵn trong thiết bị. Ví dụ: 123.30.178.233:8888 là máy có địa chỉ 123.30.178.233 và cổng 8888.

Khi phần mềm server phát hiện đƣợc một kết nối tới nó sẽ chấp nhận và tạo ra một đối tƣợng quản lý kết nối thuộc lớp ClientConnection rồi đƣa vào danh sách tạm

ClientConnection.clientL.

Private Sub AcceptClients() While True

Try

Dim c As ClientConnection = New

ClientConnection(Listener.AcceptTcpClient) SyncLock ClientConnection.clientL ClientConnection.clientL.Add(c) End SyncLock Catch End Try End While End Sub

3.4.3 Nhận, bóc tách và phân loại đƣợc các gói tin từ các thiết bị gửi về khác nhau rồi lƣu vào CSDL nhau rồi lƣu vào CSDL

Sau khi đã tạo kết nối thành công, mọi quá trình xử lý tiếp theo chƣơng trình giao cho đối tƣợng thuộc lớp ClientConnection xử lý.

Do quá trình bóc tách gói tin phải xử lý đến từng byte dữ liệu nhận đƣợc, nên khi nhận đƣợc dữ liệu nó sẽ tạm thời copy vào mảng dữ liệu dataProcess để đƣa vào hàm xử lý ProccesArray xử lý tiếp.

Array.Copy(data, dataProcess, bytesRead) ProceesArray(dataProcess, 0, bytesRead)

Các bƣớc xử lý dữ liệu trong magnr dataProcess

1. Hàm ProccessArray đƣợc thiết kế đệ quy để quét toàn bộ mảng dữ liệu rồi đƣa vào hàm ProcessByte.

2. Hàm ProcessByte phát hiện ra đoạn dữ liệu của từng gói tin, tiếp theo đƣa dữ liệu gói tin vào hàm ProcessPackage

3. Hàm ProcessPackage xử lý từng gói tin rồi đƣa ra quyết định lƣu vào cơ sở dữ liệu (adsbygoogle = window.adsbygoogle || []).push({});

4. Tùy từng kiểu gói tin sẽ gọi các hàm xử lý cho từng loại gói tin Các loại gói tin và các hàm xử lý tƣơng ứng

Bảng 3.7: Mô tả cách xử lý gói tin nhận đƣợc từ thiết bị gửi về

PACKAGE_TYPE.LOGIN Gói tin đăng nhập Khi nhận được gói đăng nhập, chương trình sẽ bóc tách gói tin và lấy được số imei. Từ số imei của thiết bị gửi lên, chương trình sẽ tìm tất cả các kết nối của người dùng để khai báo nhận sự kiện khi một ảnh đã nhận đầy đủ từ thiết bị và chủ động yêu cầu hiển thị hình ảnh lên web của người dùng.

Và sau đó cập nhật trạng thái kết nối của thiết bị vào cơ sở dữ liệu PACKAGE_TYPE.GPS Gói tin định vị

Gói tin này hiện tại không được sử dụng bởi vì dữ liệu đã được gửi trong gói MERGE

For Each viewer As MjpegWriter In

ClientConnection.clientViewL(allInfo.loginInfo.imei) AddHandler Me.ImageReceived, AddressOf

viewer.ImageReceived

PACKAGE_TYPE.LBS Gói tin thông tin khác Gói tin này hiện tại không được sử dụng bởi vì dữ liệu đã được gửi trong gói MERGE

PACKAGE_TYPE.MERGE Gói tin thông tin tổng hợp

Trong gói tin này chƣa thông tin về GPS và LBS

- Dữ liệu GPS khi nhận đƣợc từ gói tin này sẽ đƣợc biến đổi để ra dạng dữ liệu mà hàm API của bản đồ có thể hiểu đƣợc ta dùng hàm biến đổi nhƣ sau:

- Dữ liệu LBS đƣợc bóc tách nhƣ sau:

Public Sub getGpsInfo(ByVal package() As Byte, ByVal start As Byte)

Dim index As Byte = start

gpsInfo.NumSatellites = package(index) index += 1 gpsInfo.latitude = (package(index) * 256 * 256 * 256 + package(index + 1) * 256 * 256 + package(index + 2) * 256 + package(index + 3)) / 1800000 index += 4 gpsInfo.longitude =(package(index) * 256 * 256 * 256 + package(index + 1) * 256 * 256 + package(index + 2) * 256 + package(index + 3)) / 1800000 index += 4 gpsInfo.speed = package(index) index += 1 gpsInfo.getStatus(package(index)) gpsInfo.getCourse(package(index), package(index + 1)) End Sub

PACKAGE_TYPE.STATUS Gói tin trạng thái

PACKAGE_TYPE.SNR Gói tin thông tin về số vệ tinh

- Bóc tách thông tin về trạng thái định vị, trạng thái nguồn điện và trạng thái mạng của thiết bị

PACKAGE_TYPE.IO_PORT Gói tin xử lý

- Bóc tách thông tin về trạng thái của thiết bị

PACKAGE_TYPE.DRIVER_ID Gói tin mã lái xe

- Chứa thông tin mã của lái xe

PACKAGE_TYPE.IMG_CAM_BEGIN Gói tin Xác định bắt đầu của bức ảnh

- Chứa dữ liệu gói đầu tiên của bức ảnh

PACKAGE_TYPE.IMG_CAM_DATA Gói tin dữ liệu của bức ảnh

- Chƣa thông tin gói tin dữ liệu của bức ảnh

PACKAGE_TYPE.IMG_CAM_END Gói tin kết thúc bức ảnh

- Chứa dữ liệu gói kết thúc của bức ảnh

3.4.4 Ghép các gói tin hình ảnh thành bức ảnh rồi lƣu vào hệ thống file máy tính (adsbygoogle = window.adsbygoogle || []).push({});

Một bức ảnh thƣờng có dung lƣợng từ 20 - 40Kbyte, mà kích thƣớc lý tƣởng để gửi đi với đƣờng truyền GPRS là ~ 1Kbyte, do vậy một bức ảnh bộ vi xử lý phải chia thành nhiều gói nhỏ để truyền đi.

Trong quá trình nhận ảnh ta xử dụng các biến sau:

 Biến current_file_state để xác định đƣợc trạng thái nhận dữ liệu vào file ảnh.

current_file_state = 0 khi chƣa bắt đầu nhận ảnh

current_file_state = 1 khi đã nhận đƣợc gói bắt đầu của bức ảnh.

 Biến current_file_count_package: Số gói tin của bức ảnh hiện tại đang nhận

 Biến current_file_count_package_index để xác định số gói tin ảnh đã nhận đƣợc sau khi nhận gói kết thúc ảnh.

Public Sub getLbsInfo(ByVal package() As Byte, ByVal start As Byte) Dim index As Byte = start

Me.lbsInfo.mcc = package(index) * 256 + package(index + 1) index += 2

Me.lbsInfo.mnc = package(index) index += 1

Me.lbsInfo.lac = package(index) * 256 + package(index + 1) index += 2

Me.lbsInfo.cellId = package(index) * 256 * 256 + package(index + 1) * 256 + package(index + 2)

Các bƣớc nhận một bức ảnh:

1. Nhận thông tin gói tin thông qua hàm ProcessIMGInfo

 Xác định đƣợc số gói tin của bức ảnh gốc đƣa vào biến

current_file_count_package

2. Nhận gói tin bắt đầu của bức ảnh

 Gán biến current_file_state = 1

 Gán biến current_file_count_package_index = 1

 Tạo một stream ảnh ghi gói bắt đầu của ảnh vào ổ cứng

stream = New System.IO.FileStream(ImagePath + "\" + current_file_name, System.IO.FileMode.Append, System.IO.FileAccess.Write,

System.IO.FileShare.ReadWrite)

stream.Write(package, 0, package_count - 4)

3. Nhận gói tin dữ liệu

 Tăng biến current_file_count_package_index lên 1 đơn vị

 Tiếp tục ghi dữ liệu vào stream ảnh

stream.Write(package, 0, package_count - 4) 4. Nhận gói tin kết thúc ảnh

 Gán biến current_file_state = 0

 Tăng biến current_file_count_package_index lên 1 đơn vị

 Ghi gói kết thúc của ảnh vào ổ cứng (adsbygoogle = window.adsbygoogle || []).push({});

 Xác định tỷ lê % mất gói tin của bức ảnh

current_file_count_package_index/current_file_count_package nếu

nhỏ hơn 50% loại bỏ bức ảnh, ngƣợc lại ta sẽ lƣu lại bức ảnh.

current_file_count_package_index += 1

percent = Math.Abs(CInt(current_file_count_package) -

current_file_count_package_index) * 1000 / current_file_count_package If (percent < 50) Then ProcessIMGEND(package, package_count) current_file_state = 0

Dim s As New System.IO.FileStream(FilepathToAppendTo, System.IO.FileMode.Append, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite)

s.Write(Content, 0, length) s.Close()

3.5 Thiết kế phần mềm giám sát hành trình phƣơng tiện trên bản đồ số 3.5.1 Các chức năng chính

- Tích hợp bản đồ số

- Cập nhật vị trí, các thông tin hiện tại của các thiết bị đang quan sát và hiển thị trên bản đồ

- Xem lại hành trình xe trong một khoảng thời gian - Xem lại hình ảnh thiết bị trong một khoảng thời gian - Tìm kiếm thiết bị trong một vùng bán kính

- Báo cáo thống kê thông tin về xe

3.5.2 Tích hợp bản đồ số

Các nhà cung cấp dịch vụ bản đồ số sẽ cung cấp các hàm API sử dụng ngôn ngữ javascript. Để có thể sử dụng các hàm đó ngƣời dùng cần phải đăng ký xin cấp một Key để các hàm API có thể hoạt động.

Để đăng ký với việt bản đồ bạn vào đƣờng link sau để đăng ký: http://maps.vietbando.com/maps/mapapi/register/

Để đăng ký với bản đồ google bạn vào đƣờng link sau để đăng ký: https://developers.google.com/maps/signup?hl=vi

Sau khi đăng ký đƣợc mã bạn có thể khai báo api javascript để có thể sử dụng các hàm API

Ví dụ với Google:

<script

src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;key=AIzaSyBkLKSH 6i2O1bhviG877LCSqLjW7roV0CI&hl=vi" type="text/javascript"></script>

Ví dụ với Vietbando:

<script type="text/javascript"

src="http://www.vietbando.com/maps/API/VBDMapAPI.js?key=OgU0D+rO9mErHnUvznsyeiD31LyIJ2 d/5aBFlCYlR78="></script>

Khởi tạo bản đồ vào một vùng trên trang web

Với google

Dùng hàm map.setCenter(new GLatLng(a.lat, a.lng), a.zoom) để đặt vị trí của bản đồ sẽ hiển thị ở trung tâm và với tỉ lệ phóng to bao nhiêu

Dùng hàm map.addControl để thêm các bảng điều khiển lên bản đồ

Một số hàm khởi tạo khác

mgr = new MarkerManager(map); (adsbygoogle = window.adsbygoogle || []).push({});

mgrReview = new MarkerManager(map); ‘ Khởi tạo quản lý icon xem lại hành trình mgrStopPoint = new MarkerManager(map); ‘ Khởi tạo quản lý icon xem lại hành trình mgrstopcar = new MarkerManager(map); ‘ Khởi tạo quản lý icon xem xe tạm dừng

Hình 3.18: Xem hình ảnh hiện tại của phƣơng tiện

3.5.3 Cập nhật vị trí, các thông tin hiện tại của các thiết bị đang quan sát và hiển thị trên bản đồ thị trên bản đồ

Khi các phƣơng tiện di chuyển, vị trí thay đổi, trạng thái kết nối GPRS, trạng thái định vị GPS, hình ảnh thay đổi sẽ đƣợc cập nhật vào cơ sở dữ liệu. Nhƣng muốn các thông tin đƣợc cập nhật trên web giám sát ta cần phải có một quáy trình truy vấn.

Hàm RefreshCarStatus cứ 15 giây đƣợc gọi lại một lần, nó truy vẫn dữ liệu thông qua đƣờng dẫn /tracker/data/getListGPSInfo.aspx

Khi đƣợc gọi server web sẽ thực hiện truy vấn CSDL rồi trả dữ liệu về dạng chuỗi Json là mảng dữ liệu chứa các đối tƣợng về thông tin xe.

Ví dụ:

Khi lỗi chuỗi trả về có dạng: {"message":"error"} Khi thành công chuỗi trả về có dạng:

[{"CarID":1,"FuelLevel":0,"Speed":0,"Lat":21.036883,"Lng":105.801728,"D_Lat ":-3.8333333336026953E-05,"D_Lng":-1.6666666766695926E- 06,"SOS":false,"NoGPS":false,"NoSignal":true,"SecondNumber":0,"KM":15,"Mech anicSpeed":0,"MechanicKm":0,"LastTimeTracking":"\/Date(1341776199847)\/","L astTimeStatus":"\/Date(1341776160107)\/","LastTimeImage":"\/Date(1315351927 747)\/","Address":"\"Dương Quảng Hàm\"","OpenEngine":false,"BrakeStatus":false,"OpenEngineCurrent":123,"Rout eMistake":false,"OldSignal":0,"AirCondKm":6,"AirCondKmCurrent":0,"SecondAir Cond":0,"CurrentImage":"http://giamsatanninh.vn:8000/?camera=01220700707909 5"},{"CarID":2,"FuelLevel":0,"Speed":0,"Lat":21.036978,"Lng":105.802027,"D_ Lat":-0.00021666666666675383,"D_Lng":4.3333333323403167E- 05,"SOS":false,"NoGPS":true,"NoSignal":true,"SecondNumber":0,"KM":10,"Mecha nicSpeed":0,"MechanicKm":0,"LastTimeTracking":"\/Date(1360166761380)\/","La stTimeStatus":"\/Date(1360171786380)\/","LastTimeImage":"\/Date(13601689207 53)\/","Address":"\"90 Nguyễn Khánh Toàn, Quan Hoa, Cầu Giấy, Hà

Nội\"","OpenEngine":false,"BrakeStatus":false,"OpenEngineCurrent":142,"Rout eMistake":false,"OldSignal":100,"AirCondKm":0,"AirCondKmCurrent":0,"SecondA irCond":0,"CurrentImage":"http://giamsatanninh.vn:8000/?camera=012207007082 255"}]

Dữ liệu nhận về đƣợc xử lý thông qua hai hàm:

UpdateSuperviseCarList(); Cập nhật danh sách xe online, offline mới DisplayMarkersOnMap(); Cập nhật vị trí, trạng thái trên bản đồ

3.5.4 Xem lại hành trình xe trong một khoảng thời gian

Để xem lại quá trình đi của một phƣơng tiện từ thời gian này tới thời gian khác ta xây dựng hàm javascript GetItinerary(carplate, fromdate, todate), hàm này sẽ thực hiện truy vấn dữ liệu thông qua đƣờng dẫn /tracker/data/getItinerary.aspx dữ liệu trả về sẽ là chuỗi Json chứa mảng các điểm mà xe đã đi qua.

Ví dụ:

- Khi lỗi chuỗi trả về có dạng: {"message":"error"}

- Khi thành công chuỗi trả về có dạng: [{"CarID":0,"CarPlate":"14C-

1166","Speed":0,"Lat":21.332190,"Lng":107.399948,"SecondNumber":7 747,"Status":1,"KM":0,"TimeString":"28/08/2011 04:27:21"},

{"CarID":0,"CarPlate":"14C-

1166","Speed":41,"Lat":21.333227,"Lng":107.400589,"SecondNumber": 10,"Status":0,"KM":0,"TimeString":"28/08/2011 07:02:37"}]

Khi ngƣời dùng bấm nút Play sẽ sinh ra một sự kiện gọi tới hàm

ContinueReview(), trong hàm này sẽ gọi tới hàm CeatePolyline(current) để vẽ điểm

ở vị trí current Trong hàm CeatePolyline(current) sẽ tiếp tục gọi đệ quy cho tới khi xe chạy hết các điểm.

Hình 3.19: Vẽ lại hành trình trong một khoảng thời gian từ điểm A tới điểm B

3.5.5 Xem lại hình ảnh thiết bị trong một khoảng thời gian

Để xem lại hình ảnh của một phƣơng tiện từ thời gian này tới thời gian khác ta xây dựng hàm javascript GetListImages (carplate, fromdate, todate), hàm này sẽ thực hiện truy vấn dữ liệu thông qua đƣờng dẫn /tracker/data/getListImage.aspx

hàm này sẽ trả về danh sách các ảnh. Khi bấm vào từng ảnh hình ảnh sẽ đƣợc hiển thị tới ngƣời dùng.

KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN

Kết luận

Để xây dựng đƣợc một sản phẩm có ứng dụng thực tiễn chúng ta cần hiểu biết rất nhiều các công nghệ khác nhau. Muốn sản phẩm tốt và thực sự đi vào sử dụng đƣợc chúng ta cần đầu tƣ nhiều công sức để nghiên cứu tìm ra phƣơng án tối ƣu nhất, đơn giản nhất và hiệu quả nhất. (adsbygoogle = window.adsbygoogle || []).push({});

Để thực hiện đƣợc bài toán này chúng ta cần hiểu biết sâu cả về phần cứng và phần mềm, từ đó tìm ra các phƣơng án giao tiếp giữa phần cứng và phần mềm. Dữ liệu từ các cảm biến đƣợc thu thập thông qua các bộ vi xử lý rồi đƣợc đóng gói thành các gói tin gửi qua môi trƣờng sóng di động không dây GPRS tới một máy chủ có địa chỉ ngoài mạng. Máy chủ nhận đƣợc dữ liệu xử lý và lƣu vào cơ sở dữ liệu. Để dữ liệu có thể thân thiện với ngƣời dung ta cần hiển thị nó trên môi trƣờng web nhƣ bản đồ, bảng biểu,…

Qua luận văn này tôi đã học hỏi và củng cố thêm rất nhiều kiến thức cả về phần cứng và phần mềm. Để từ những nghiên cứu này tôi có thể tiếp tục phát triển và ứng dụng sản phẩm vào trong thực tế giúp ích cho xã hội trong vấn đề giảm thiểu tai nạn giao thông.

Do thời gian làm luận văn có hạn nên không thể tránh khỏi những thiếu sót. Tôi rất mong có đƣợc những đánh giá, góp ý của thầy cô và các bạn để tôi có thể tiếp tục hoàn thiện đề tài, để đƣa sản phẩm tới đời sống giúp ích cho xã hội.

Hƣớng phát triển

Trên cơ sở đã thực hiện đƣợc trên luận văn này, tôi sẽ tiếp tục phát triển hệ thống để có thể đƣa ra ứng dụng thực tiễn.

Một số công việc tiếp theo cần nâng cấp nhƣ sau:

- Hoàn thiện các chức năng quản trị để ngƣời dùng dễ dàng vận hành - Tích hợp thêm một số bản đồ khác

- Tối ƣu hóa tốc độ xử lý của hệ thống, tối ƣu hóa cơ sở dữ liệu - Nâng cao độ ổn định của thiết bị

- Xây dựng hệ thống báo cáo hành trình phƣơng tiện Thiết kế thiết bị nhỏ gọn hơn.

Thiết bị giám sát hành trình và truyền hình ảnh qua sóng di động 3G

Chƣ́c năng:

 Xác định vị trí phƣơng tiện

 Truyền hình ảnh từ camera về trung tâm qua sóng di động 3G

Tính ứng dụng:

 Đƣợc sử dụng trong việc giám sát mục tiêu di động quan trọng nhƣ: Xe chở tiền, xe chở tù nhân, phƣơng tiện cá nhân, tàu thuyền đi trên sông.

Thiết bị truyền hình ảnh tốc độ cao đa luồng qua sóng di động 3G

Chƣ́c năng:

 Đọc luồng video từ camera rồi nén theo chuẩn video H264, dữ liệu tiếp tục đƣợc chia thành nhiều gói tin khác nhau và truyền qua các kênh 3G khác nhau tạo thành kết nối đa luồng tốc độ cao, khi về đến server dữ liệu đƣợc gộp lại để tái tạo lại luồng video.

Các lĩnh vực cụ thể có thể ứng dụng:

Lĩnh vực giao thông: Quay các tình huống giao thông nhƣ các vụ tai

nạn, tắc đƣờng, các điểm bến xe, bến tàu, bến bãi…

Lĩnh vực lao động: Quay các các phiên giao dịch việc làm lƣu động và

truyền về trung tâm theo dõi giám sát

Lĩnh vực phòng chống bão lụt: Truyền hình trực tiếp tình hình bão, lũ,

đê điều, …

TÀI LIỆU THAM KHẢO Tiếng Việt

1. Ngô Diên Tập (2006), Vi điều khiển với lập trình C, Nhà xuất bản Khoa học và Kỹ thuật Hà Nội.

2. Ngô Diên Tập (1999), Vi xử lý trong đo lƣờng và điều khiển, Nhà xuất bản Khoa học và Kỹ thuật Hà Nội.

3. Ngô Diên Tập, Phạm Huy Quỳnh(1999), Lập trình C trong kỹ thuật điện tử, Nhà xuất bản Khoa Học và Kỹ Thuật

4. Trần Quang Vinh, Chử Văn An (2005), Nguyên lý kỹ thuật điện tử, Nhà xuất bản Giáo dục. (adsbygoogle = window.adsbygoogle || []).push({});

5. Trần Quang Vinh (2005), Cấu trúc máy vi tính, Nhà xuất bản Đại Học Quốc Gia Hà Nội.

6. TS. Đỗ Hữu Đức (2011), “Hộp đen - Thiết bị giám sát hành trình xe ô tô”, Tạp chí Đăng kiểm, Cục Đăng kiểm VN, Bộ Giao thông và Vận tải.

Tiếng Anh

1. Andy Wu (March 12, 2003), “ARM SOC Architecture”, Graduate Institute of Electronics Engineering, NTU.

2. Andrew N. SLOSS, Dominic, Chris WRIGHT (San Francisco, 2004), “ARM System”

3. ARM DVI 0010A (October 1996), Introduction to AMBA.

Một phần của tài liệu Hệ thống giám sát hành trình phương tiện sử dụng công nghệ định vị GPS và công nghệ truyền dẫ GPRS (Trang 52)