Breaking

Post Top Ad

Pasang Iklan Disini

Sabtu, 27 April 2024

Cara Buat Server Untuk Modem WanWayTech GS10G


 

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

Post Top Ad

Pasang Iklan Disini

Halaman