wxPython服务器 & ME3616 TCP通信

       本篇文章验证Python作为服务器接收ME3616 TCP数据并进行简单过滤。内容包括Python服务器窗口搭建(重点描述),Python服务器通信示例,ME3616通信示例,IP地址映射问题解决。文章会作为一个跳板,以便后期使用ME3616_G3A进行跟踪定位并发送数据给到服务器,然后整机装载到自己的踏板车上,以后骑踏板车去图书馆就不怕丢了。

一、wxPython服务器窗口搭建

      服务器窗口几个主要界面,接收窗口,发送窗口,IP、端口输入窗口,发送按钮。也没有详细概念,所以布局就参考最常用的"网络调试助手"

目标简化版"NetAssist"

1.1 界面搭建

       在本节将搭建TCP服务器界面,工具使用wxPython图形界面编程,每行代码包含详细注释方便以后复习&修改。

1.1.1 导入窗体

       图形用户界面主要是由窗口&窗口中的控件构成,编写wxPython就是创建窗口和添加控件的过程。wxPython的窗口使用wx.Frame(对象),关闭窗口使用wx.App对象,wx.App对象代表当前应用程序。

基本程序架构
初步窗口界面

1.1.2 添加按键

这里引入2个概念,panel和事件。

稍后会创建panel

当按钮(事件源)按下(事件类型)时,一般希望响应特定函数(事件处理者),此时就用到了Bind()方法:Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY)。event事件类型,handler事件处理者,对应事件处理类中特定方法;source事件源;id事件源标识,可省略source绑定id事件源;id2设置要绑定事件源的范围。

增加了按钮和响应
显示效果,点击会切换文字

1.1.3 布局管理

      之前的图形界面按钮的位置固定,当放大、缩小整个界面时按钮不会跟着移动,显示效果不友好。为了正常的缩放(水平&垂直),需要使用wx.BoxSizer布局器,将按钮等需要缩放的控件添加到BoxSizer中就可以正常缩放了。

proportion查了好久才明白,设置为1/2都会跟着拉伸而已,但小了拉伸不能低于原有尺寸

 box是需要嵌套的,这里将按钮的位置信息去掉,然后使用box布局管理器重新布局处理

最下面的发送布局基本出来了

1.1.4 添加数据显示

数据显示在最上面,结合刚刚的vbox,创建一个TextCtrl整合即可

整合时发现下面的发送界面不在填满了
原来是hboxSend忘记加EXPAND属性了

这里重新认识了wx.EXPAND,wx.TOP...ALL原来是配合border设置对应边界的。

1.1.5 左侧参数布局

界面的左侧(左上角)需要添加显示IP、端口号,添加对应的文本框然后box调整布局

单独增加参数布局之后,还需要增加box来整合这2个

这里新增了wx.StaticBox--静态文本框,同时使用StaticBoxSizer将文本框、文本、输入框包裹起来

初步效果图

       至此,服务器界面的基本框架已经搭建完成,后面就看如何将TCP的数据与这个框架相结合了。

二、TCP服务器、客户端程序编写

       TCP服务器、客户端的程序网上搜索非常多,这里直接参考CSDN的文章并验证可正常通信,链接:https://blog.csdn.net/qq_26442553/article/details/94469527,程序代码在作者基础上只做格式调整。

客户端调试代码
服务器调试代码

       需要注意的是客户端发送3次后退出,调用tcp_socket.close()之后会发送部分内容,服务器收到之后跳出new_client_socket.recv(1024)循环,并且能够识别是关闭socket的底层协议,跳转到else后break本次通信链接。

三、窗口UI & 底层TCP拼接

       上面单独UI和TCP通信已经完成,要使UI界面显示对应数据就要将2个程序整合了。UI只编写服务器的,客户端后期使用ME3616 NB模组发送TCP程序,所以不需要编写UI。

3.1 程序拼接

       该部分难点在于服务器接收端如何持续监听&刷新接收窗口。找了很多网上资料都是Client方法,而且在按钮发送中执行(不和逻辑),在《Python项目案例开发从入门都时间》-郑秋生、夏敏洁的书中看到,他们把服务器、客户端的代码封装为一个方法,然后创建一个线程,启动接收(这里如果不创建线程,while循环监听会导致UI界面死机)。

3.1.1 创建线程

threading.Thread(target=None, name=None, args=()),target传入自定义函数,这里就是TCP的方法了,name可以为线程定义一个名字(可省略),args可以传入target的参数(如果target方法有参数的话)

先创建线程,在APP中调用,rcvMessage是TCP服务器的方法

3.1.2 TCP服务器接收程序

