Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/bin/python
- # -*- coding: utf-8 -*-
- #
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # APRS (c) by Dirk Unverzagt, DL8AAX
- # http://www.http://www.modellbau-yodi.de/aax/
- #
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- from Tkinter import *
- from time import strptime
- from calendar import timegm
- from ScrolledText import *
- import tkMessageBox
- import tkSimpleDialog
- import thread
- import time
- import os
- from socket import *
- import string
- import sys
- import requests
- #import einstellungen
- from PIL import Image, ImageTk
- from tkFileDialog import *
- version = '0.01'
- myHome= os.environ.get("HOME")
- ## globale Variablen
- mys = None
- thread_flag = 1
- rbtn_a=1
- af=0
- lastbtime=0
- imageDisconnect='network_wired_disconnected.jpg'
- imageConect='/usr/share/icons/gnome/24x24/status/connect_established.png'
- imageExit='/usr/share/icons/gnome/32x32/actions/application-exit.png'
- imageSendBake='/usr/share/icons/gnome/32x32/actions/go-home.png'
- global e1
- global e2
- global confi
- global einst_zeige
- global iststatus
- global verbunden
- verbunden=0
- einst_zeige =0
- istlogin=0
- istrxsave=0
- address = '195.190.142.207'
- port = 14577
- clx_call= 'DB0ERF-5'
- ABOUT_TEXT = "a text"
- DISCLAIMER = "b text"
- data=None
- def lade_liz():
- global licence
- try:
- lic = open("license.txt","r")
- licence = lic.read()
- lic.close()
- except:
- licence="LICENCE.txt is not read..."
- def About():
- abut=Toplevel()
- abut.title("About")
- abut.geometry("480x320")
- abut.configure(bg='#C9C9C9')
- abut.resizable(0,0)
- ab1=Label(abut,text="pyAPRS",bg="#C9C9C9",font=("Sans",16,"bold"))
- ab1.pack()
- ab1_1=Label(abut,text="python APRS for HAM Users",bg="#C9C9C9",font=("Sans",12))
- ab1_1.pack()
- ab2=Label(abut,text="version v"+version,bg="#C9C9C9",font=("Sans",10))
- ab2.pack()
- ab3=Label(abut,text="author: Dirk Unverzagt, DL8AAX",bg="#C9C9C9",font=("Sans",10))
- ab3.pack()
- ab5=Label(abut,text="published in 00.2017",bg="#C9C9C9",font=("Sans",10))
- ab5.pack()
- lade_liz()
- abscrollbar = Scrollbar(abut,orient=VERTICAL)
- abscrollbar.pack(side=RIGHT, fill=Y)
- ab4=Text(abut,font=("Courier",8),yscrollcommand=abscrollbar.set)
- abscrollbar.config(command=ab4.yview)
- ab4.pack()
- ab4.insert(INSERT,licence)
- ab4.config(state=DISABLED)
- abut.protocol("WM_DELETE_WINDOW", about)
- abut.withdraw()
- def speichern():
- #print "passwort="+e2.get()
- lic = open(myHome+"/pyaprs/.einstellungen.txt","w")
- lic.write( "# Konfigurationsdatei für pyaprs "+version+" \n")
- lic.write( "# (c) Dirk Ubcerzagt, DL8AAX \n")
- lic.write( "# \n")
- lic.write( "call="+e1.get()+"\n")
- lic.write( "name="+e2.get()+"\n")
- lic.write( "LängengradOst="+e4.get()+"\n")
- lic.write( "LängengradWest="+e5.get()+"\n")
- lic.write( "Bakentyp=" +e6.get()+"\n")
- lic.write( "Symbolart=" +e7.get()+"\n")
- lic.write( "Symbolbild="+e8.get()+"\n")
- lic.write( "Bakentext=" +e9.get()+"\n")
- lic.write( "Kommentar=" +e10.get()+"\n")
- lic.write( "passwort=" +e3.get()+"\n")
- lic.write( "serverHost="+e11.get()+"\n")
- lic.write( "serverPort="+e12.get()+" \n")
- lic.write( "Adresse="+e13.get()+"\n")
- lic.write( " \n")
- lic.write( " \n")
- lic.close()
- confi.destroy()
- def confiquit():
- confi.destroy()
- def prgende():
- global verbunden
- if verbunden==1:
- mys.close()
- verbunden =0
- fenster.quit()
- fenster.destroy()
- def einst():
- global einst_zeige
- if einst_zeige==0:
- confi.update()
- confi.deiconify()
- einst_zeige=1
- lieskonfi()
- else:
- confi.withdraw()
- einst_zeige=0
- #speichern()
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Fenster zu Programmeinstellungen
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- confi =Tk()
- #confi =Toplevel()
- confi.protocol("WM_DELETE_WINDOW", confi)
- confi.title("pyAPRS")
- confi.geometry('320x440')
- if einst_zeige==0:confi.withdraw()
- label_call = Label(confi, text="Call", height=0, width=10).grid(row=0, column=0, sticky=W, pady=4)
- label_call = Label(confi, text="Name", height=0, width=10).grid(row=1, column=0, sticky=W, pady=4)
- label_pass = Label(confi, text="passwort", height=0, width=10).grid(row=2, column=0, sticky=W, pady=4)
- label_west = Label(confi, text="Längengrad Ost", height=0, width=13).grid(row=3, column=0, sticky=W, pady=4)
- label_ost = Label(confi, text="Längengrad West", height=0, width=14).grid(row=4, column=0, sticky=W, pady=4)
- label_bt = Label(confi, text="Bakentyp", height=0, width=14).grid(row=5, column=0, sticky=W, pady=4)
- abel_sart = Label(confi, text="Symbolart", height=0, width=14).grid(row=6, column=0, sticky=W, pady=4)
- abel_sbild = Label(confi, text="Symbolbild", height=0, width=14).grid(row=7, column=0, sticky=W, pady=4)
- label_btext= Label(confi, text="Bakentext", height=0, width=14).grid(row=8, column=0, sticky=W, pady=4)
- label_komm = Label(confi, text="Kommentar", height=0, width=14).grid(row=9, column=0, sticky=W, pady=4)
- label_sev = Label(confi, text="serverHost", height=0, width=14).grid(row=10, column=0, sticky=W, pady=4)
- label_sport= Label(confi, text="serverPort", height=0, width=14).grid(row=11, column=0, sticky=W, pady=4)
- label_adr = Label(confi, text="Adresse", height=0, width=14).grid(row=12, column=0, sticky=W, pady=4)
- e1=Entry(confi,width=10) # call
- e1.grid(row=0, column=1)
- e2=Entry(confi,width=10) # name
- e2.grid(row=1, column=1)
- e3=Entry(confi,width=10) # passw
- e3.grid(row=2, column=1)
- e4=Entry(confi,width=12) # lo
- e4.grid(row=3, column=1)
- e5=Entry(confi,width=12) # lw
- e5.grid(row=4, column=1)
- e6=Entry(confi,width=4) # Bakentyp
- e6.grid(row=5, column=1)
- e7=Entry(confi,width=4) # Symbolart
- e7.grid(row=6, column=1)
- e8=Entry(confi,width=4) # Symbolbild
- e8.grid(row=7, column=1)
- e9=Entry(confi,width=20) # Bakentext
- e9.grid(row=8, column=1)
- e10=Entry(confi,width=20) # Kommentar
- e10.grid(row=9, column=1)
- e11=Entry(confi,width=15) # serverHost
- e11.grid(row=10, column=1)
- e12=Entry(confi,width=15) # serverPort
- e12.grid(row=11, column=1)
- e13=Entry(confi,width=20) # Adresse
- e13.grid(row=12, column=1)
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Eingabefelder mit Daten aus der einstellungendatei füllen
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def lieskonfi():
- file = open(myHome+"/pyaprs/.einstellungen.txt","r")
- for line in file:
- #print(line.rstrip())
- if '#' in line.rstrip():
- print
- else:
- l=line.rstrip()
- larr=l.split('=')
- if 'call' in l:
- e1.delete(0,END)
- e1.insert(0,larr[1])
- elif 'name' in l:
- e2.delete(0,END)
- e2.insert(0,larr[1])
- elif 'passwort' in l:
- e3.delete(0,END)
- e3.insert(0,larr[1])
- elif 'LängengradOst' in l:
- e4.delete(0,END)
- e4.insert(0,larr[1])
- elif 'LängengradWest' in l:
- e5.delete(0,END)
- e5.insert(0,larr[1])
- elif 'Bakentyp' in l:
- e6.delete(0,END)
- e6.insert(0,larr[1])
- elif 'Symbolart' in l:
- e7.delete(0,END)
- e7.insert(0,larr[1])
- elif 'Symbolbild' in l:
- e8.delete(0,END)
- e8.insert(0,larr[1])
- elif 'Bakentext' in l:
- e9.delete(0,END)
- e9.insert(0,larr[1])
- elif 'Kommentar' in l:
- e10.delete(0,END)
- e10.insert(0,larr[1])
- elif 'serverHost' in l:
- e11.delete(0,END)
- e11.insert(0,larr[1])
- elif 'serverPort' in l:
- e12.delete(0,END)
- e12.insert(0,larr[1])
- elif 'Adresse' in l:
- e13.delete(0,END)
- e13.insert(0,larr[1])
- file.close()
- #~~~
- btn_save=Button(confi, text='Speichern', command=speichern ).grid(row=13, column=0, sticky=W, pady=4)
- btn_quit=Button(confi, text='Abbrechen', command=einst ).grid( row=13, column=1, sticky=W, pady=4)
- def karte():
- print "Karte zeigen"
- def verbinde_(event):
- verbinde()
- def machmaidentsatz():
- user=e1.get()
- user=user.upper()
- user=user.replace ("\r", "")
- pwt=e3.get()
- pwt=pwt.replace ("\r", "")
- tx_text="user "+user+" pass "+pwt+" vers pyaprs "+version
- senden(tx_text)
- def verbindung():
- global thread_flag
- ## Verbindung zum Server aufbauen und periodisch abfragen
- if thread_flag:
- thread.start_new_thread(verbinden, ())
- thread_flag = 0
- def verbindema():
- global verbunden,asciiport,istlogin
- if verbunden == 0:
- verbindung()
- machmaidentsatz()#identifikation senden
- verbunden=1
- else:
- mys.close()
- verbunden =0
- istlogin=0
- #print "verbindung getrennt"
- iststatus.config(text="Verbindung getrennt mit "+ address + ', Port: ' + asciiport)
- def verbinden():
- global mys, thread_flag,asciiport,istlogin,istrxsave,savedatas,rxsavedatabytes
- mys=socket(AF_INET,SOCK_STREAM)
- asciiport = e12.get()
- asciiport = asciiport.replace ("\r", "")
- address=e11.get()
- address=address.replace ("\r", "")
- iststatus.config(text="Verbinde mit "+ address + ', Port: ' + asciiport)
- #print "Verbinde mit "+ address + ', Port: ' + asciiport
- #textfenster.insert(END, '\n' + 'Verbinde mit ' + address + ', Port: ' + asciiport)
- #textfenster.see(END)
- try:
- mys.connect((address,port))
- verbunden = 1
- ## Verbindung misslungen!
- except:
- iststatus.config(text='Keine Verbindung möglich, Server ist abgestürzt!')
- verbunden = 0
- # los gehts
- else:
- iststatus.config(text="Verbinden mit "+ address + ', Port: ' + asciiport)
- im = Image.open(imageConect)
- tk_image = ImageTk.PhotoImage(im)
- #btn_con.image=tk_image
- while 1:
- try:
- ## Hier muss der Empfangen-Befehl hin!
- data=mys.recv(1024)
- #data2=Data
- #Verbindung beenden
- if data == 'OAIC':
- #print 'Verbindung beendet . . .'
- iststatus.config(text='Verbindung beendet . . .')
- mys.close()
- verbunden = 0
- thread_flag = 1
- break
- else:
- #print 'Daten'+time.strftime("%d.%m.%Y %H:%M:%S")+'\r'+data
- if istrxsave==1: # Alles was reinkommt speichern
- if len(data)>0:
- rxsavedatabytes=rxsavedatabytes+len(data)
- savedatas.write(data)
- #print 'Speicherere RX Daten '+str(rxsavedatabytes)
- iststatus.config(text='Speichere RX Daten '+str(rxsavedatabytes))
- if istlogin==0: # 0= identifizierung noch nichz gesendet
- machmaidentsatz() # identifikation senden
- sendbake() # und gleich eine Bake mit GPS Koordinaten hinterher damit der Datenflus beginnt
- #print 'sende login'
- istlogin=1
- # Eingehende Daten filtern
- data = data.replace ("\r", "") # Zeilenumbruch am Ende entfernen
- if rbtn_a.get()==1: # Nur Rohdaten ausgeben
- textfenster.insert(END, data)
- textfenster.see(END)
- elif rbtn_a.get()==2: # mur MSG Daten ausgeben
- date2=data
- elif rbtn_a.get()==3: # mur MSG Daten für mich ausgeben
- date2=data
- else:
- print data
- #data=''
- time.sleep(0.2)
- except:
- break ## was schiefgelaufen, das wars . . .
- iststatus.config(text='Hm.. mit der Verbindung ist was schief gelaufen...')
- def senden(tx_text):
- global mys, verbunden
- ##
- if verbunden==1:
- # msg_liste.addEntry(msg)
- tx_text = tx_text + "\n"
- mys.send(tx_text)
- textfenster.insert(END, tx_text)
- textfenster.see(END)
- iststatus.config(text="sende:" + tx_text)
- #print "sende:" + tx_text
- else:
- iststatus.config(text="!!!FEHLER!!! Konte nicht senden, keine Verbindung zum Server!")
- def sendbake():
- global lastbtimehuman,lastbtime
- #
- # Source Path Header — “AEA” Format
- #
- # DL8AAX >APRS,TCPIP*:!5138.00N/00952.98Ey DL8AAX Pytonscript www.modellbau-yodi.de/aax/
- # -absender- !---GPS--!--GPS----! --------------Bakentext----------------------
- # ! ! --y=
- # ! -- /=
- # --!=
- #----------------------------------------------------------------------------------------------------
- # AX.25 UI-FRAME FORMAT !
- #----------------------------------------------------------------------------------------------------
- # Flag ! Destination ! Source ! Digipeater ! Control ! Protocol !INFORMATION FIELD! FCS!Flag!
- # ! Addresses ! Addresses ! Addresses ! Field (UI) ! ID ! ! ! !
- #----------------------------------------------------------------------------------------------------
- # 1 ! 7 ! 7 ! 0 - 56 ! 1 ! ! ! 1-256 ! 2 ! 1!
- #----------------------------------------------------------------------------------------------------
- if verbunden==1:
- user=e1.get()
- user=user.upper()
- user=user.replace ("\r", "")
- adr=e13.get()
- adr=adr.replace ("\r", "")# APRS,TCPIP*:
- lo=e4.get() # länge ost 00952.98E
- lo=lo.replace ("\r", "")
- lw=e5.get() # länge west
- lw=lw.replace ("\r", "")
- symbolart=e7.get()
- symbolart=symbolart.replace ("\r", "")
- baketyp=e6.get()
- baketyp.replace ("\r", "")
- sbild=e8.get()
- sbild=sbild.replace ("\r", "")
- Bakentext=e9.get()
- Bakentext.replace ("\r", "")
- #
- tx_text=user +">"+ adr + ":"+ baketyp +lw+symbolart+lo+sbild+Bakentext
- #print tx_text
- istbtime=int(time.strftime("%H%M%S"))
- print str(istbtime)+">"+str(lastbtime+(30*15))
- if istbtime>lastbtime+(60*15) : # 15 min pause :)
- senden(tx_text)
- textfenster.insert(END, tx_text+"\r")
- #textfenster.config(foreground="blue")
- lastbtime=int(time.strftime("%H%M%S"))
- lastbtimehuman=time.strftime("%H:%M")
- else:
- iststatus.config(text="Bake wurde doch erst um "+lastbtimehuman+" gesendet")
- def rxsave():
- global istrxsave,savedatas
- if istrxsave==0:
- savedatei=asksaveasfilename(parent=fenster, title='Speichern unter...',initialdir=myHome+"/pyaprs/")
- if len(savedatei)>0:
- #print savedatei
- savedatas = open(savedatei,"w")
- istrxsave=1
- else:
- savedatas.close()
- istrxsave=0
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Hauptfenster
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- fenster = Toplevel()
- fenster.title("pyAPRS")
- fb='640'
- fh='425'
- fenster.geometry(fb+"x"+fh)
- topframe = LabelFrame(fenster, text="top",padx=10, pady=5,bg='#C9C9C9')#.place(x = 5, y = 5, height= 30,width=int(fb)-10)
- topframe.pack(fill=X, expand=1)
- ausgabelabel = LabelFrame(fenster,text="Ausgabe",padx=10, pady=5,bg='#C9C9C9' )#.place(x = 5, y = 40, height= 230,width=int(fb)-10)
- ausgabelabel.pack(fill=X, expand=1)
- statuslabel = LabelFrame(fenster, text="Status",padx=5, pady=5,bg='#C9C9C9')#.place(height= 30,x = 5, y = int(fh)-40,width=int(fb)-10)
- statuslabel.pack(fill=X, expand=1)
- v = StringVar(fenster)
- v.set(fenster) # initialize
- b = Radiobutton( ausgabelabel, text="Rohdaten ",variable=rbtn_a, value=1,bg='#C9C9C9')#.place(x = 50, y = 45)
- b.grid(row=0,column=0,sticky=W,padx=4)
- b.select()
- b2 = Radiobutton(ausgabelabel, text="Alle MSGs ",variable=rbtn_a, value=2,bg='#C9C9C9')#.place(x = 10, y = 45)
- b2.grid(row=0,column=0,sticky=W,padx=99)
- b2 = Radiobutton(ausgabelabel, text="Meine MSGs ",variable=rbtn_a, value=3,bg='#C9C9C9')#.place(x = 10, y = 45)
- b2.grid(row=0,column=0,sticky=W,padx=192)
- textfenster = ScrolledText(ausgabelabel,width=86,height=14,background='#baeaff')#.place(x = 10, y = 55)
- textfenster.grid(row=3,column=0,sticky=W,padx=4)
- iststatus=Label(statuslabel,text="Moin..." )
- iststatus.grid(row=3,column=0,sticky=W,padx=5)
- im2 = Image.open(imageExit)
- tk_image2 = ImageTk.PhotoImage(im2)
- btn_exit=Button(topframe , image = tk_image2,command=prgende, width=40,height=40 ).grid(row=1, column=1, sticky=W, padx=540, pady=1)
- im = Image.open(imageDisconnect)
- tk_image = ImageTk.PhotoImage(im)
- btn_con= Button(topframe ,image = tk_image, command=verbindema,width=40,height=40 ).grid(row=1, column=1, sticky=W, padx=1, pady=1)
- im3 = Image.open(imageSendBake)
- tk_image3 = ImageTk.PhotoImage(im3)
- btn_exit=Button(topframe , image = tk_image3,command=sendbake, width=40,height=40 ).grid(row=1, column=1, sticky=W, padx=80, pady=1)
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Menü Hauptfenster
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- menu = Menu(fenster)
- fenster.config(menu=menu)
- filemenu = Menu(menu)
- menu.add_cascade(label="File", menu=filemenu)
- filemenu.add_command(label="Karte zeigen", command=karte)
- filemenu.add_command(label="Einstellungen", command=einst)
- filemenu.add_command(label="RX Daten Speichern", command=rxsave)
- filemenu.add_separator()
- filemenu.add_command(label="Exit", command=fenster.quit)
- helpmenu = Menu(menu)
- menu.add_cascade(label="Help", menu=helpmenu)
- helpmenu.add_command(label="About...", command=About)
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # Existiert eine Dateimit den Einstellungen ?
- # Wenn nicht wird sie angelegt
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- iststatus.config(text="Prüfe Config Datei...")
- #
- if os.path.exists(myHome+"/pyaprs/"):
- iststatus.config(text="Config Datei existiert")
- #print "Config Datei existiert"
- else:
- iststatus.config(text="Config Datei wird erstellt..."+myHome+"/pyaprs/.einstellungen.txt")
- #print "Config Datei wird erstellt..."+myHome+"/pyaprs/.einstellungen.txt"
- os.mkdir(myHome+"/pyaprs/")
- lic = open(myHome+"/pyaprs/.einstellungen.txt","w")
- lic.write( "# Konfigurationsdatei für pyaprs "+version+" \n")
- lic.write( "# (c) Dirk Ubcerzagt, DL8AAX \n")
- lic.write( "# \n")
- lic.write( "call=n0call \n")
- lic.write( "name=otto \n")
- lic.write( "LängengradOst=00953.25E \n")
- lic.write( "LängengradWest=5131.04N \n")
- lic.write( "Bakentyp=! \n")
- lic.write( "Symbolart=/ \n")
- lic.write( "Symbolbild=y \n")
- lic.write( "Bakentext= \n")
- lic.write( "Kommentar= \n")
- lic.write( "passwort=12960 \n")
- lic.write( "serverHost=195.190.142.207 \n")
- lic.write( "serverPort= \n")
- lic.write( "Adresse=APRS,TCPIP*: \n")
- lic.write( " \n")
- lic.write( " \n")
- lic.close()
- iststatus.config(text="Lese Konfigurationsdatei...")
- lieskonfi()
- fenster.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement