Untuk menangkap data yang dikirim oleh modem GS10G menggunakan python versi 2.7.13 berikut source code nya yang sudah dilengkapi dengan history log:
import pdb
import socket
import threading
from datetime import timedelta, datetime
import time
import logging
ip = ""
port = ""
logging.basicConfig(filename='server.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def packet_extract(packet_awal, packet, conn, host):
hex_bytes = packet.split(' ')
protocol_bytes = hex_bytes[3:4]
protocol = '0x{:02x}'.format(int(protocol_bytes[0], 16))
if protocol == "0x01":
protocol_type="login"
imei_bytes = hex_bytes[4:12]
imei = ''.join(byte[2:] for byte in imei_bytes)
strHost = str(host)
strHost = strHost.replace("'", "")
strConn = id(conn)
print("[Imei :] " + str(imei))
print("[PACKET LOGIN : " + str(packet))
print("[strHost :] " + str(strHost))
print("[strConn :] " + str(strConn))
logging.info("[Imei :] " + str(imei))
logging.info("[PACKET LOGIN : " + str(packet))
logging.info("[strHost :] " + str(strHost))
logging.info("[strConn :] " + str(strConn))
logging.info("-------------------------------------------")
response_packet = packet_awal
#response_packet = hex_bytes
return True, protocol_type, (imei, response_packet)
elif protocol == "0x22":
#try:
protocol_type = "positioning_data"
speed_bytes = hex_bytes[19:20] # Mengambil byte ke-21 (indeks 20)
speed_hex = speed_bytes[0] # Mengambil byte pertama dari speed_bytes
speed = int(speed_hex, 16)
timestamp_bytes = hex_bytes[4:10] # Mengambil byte dari indeks 5 hingga 10
year_hex = timestamp_bytes[0] # Byte ke-0 mewakili Year
month_hex = timestamp_bytes[1] # Byte ke-1 mewakili Month
day_hex = timestamp_bytes[2] # Byte ke-2 mewakili Day
hour_hex = timestamp_bytes[3] # Byte ke-3 mewakili Hour
minute_hex = timestamp_bytes[4] # Byte ke-4 mewakili Minute
second_hex = timestamp_bytes[5] # Byte ke-5 mewakili Second
# Konversi ke desimal
year = int(year_hex, 16)
month = int(month_hex, 16)
day = int(day_hex, 16)
hour = int(hour_hex, 16)
minute = int(minute_hex, 16)
second = int(second_hex, 16)
# Membuat objek datetime
timestamp = year, month, day, hour, minute, second
# Mengambil byte dari indeks ke-12 hingga ke-15
latitude_bytes = hex_bytes[11:15]
# Bersihkan string dari karakter yang tidak valid dan pisahkan nilai-nilainya
cleaned_bytes = [byte[2:] for byte in latitude_bytes]
# Gabungkan nilai-nilai yang sudah dibersihkan
cleaned_hex = ''.join(cleaned_bytes)
# Konversi nilai heksadesimal yang sudah dibersihkan ke desimal
latitude_decimal = int(cleaned_hex, 16)
# Bagi dengan 1e7 agar nilainya lebih dekat dengan format yang diinginkan
latitude = latitude_decimal / 1e7
print("Protocol : " + protocol_type)
print("Packet positioning data :] " + str(packet))
print("Speed : " + str(speed) + " km/h")
print("Speed : " + str(speed_bytes))
print("Timestamp:" + str(timestamp))
print("Time : " + str(timestamp_bytes))
print("Latitude:" + str(latitude))
print("Latitude DESIMAL:" + str(latitude_decimal))
print("Latitude cleaned_hex:" + str(cleaned_hex))
print("Latitude cleaned_bytes:" + str(cleaned_bytes))
print("Latitude latitude_bytes:" + str(latitude_bytes))
logging.info("Protocol : " + protocol_type)
logging.info("Packet positioning data :] " + str(packet))
logging.info("Speed : " + str(speed) + " km/h")
logging.info("Speed : " + str(speed_bytes))
logging.info("Timestamp:" + str(timestamp))
logging.info("Time : " + str(timestamp_bytes))
logging.info("Latitude:" + str(latitude))
logging.info("Latitude DESIMAL:" + str(latitude_decimal))
logging.info("Latitude cleaned_hex:" + str(cleaned_hex))
logging.info("Latitude cleaned_bytes:" + str(cleaned_bytes))
logging.info("Latitude latitude_bytes:" + str(latitude_bytes))
logging.info("-------------------------------------------")
response_packet = packet_awal
return True, protocol_type, (response_packet)
elif protocol == "0x24":
#try:
protocol_type = "LBS_information"
timestamp_bytes = hex_bytes[4:10]
year_hex = timestamp_bytes[0] # Byte ke-0 mewakili Year
month_hex = timestamp_bytes[1] # Byte ke-1 mewakili Month
day_hex = timestamp_bytes[2] # Byte ke-2 mewakili Day
hour_hex = timestamp_bytes[3] # Byte ke-3 mewakili Hour
minute_hex = timestamp_bytes[4] # Byte ke-4 mewakili Minute
second_hex = timestamp_bytes[5] # Byte ke-5 mewakili Second
# Konversi ke desimal
year = int(year_hex, 16)
month = int(month_hex, 16)
day = int(day_hex, 16)
hour = int(hour_hex, 16)
minute = int(minute_hex, 16)
second = int(second_hex, 16)
# Membuat objek datetime
timestamp = year, month, day, hour, minute, second
print("Protocol : " + protocol_type)
print("PACKET LBS : " + str(packet))
print("Timestamp:" + str(timestamp))
response_packet = packet_awal
return True, protocol_type, (response_packet)
elif protocol == "0x13":
#try:
protocol_type = "status_information"
gsm_bytes = hex_bytes[6:7]
gsm = '0x{:02x}'.format(int(gsm_bytes[0], 16))
if gsm == "0x00":
gsm_signal = "No signal"
elif gsm == "0x01":
gsm_signal = "Extreme weak signal"
elif gsm == "0x02":
gsm_signal = "Weak signal"
elif gsm == "0x03":
gsm_signal = "Good signal"
elif gsm == "0x04":
gsm_signal = "Strong signal"
print("Protocol : " + protocol_type)
print("PACKET STATUS INFORMATION : " + str(packet))
print("GSM SIGNAL DATA: " + str(gsm_bytes))
print("GSM SIGNAL : " + str(gsm_signal))
logging.info("Protocol : " + protocol_type)
logging.info("PACKET STATUS INFORMATION : " + str(packet))
logging.info("GSM SIGNAL DATA: " + str(gsm_bytes))
logging.info("GSM SIGNAL : " + str(gsm_signal))
logging.info("-------------------------------------------")
response_packet = packet_awal
return True, protocol_type, (response_packet)
elif protocol == "0x26":
#try:
protocol_type = "alarm_data"
speed_bytes = hex_bytes[19:20]
speed_hex = speed_bytes[0] # Mengambil byte pertama dari speed_bytes
speed = int(speed_hex, 16)
timestamp_bytes = hex_bytes[4:10] # Mengambil byte dari indeks 5 hingga 11
year_hex = timestamp_bytes[0] # Byte ke-0 mewakili Year
month_hex = timestamp_bytes[1] # Byte ke-1 mewakili Month
day_hex = timestamp_bytes[2] # Byte ke-2 mewakili Day
hour_hex = timestamp_bytes[3] # Byte ke-3 mewakili Hour
minute_hex = timestamp_bytes[4] # Byte ke-4 mewakili Minute
second_hex = timestamp_bytes[5] # Byte ke-5 mewakili Second
# Konversi ke desimal
year = int(year_hex, 16)
month = int(month_hex, 16)
day = int(day_hex, 16)
hour = int(hour_hex, 16)
minute = int(minute_hex, 16)
second = int(second_hex, 16)
# Membuat objek datetime
timestamp = year, month, day, hour, minute, second
# Mengambil byte dari indeks ke-12 hingga ke-15
latitude_bytes = hex_bytes[11:15]
# Bersihkan string dari karakter yang tidak valid dan pisahkan nilai-nilainya
cleaned_bytes = [byte[2:] for byte in latitude_bytes]
# Gabungkan nilai-nilai yang sudah dibersihkan
cleaned_hex = ''.join(cleaned_bytes)
# Konversi nilai heksadesimal yang sudah dibersihkan ke desimal
latitude_decimal = int(cleaned_hex, 16)
# Bagi dengan 1e7 agar nilainya lebih dekat dengan format yang diinginkan
latitude = latitude_decimal / 1e7
longitude_bytes = hex_bytes[15:18]
# Bersihkan string dari karakter yang tidak valid dan pisahkan nilai-nilainya
cleaned_bytes2 = [byte[2:] for byte in longitude_bytes]
# Gabungkan nilai-nilai yang sudah dibersihkan
cleaned_hex2 = ''.join(cleaned_bytes2)
# Konversi nilai heksadesimal yang sudah dibersihkan ke desimal
longi_decimal = int(cleaned_hex2, 16)
# Bagi dengan 1e7 agar nilainya lebih dekat dengan format yang diinginkan
longitude = longi_decimal / 1e7
print("Protocol : " + protocol_type)
print("PACKET ALARM :] " + str(packet))
print("Speed : " + str(speed) + " km/h")
print("Speed : " + str(speed_bytes))
print("Timestamp:" + str(timestamp))
print("Timestamp_bytes : " + str(timestamp_bytes))
print("Latitude:" + str(latitude))
print("Longitude:" + str(longitude))
print("Latitude DESIMAL:" + str(latitude_decimal))
print("Latitude cleaned_hex:" + str(cleaned_hex))
print("Latitude cleaned_bytes:" + str(cleaned_bytes))
print("Latitude latitude_bytes:" + str(latitude_bytes))
logging.info("Protocol : " + protocol_type)
logging.info("PACKET ALARM :] " + str(packet))
logging.info("Speed : " + str(speed) + " km/h")
logging.info("Speed : " + str(speed_bytes))
logging.info("Timestamp:" + str(timestamp))
logging.info("Timestamp_bytes : " + str(timestamp_bytes))
logging.info("Latitude:" + str(latitude))
logging.info("Longitude:" + str(longitude))
logging.info("Latitude DESIMAL:" + str(latitude_decimal))
logging.info("Latitude cleaned_hex:" + str(cleaned_hex))
logging.info("Latitude cleaned_bytes:" + str(cleaned_bytes))
logging.info("Latitude latitude_bytes:" + str(latitude_bytes))
logging.info("-------------------------------------------")
response_packet = packet_awal
return True, protocol_type, (response_packet)
def handle_client(conn, addr):
print("[NEW CONNECTION] " + str(addr) + " connected.")
connected = True
while connected:
try:
packet_awal = conn.recv(8192)
packet_ = ' '.join(['0x{:02x}'.format(ord(byte)) for byte in packet_awal])
print("[PACKET RECEIVE] - [" + str(datetime.now()) + "]: " + packet_)
if packet_:
hex_bytes = packet_.split(' ')
protocol_bytes = hex_bytes[3:4]
protocol = '0x{:02x}'.format(int(protocol_bytes[0], 16))
if protocol == "0x01" or protocol == "0x22" or protocol == "0x24" or protocol == "0x13" or protocol == "0x26":
status, protocol_type, data = packet_extract(packet_awal, packet_, conn, addr)
if status and protocol_type == "login":
try:
conn.send(data[-1])
print("Response from server to terminal device with data " + data[-1])
except Exception as e:
print("Exception while sending response: {e}")
print("Error nih! Ngopi dulu gih biar otak lu cerah dikit!")
if status and protocol_type == "positioning_data":
try:
conn.send(data)
print("Data gps nih bro!")
print("Response from server for report to terminal device with data " + data)
except Exception as e:
print("Exception while sending response: {e}")
if status and protocol_type == "alarm_data":
try:
conn.send(data)
print("Data ALARM nih bro!")
print("Response from server for report to terminal device with data " + data)
except Exception as e:
print("Exception while sending response: {e}")
if status and protocol_type == "LBS_information":
try:
conn.send(data)
print("Data LBS nih bro!")
print("Response from server for report to terminal device with data " + data)
except Exception as e:
print("Exception while sending response: {e}")
if status and protocol_type == "status_information":
try:
conn.send(data)
print("Data STATUS nih bro!")
print("Response from server for report to terminal device with data " + data)
except Exception as e:
print("Exception while sending response: {e}")
else:
conn.close()
except socket.timeout as e:
print("Socket timeout exception: {e}")
print("[Closed] time out from Server")
conn.close()
connected = False
conn.close()
def start(server):
server.listen(5)
print("[LISTENING] Server is listening on " + str(server))
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
print("[ACTIVE CONNECTIONS] {threading.activeCount() - 1} from terminal with host " + str(addr))
print("[RAW DATA] : " + str(conn))
def main():
ip = '0.0.0.0' #isi ip address
port = 0000 #isi port
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((ip, port))
start(server)
if __name__ == "__main__":
main()
Untuk running, silahkan masuk ke folder dimana file di simpan, menggunakan terminal, lalu ketikan python nama_file
Tidak ada komentar:
Posting Komentar