เซิร์ฟเวอร์ข้อมูล GPS อย่างง่าย
รวบรวมตำแหน่ง GPS จากอุปกรณ์ (สมาร์ทโฟน ตัวติดตาม GPS) เก็บไว้ในฐานข้อมูล SQLite และอนุญาตให้แสดงบนแผนที่ (OSM หรือ Google)
- รับข้อมูลจากอุปกรณ์ผ่าน HTTPS (PHP) หรือแพ็กเก็ต tcp/udp (เซิร์ฟเวอร์ GO)
- สามารถดาวน์โหลดแทร็กที่เก็บไว้เป็นไฟล์ GPX
- อินเทอร์เฟซผู้ดูแลระบบแบบง่ายสำหรับเพิ่มและแก้ไขอุปกรณ์ใหม่
ความต้องการ
- เว็บเซิร์ฟเวอร์ (Apache หรือคล้ายกัน) ซึ่งรองรับการตรวจสอบสิทธิ์ (สำหรับหน้าผู้ดูแลระบบ)
- ติดตั้ง PHP พร้อม SQLITE3 API (เช่น แพ็คเกจ php-sqlite3) และซ็อกเก็ต (เช่น แพ็คเกจ php-sockets)
- คอมไพเลอร์ GO สำหรับบริดจ์ TCP/UDP-HTTP (จำเป็นสำหรับอุปกรณ์ติดตามเชิงพาณิชย์เช่น TK103 หรือ GPS Logger ในโหมด UDP เท่านั้น) จำเป็นต้องมีแพ็คเกจเพิ่มเติม golang.org/x/crypto ติดตั้งด้วย "go get golang.org/x/crypto"
- สคริปต์จาวา GPXViewer โดย Jürgen Berkemeier (โฟลเดอร์
js/GM_utils/
)
การติดตั้ง
- การใช้นักเทียบท่า
- คัดลอกโฟลเดอร์
docker
ไปยังเซิร์ฟเวอร์ของคุณ (เปลี่ยนชื่อเช่นเป็น gps-server
) - คัดลอกโฟลเดอร์
webapp
(และหากจำเป็น tcp_udp_http_bridge
) ลงในไดเรกทอรี gps-server
- ทำตามคำแนะนำในโฟลเดอร์นักเทียบท่า
- ติดตั้งแต่ละส่วนประกอบแยกกัน
- คัดลอกไฟล์ทั้งหมดในโฟลเดอร์ webapp ไปยังโฟลเดอร์ web space (ใน ./gpstracker/ ต่อไปนี้จะถือว่า)
- สร้างรายการที่เกี่ยวข้องในการกำหนดค่าเว็บเซิร์ฟเวอร์เพื่อให้สามารถเข้าถึงเว็บและ php เพื่อทำงานได้
- ปรับไฟล์ .htaccess ระดับบนสุด (Apache) หรือจำกัดการเข้าถึงในการกำหนดค่า Nginx (ตัวอย่าง nginx.conf)
- ตั้งค่าการตรวจสอบสิทธิ์สำหรับอินเทอร์เฟซผู้ดูแลระบบ
- ในไฟล์
auth/.htpasswd
admin
ผู้ใช้คนเดียวพร้อม changeme
รหัสผ่านรวมอยู่ด้วย - เส้นทางไปยังไฟล์ .htpasswd จะต้องได้รับการปรับใน
admin/.htaccess
ต้องใช้เส้นทางที่แน่นอน! - อัปเดต .htpasswd ด้วยผู้ใช้/รหัสผ่านใหม่ ควรใช้บรรทัดคำสั่งดีที่สุด
htpasswd /path-to-htpasswd-file/.htpasswd myusername mypassword
หรือเครื่องมือสร้างออนไลน์
- แก้ไข scripts/config.php: ปรับการตั้งค่า
- กำหนดเขตเวลา แผนที่ที่จะใช้ รูปแบบวันที่/เวลา
- ระบุช่วงเวลาที่ไม่มีการเคลื่อนไหวเพื่อให้รับรู้เป็นการหยุดชั่วคราว
- ระบุเวลาที่ไม่มีการเคลื่อนไหวเพื่อเริ่มแทร็กใหม่
- เปิดใช้งานหรือปิดใช้งานการเริ่มต้นเซิร์ฟเวอร์ GO ของสะพาน tcp/udp
- รับ javascript GPXViewer จาก
https://www.j-berkemeier.de/GPXViewer/
และคัดลอกโฟลเดอร์ GM_Utils ไปที่ gpstracker/js/
- ในการใช้ Google Maps จำเป็นต้องใช้คีย์ API ในการค้นหา
google maps api key application
- แก้ไขไฟล์
./js/GM_Utils/GPX2GM_Defs.js
และยกเลิกการใส่เครื่องหมายบรรทัดที่มี JB.GPX2GM.GM_Api_key
และเพิ่มคีย์ API เป็นค่า
- TCP/UDP-HTTP-บริดจ์
- เปิด/ปิดการใช้งานใน scripts/config.php
- คอมไพล์โค้ดด้วย GO ใน tcp_udp_http_bridge (go build)
- คัดลอกไฟล์ปฏิบัติการไปยังไดเร็กทอรี exe บนเว็บสเปซ
- ปรับ config.php ตามนั้น (ชื่อและพาธของ/เพื่อเรียกทำงาน)
- เรียกอินเทอร์เฟซผู้ดูแลระบบเพื่อเริ่มเซิร์ฟเวอร์
- เพิ่มรายการ crontab เพื่อตรวจสอบหนึ่งครั้งต่อชั่วโมงว่าเซิร์ฟเวอร์กำลังทำงานอยู่หรือไม่ (ต้องใช้ "wget")
1 * * * * /usr/bin/wget -O /dev/null -o /dev/null https://servername/gpstracker?checkserver=SECRETKEY >/dev/null 2>&1
- ไฟล์ฐานข้อมูลจะถูกสร้างขึ้นโดยอัตโนมัติ
ใส่อุปกรณ์ติดตาม
- เปิดหน้า https://servername/gpstracker/admin แล้วกรอกแบบฟอร์ม
ดูข้อมูล
- เปิดหน้า https://servername/gpstracker?id=ID-of-device
- พารามิเตอร์ทางเลือกเพื่อเลือกช่วงเวลา: dt= เป็น min(m), hour(h), days(d) หรือ years(y) เช่น "10d" เป็นเวลา 10 วัน
อุปกรณ์ติดตาม
- แอพติดตามที่สอดคล้องกับ OpenGTS หรือ Traccar ใด ๆ จะใช้งานได้
- ตัวอย่าง: GPS Logger สำหรับ Android, Traccar Client ...
- เครื่องบันทึก GPS สำหรับ Android
- เปิดการตั้งค่า -> รายละเอียดการบันทึก -> "เข้าสู่ระบบเซิร์ฟเวอร์ OpenGTS" เพื่อเปิดใช้งานการติดตามแบบเรียลไทม์
- เซิร์ฟเวอร์: "<servername.com>"
- พอร์ต: 443
- วิธีการสื่อสาร: HTTPS
- เส้นทางเซิร์ฟเวอร์: /gpstracker
- ID อุปกรณ์: ID ที่คุณป้อนในอินเทอร์เฟซผู้ดูแลระบบ
- ทดสอบการสื่อสารโดยคลิก "ตรวจสอบใบรับรอง SSL"
- วิธีการสื่อสารทางเลือก UDP: ใช้หมายเลขพอร์ตที่กำหนดใน config.php (ค่าเริ่มต้น 20202) -> ต้องการให้เซิร์ฟเวอร์ทำงาน
- หากค่าใช้จ่ายในการส่งข้อมูลมือถือเป็นปัญหา UDP คือตัวเลือกที่ดีที่สุด เนื่องจากปริมาณข้อมูลมีน้อย
- การตั้งค่า -> ประสิทธิภาพ
- เลือกช่วงเวลา (เช่น 20 วินาที)
- ให้เปิดใช้งาน GPS ไว้ระหว่างการแก้ไข: เหมาะสมในช่วงเวลาสั้นๆ แต่ต้องใช้แบตเตอรี่มากขึ้น
- กำหนดระยะทางระหว่างจุดข้อมูล 10 จุด: ไม่ส่งข้อมูล เมื่อระยะทางต่ำกว่าขีดจำกัดที่กำหนด (เช่น 10 เมตร)
- เปิดใช้งาน "หยุดการบันทึกหากตรวจไม่พบการเคลื่อนไหว"
- แอพไคลเอนต์ Owntracks
- แอปส่งข้อมูลตำแหน่งไปยังเซิร์ฟเวอร์ MQTT (สามารถเข้ารหัสได้) หัวข้อ:
owntracks/<username>
เช่น owntracks/gps
- รหัสบริดจ์ซึ่งแยกข้อมูลจากเซิร์ฟเวอร์ MQTT และส่งไปยัง Simple GPS Data Server มีอยู่ภายใต้
mqtt-bridge
- ตัวอย่างนี้รวมถึงเซิร์ฟเวอร์ MQTT ด้วย
- นี่คือการใช้งานนักเทียบท่าอย่างแท้จริง
- วิธี
- ปรับไฟล์
docker-compose.yml
ให้เป็นการตั้งค่าของคุณหรือตั้งค่าตัวแปรสภาพแวดล้อมที่เกี่ยวข้อง (เซิร์ฟเวอร์ รหัสผ่าน ข้อมูลลับ ...) - สร้างคอนเทนเนอร์ของโค้ดบริดจ์
docker-compose build
- เริ่มคอนเทนเนอร์
docker-compose up -d
- ตั้งชื่อผู้ใช้และรหัสผ่าน:
sudo docker exec gps-mqtt sh -c "mosquitto_passwd -b mosquitto/config/password.txt <username> <password>"
- อุปกรณ์เชิงพาณิชย์มักจะส่งตำแหน่ง GPS ผ่าน tcp/udp สิ่งนี้ต้องการให้เซิร์ฟเวอร์ทำงาน
- ตั้งค่าเซิร์ฟเวอร์ TCP/IP และพอร์ตใน config.php
- กำหนดค่าเซิร์ฟเวอร์และพอร์ตในอุปกรณ์ติดตาม (โดยปกติจะทำผ่าน SMS ตรวจสอบคู่มือวิธีการทำ)
- เซิร์ฟเวอร์จะต้องได้รับการคอมไพล์และวางไว้ในไดเร็กทอรี ./exe/
- คัดลอก
devices.config
ไปยังไดเร็กทอรี ./exe/ ประกอบด้วยนิพจน์ทั่วไปสำหรับรูปแบบที่แตกต่างกัน (เช่น OpenGTS, TK103)- สามารถเพิ่มอุปกรณ์เพิ่มเติมได้
- รันเซิร์ฟเวอร์ด้วยตัวเลือก -verbose เพื่อศึกษารูปแบบและเพิ่มนิพจน์ทั่วไปที่เกี่ยวข้องให้กับ
devices.config
- เซิร์ฟเวอร์จะเริ่มทำงานโดยอัตโนมัติเมื่อเปิดส่วนต่อประสานผู้ดูแลระบบ
- สิ่งนี้กำหนดให้ PHP นั้นได้รับอนุญาตให้เริ่มเซิร์ฟเวอร์ผ่านการเรียก "exec()"
- หากไม่สามารถทำได้ เซิร์ฟเวอร์จะต้องเริ่มต้นด้วยตนเองหรือผ่านงาน cron
การกำหนดค่าแผนที่
- แผนที่และแทร็กรวมอยู่ในสคริปต์ java GPX Viewer โดยJürgen Berkemeier (https://www.j-berkemeier.de/GPXViewer/)
- สามารถควบคุมรูปลักษณ์และพฤติกรรมได้โดยการเพิ่มพารามิเตอร์เสริม (แสดงอยู่ในหน้าเว็บด้านบน) ลงในเทมเพลต html ใน
html/gpxviewer_html.template
- แผนที่เริ่มต้นถูกเลือกใน config.php (OpenStreet-Map (OSM,OSMDE) , Google-Map (Karte))
- ในการใช้ Google Maps จำเป็นต้องมีคีย์ API ต้องป้อนคีย์ลงในสคริปต์
js/GM_utils/GPX2GM_Defs.js
เซิร์ฟเวอร์ TCP/UDP
รหัส GO จะเปิดพอร์ตและยอมรับการเชื่อมต่อผ่าน TCP และ UDP เซิร์ฟเวอร์เพียงแยกย่อยแพ็กเก็ตและ (ปกติ) ไม่ตอบสนอง ข้อมูลที่ได้รับจะถูกจับคู่โดยนิพจน์ทั่วไปของรูปแบบอุปกรณ์ที่รู้จัก (./exe/devices.config) หากพบรายการที่ตรงกันและทราบรหัสอุปกรณ์ ข้อมูล GPS จะถูกแปลงเป็นรูปแบบที่โค้ด PHP คาดไว้ และส่งผ่านการเชื่อมต่อ HTTP ไปยังเซิร์ฟเวอร์ (เช่น localhost/gpstracker/index.php) ตำแหน่ง GPS จะถูกเก็บไว้ในฐานข้อมูลแล้ว พารามิเตอร์ที่จะส่งผ่านไปยังเซิร์ฟเวอร์:
-port <portnumber>
-httpserver <server name - e.g. localhost>
-urlpath <path on server>
-key <secret key in order to check the status of the server - used by PHP>
-verbose - print raw messages, which allows to determine the format send by the device
ตัวอย่างการโทร
nohup tcp_udp_http_bridge -port 20202 -httpserver localhost -urlpath /gpstracker/index.php -key 123456
การเข้ารหัสข้อมูล UDP
เซิร์ฟเวอร์ tcp/udp สามารถจัดการแพ็กเก็ตที่เข้ารหัส AES ได้ สิ่งนี้ต้องใช้ PSK ทั่วทั้งเซิร์ฟเวอร์ใน . ./exe/encrypt_psk.config
ขณะนี้สิ่งนี้ถูกนำไปใช้ในเครื่องบันทึก GPS สำหรับ Android เวอร์ชันส่วนตัวของฉันเท่านั้น
ข้อมูลเกี่ยวกับรูปแบบข้อมูล GPS
อุปกรณ์ส่วนใหญ่ให้ข้อมูลเป็นบันทึก NMEA GPRMC (ดู https://de.wikipedia.org/wiki/NMEA_0183)
$GPRMC,162614,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A*13
identifier, time, Active/Void, latitude, N/S, longitude, E/W, speed, angle, date, magnetic deviation, E/W, signal integrity, check sum
ละติจูดและลองจิจูดแสดงเป็นองศาและนาที (ddmm.mmmm) ซึ่งจัดเก็บโดยเซิร์ฟเวอร์เป็นองศา ความเร็วที่กำหนดในหน่วยนอตและจัดเก็บโดยเซิร์ฟเวอร์ในหน่วยเมตร/วินาที
มักใช้บันทึก GPRMC แบบลดขนาด (ไม่มีการเบี่ยงเบนทางแม่เหล็ก) พร้อมด้วยตัวระบุเพิ่มเติมสำหรับประเภทอุปกรณ์ อุปกรณ์ที่ระบุ ข้อมูลที่ระบุมักเป็นหมายเลข IMEI ของอุปกรณ์ เนื่องจาก GPRMC ขาดระดับความสูงและความเที่ยงตรง/แม่นยำ บางครั้งจึงถูกเพิ่มเข้าไป ผลรวมเช็คคำนวณโดย XOR ของอักขระทั้งหมด (รหัส ASCII) ระหว่าง $ และ *
รูปแบบ HTTP
https://my-server.com?time=UTC&lat=LATITUDE&lon=LONGITUDE&alt=ALTITUDE&acc=ACCURACY&id=DEVICEID (lat and lon given in degree 0-180 and 0-360, respectively) or
https://my-server.com?id=DEVICEID&gprmc=<GPRMC-RECORD> or
รูปแบบ TCP/UDP
เครื่องบันทึก GPS สำหรับ Android (รูปแบบ OpenGTS)
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20
username/deviceid/GPRMC-RECORD
เครื่องบันทึก GPS สำหรับ Android พร้อมระดับความสูงต่อท้าย
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20,alt=100.5
อุปกรณ์เชิงพาณิชย์ (TCP/UDP)
มีรูปแบบที่แตกต่างกันออกไป โดยปกติแล้วส่วนหัวแบบสั้นประกอบด้วยอักขระ 2-3 ตัวตามด้วยหมายเลข IMEI/หมายเลขประจำตัวอุปกรณ์ของอุปกรณ์ สถานะอักขระ 2 ตัว และบันทึก GPRMC ที่สมบูรณ์ไม่มากก็น้อย (ไม่มีส่วนหัว $GPRMC) บิตสถานะบางส่วนอาจถูกเพิ่มในตอนท้าย อุปกรณ์ส่วนใหญ่จะส่งข้อความรูปหัวใจเพิ่มเติมซึ่งมีรูปแบบที่แตกต่างกัน อุปกรณ์บางอย่างจำเป็นต้องเข้าสู่ระบบเพื่อเริ่มการสื่อสาร โปรโตคอลนี้รวมอยู่ในเซิร์ฟเวอร์และการกำหนดค่าอุปกรณ์ แต่ขณะนี้ยังไม่ผ่านการทดสอบ ปัจจุบันมีเพียงอุปกรณ์ TK103B H02 เท่านั้นที่รวมอยู่ใน devices.config
ตัวอย่างข้อความบอกตำแหน่ง GPS ผ่าน UDP
*HQ,7893267561,V1,050316,A,2212.8745,N,11346.6574,E,14.28,028,220902,FFFFFFFF#
HQ คือ ID ผู้ผลิต ตามด้วยหมายเลขประจำตัวและประเภทข้อความ "V1" บันทึก GPRMC ไม่มีส่วนหัว $GPRMC ค่าเบี่ยงเบนแม่เหล็ก และผลรวมเช็ค ในตอนท้ายของข้อความจะมีการระบุข้อมูลสถานะ