基於tziota實現的簡單聊天室

基於tziota實現的簡單聊天室

本文博客鏈接:http://blog.csdn.net/jdh99,作者:jdh,轉載請註明.

環境

  • python版本:3.5

說明

首先需要安裝tziota包:

pip install tziota

關於tziota可以參考:《TZ-IOT發佈Python SDK:tziota》

源碼

import socket
import threading
import tziota
import tkinter as tk


_ia = 0
_pwd = 0
_dst_ia = 0
_app = None


def main():
    threading.Thread(target=gui_thread).start()

    while _ia == 0 or _pwd == 0 or _dst_ia == 0:
        pass

    param = tziota.Param()
    param.local_ip = "0.0.0.0"
    param.local_port = 14155
    while True:
        if is_open(param.local_ip, param.local_port):
            param.local_port += 1
        else:
            break
    print(param.local_port)
    param.local_ia = _ia
    param.pwd = _pwd
    param.server_ip = "115.28.86.171"
    param.server_port = 14129
    param.server_ia = 0x2140000000000002
    tziota.init(param)
    tziota.register_callback_rx(deal_rx)


def gui_thread():
    global _app

    root = tk.Tk()
    _app = App(root)
    root.mainloop()


class App:
    def __init__(self, root):
        frame = tk.Frame(root)
        frame.pack()
        root.title('聊天室')

        self.text = tk.Text(frame)
        self.text.grid(row=0, column=0)

        self.group = tk.LabelFrame(frame)
        self.group.grid(row=0, column=1)

        tk.Label(self.group, text='IA:').grid(row=0, column=0)
        self.v_ia = tk.StringVar()
        tk.Entry(self.group, textvariable=self.v_ia).grid(row=0, column=1)

        tk.Label(self.group, text='密碼:').grid(row=1, column=0)
        self.v_pwd = tk.StringVar()
        tk.Entry(self.group, textvariable=self.v_pwd).grid(row=1, column=1)

        tk.Label(self.group, text='對方IA:').grid(row=2, column=0)
        self.v_dst_ia = tk.StringVar()
        tk.Entry(self.group, textvariable=self.v_dst_ia).grid(row=2, column=1)

        tk.Button(self.group, text='確定', command=self.set_param).grid(row=3, column=0, columnspan=2)

        self.v_input = tk.StringVar()
        tk.Entry(self.group, textvariable=self.v_input).grid(row=4, column=0, columnspan=2)
        tk.Button(self.group, text='發送', command=self.send).grid(row=4, column=2)

    def set_param(self):
        global _ia, _pwd, _dst_ia
        _ia = int(self.v_ia.get(), base=16)
        _pwd = self.v_pwd.get()
        _dst_ia = int(self.v_dst_ia.get(), base=16)

    def send(self):
        if len(self.v_input.get()) > 0:
            tziota.send(_dst_ia, self.v_input.get().encode())


def is_open(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.bind((ip, port))
        s.close()
        return False
    except:
        return True


def deal_rx(ia, data):
    global _app
    _app.text.insert(tk.END, 'IA:0x%016x %s\n' % (ia, data.decode()))


if __name__ == '__main__':
    main()

運行效果

可以使用以下兩個測試賬號:

  • 2140:0000:0000:0100,密碼:“123”
  • 2140:0000:0000:0101,密碼:“456”

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章