TCP服务器接收程序直接在Frame中定义方法,重新命名就行了

服务器接收程序单独定义成方法

3.1.3 APP子类启动

      这里子类启动线程(调用startNewThread)方法,如果直接调用rcvMessage方法而不是线程会造成系统死机,因为rcvMessage方法是while循环,就无法刷新窗口了

启动线程
先使用printf调试并行运行模式是否okay

     调试代码,图形界面可正常显示,下面printf也可以正常打印,说明并行运行没有问题,后面将数据调用到显示接口就行了。

3.1.4 UI显示接收数据

       UI界面显示就是将刚刚的接收数据recv_data显示到接收窗口来,调试发现rcvMessage()方法需要调用tcSend文本控制参数,所以将tcSend重新定义为self.tcSend以便类中所有方法共用。其他直接调用拼接字符串self.tcRcv.AppendText(str(recv_data)+"\r\n")就行了。注意及时recv_data是字符串这里也要加入str()进行修饰

需要注意AppendText参数中需要传入字符串,recv_data不能直接传入,需要加str()进行转换,运行结果如下

客户端发送,服务器可正常接收

为了优化显示效果,类似串口/网络调试助手每次接收时显示时间参数,这里加入time类。为了单独验证时间以字符格式输出,使用python shell调试验证

这里不能显示mS,单独显示mS需要将uS进行转化

将datetime整合到现有输出格式下

服务器接收整合完成

四、ME3616 模组TCP通信 & GPS连接

        ME3616模组TCP通信过于简单,串口按照流程发送AT指令就可以了,这里将GPS操作同步说明。

4.1 TCP通信流程

        参考文章《ME3616 TCP&UDP通信》,使用串口根据流程发送对应指令即可,高新兴全系列模组支持TCP通信,都可以进行测试。

4.2 GPS使用流程

       参考文章《ME3616 NBIOT GNSS(GPS+北斗)定位应用示例》,建议入网之后,在开启GPS,GPS位置信息获取后就可以发送数据了。

五、ME3616对接Python TCP服务器

写到这里发现文章的结构和wxPython添加BOX一样,单独模块功能验证完成后进行拼接^▽^。

5.1 内网穿透地址映射

     ME3616使用TCP通信直接发送数据到Python服务器的IP是无法进行传输的,具体可参考文章https://blog.csdn.net/songshiMVP1/article/details/51519767《内网与外网之间的通信(端口映射原理)》或者之前发布的文章《ME3616—TCP调试公网IP端口映射的解决方法》,因为花生壳开始实名认证(手拿身份证拍照)所以不在使用(大家也不推荐用花生壳),找其他解决方案,百度搜了搜内网穿透的文章参考"https://www.jianshu.com/p/0342d083e17b"最终使用:natapp !

       NatApp个人免费版在注册&下载有几个细节:1. 所有的流程参考官网上的"NATAPP1分钟快速新手图文教程" 2.下载natapp.exe之后要将config.ini放在同级目录,config.ini只填写authtoken,其他几个选项默认为空即可。最终映射操作:

网页端:Python服务器IP&端口填写位置
本地端软件:打开后生成了ME3616需要AT指令填写的地址

5.2 ME3616通信对接

这里给出完整的打开顺序,然后进行AT指令通信

5.2.1 填写Python服务器待映射的IP

5.2.2 获取映射后的IP

打开netapp.exe生成映射后的IP&端口

5.2.3 打开Python服务器,ME3616连接

打开Python服务器,按照正常的TCP流程,连接这个IP&端口

入网连接&通信

六、结束

       文章到此先结束了,第2篇文章在完善GPS定位信息传入的关键字处理&分类,同时Python程序多文件调用、地图调用、Python服务器脱离编译器发布需要验证。后续第3篇文章应该就可以加入硬件处理了(三轴、电池取电方式、PCB画板、最终安装&应用)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容

  • 运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是...
    srtianxia阅读 2,384评论 0 2
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,941评论 1 3
  • 传输层-TCP, TCP头部结构 ,TCP序列号和确认号详解 TCP主要解决下面的三个问题 1.数据的可靠传输...
    抓兔子的猫阅读 4,486评论 1 46
  • 小米手机定位于发烧友手机和入门级手机,产品的研发采用了“参与”模式,发售前让用户首先体验了工程机,而它的粉丝团也在...
    啊呀哈阅读 74评论 0 0
  • 关注了很多公号,特别是那些高质量的公号,每天的推文都很精彩,如果不去 打开看一下,好像错过了什么似得。 但是呢,退...
    冰锋冰锋阅读 635评论 1 19