猿创征文|工作中遇到技术盲区后的自我成长

1、立场

我是一名python后端开发程序员,在一家创业公司中兢兢业业工作快两年了,从软件架构开发测试部署运维一手经办,到开发文档、API接口、开发周期、设备交付、安装完成全程对接跟踪。

自己曾经也是个小白呀,也是从校招时有老员工带入门的平稳过渡,到如今一个人扛下大部分研发责任,一直秉承着系统能够稳定运行最好就不要大刀阔斧改动,能够使用自己熟悉的技术领域解决问题就不要涉略新兴事物徒添麻烦。这是自己的立场。

但工作中往往是客户优先,一切开发以客户需求为第一立场。满足了客户的要求,客户下单了,那大家皆大欢喜。有订单,创业公司才得以生存,谋发展才有些微可能。

客户的立场就是:你能不能解决这个问题?需要多长时间?效果怎么样?

2、观点

那么,站在客户的立场去想问题,开发尽可能以客户为中心,才可能开发出好的产品。

今年5月份,有个客户设备需要以MQTT协议对接,我当时并没有接触过,我跟老板说,其实可以用TCPHTTP来完成设备间数据的交换,这些我是熟悉的,搭建一个简易的TCP服务器,我以前就做过。

2.1、基于Tornado的TCP服务器

原文跳转,其中的服务端代码:

# !/usr/bin/python
# -*- coding: utf-8 -*-"""
@contact: 微信 1257309054
@file: tornado_server.py
@time: 2021/6/16 17:26
@author: LDC
"""
import asyncio
import re
import threading
import osfrom functools import wraps
from tornado import gen
from tornado.ioloop import IOLoop
from tornado.tcpserver import TCPServer'''
设备监控程序
开启TCP服务,与设备采集器建立连接,
'''def threadIng_async(f):"""使用装饰器和多线程实现异步执行:param f::return:"""@wraps(f)def wrapper(*args, **kwargs):thr = threading.Thread(target=f, args=args, kwargs=kwargs)thr.start()return wrapperclass DeviceServer(TCPServer):def __init__(self, account, servernum):super(DeviceServer, self).__init__()self.account = accountself.servernum = servernum# 接收客户端连接请求@gen.coroutinedef handle_stream(self, stream, address):conn = Connection(self.account, self.servernum, stream, address)yield conn.send_messages()class Connection(object):clients = set() # 客户端对象def __init__(self, account, servernum, stream, address):Connection.clients.add(self)self.account = accountself.servernum = servernumself._read_future = Noneself._stream = stream  # TCP对象self._address = address  # TCP地址self.heart_count = 0  # 设备发送心跳包次数self.previous_order = 'aa0550\r\n'  # 上一条指令默认为回复心跳包self.machine_code = ''  # 机器编号self.tcp_is_activate = True  # tcp通道是否保持连接self._stream.set_close_callback(self.on_close)  # tcp通道关闭后相关变量处理函数print('第{}个客户端,地址:{}'.format(len(self.__class__.clients),self._address))@gen.coroutinedef send_messages(self, data='hello\r\n'):# 使用coroutine实现函数分离的异步编程,即异步接收客户端发来的数据,其中数据以'\r\n'结尾try:yield self.send_message(data)response1 = yield self.read_message()self.deal_message(response1)except Exception as e:print('出错啦',e)def read_message(self):# 接收数据,遇到\r\n结束符就取出缓存区的数据return self._stream.read_until(b'\r\n')def deal_message(self, data):# 处理数据data = data.decode('utf-8').replace('\r\n', '')print(self._address, data)self.send_messages(data='I get it {}'.format(data))def send_message(self, data):# 发送数据return self._stream.write(data.encode('utf-8'))def on_close(self):# 关闭通道Connection.clients.remove(self)self.tcp_is_activate = False  # 机器tcp处于断开状态print("客户端已经关闭",self._address)def kill_port_process(port):# 根据端口号杀死进程ret = os.popen("netstat -nao|findstr " + str(port))str_list = ret.read()if not str_list:print('端口未使用')returnif 'TCP' in str_list:# 只关闭处于LISTENING的端口ret_list = str_list.replace(' ', '')ret_list = re.split('\n', ret_list)listening_list = [rl.split('LISTENING') for rl in ret_list]process_pids = [ll[1] for ll in listening_list if len(ll) >= 2]process_pid_set = set(process_pids)for process_pid in process_pid_set:os.popen('taskkill /pid ' + str(process_pid) + ' /F')print(port, '端口已被释放')time.sleep(1)elif 'UDP' in str_list:ret_list = re.split(' ', str_list)process_pid = ret_list[-1].strip()if process_pid:os.popen('taskkill /pid ' + str(process_pid) + ' /F')print('端口已被释放')else:print("端口未被使用")def main():# 程序入口port = 5500ip = '0.0.0.0'kill_port_process(port)asyncio.set_event_loop(asyncio.new_event_loop())server = DeviceServer('123', 'device_server')print('启动服务器')# 启动服务器前先杀死端口server.listen(port=port, address=ip)IOLoop.instance().start()if __name__ == '__main__':main()

当时还想基于这个服务器做一个在线聊天系统,苦于一直没有找到一个好的桌面软件(后来工作中接触了PYQT5,觉得与Tornado结合成聊天室软件简直是天衣无缝)。

但客户已经使用了MQTT协议很多年了,这也是一个封装性、安全性、规范性很高的协议,老板说不能更改,需要按照客户的来。

3、方法

我只好硬着头皮去CSDN平台找文档学习,去摸索,去看别人是怎么实现的。最后从了解到什么是MQTT,到如何在windows、linux上部署安装服务器,当然也整理成了博客,大家可以点传送门去看看,我摘取其中的部分代码。

3.1、MQTT发布消息

代码:

import random
import timefrom paho.mqtt import client as mqtt_clienttopic = 'python_mqtt' # 发布的主题,订阅时需要使用这个主题才能订阅此消息
# 随机生成一个客户端id
client_id = 'python-mqtt-{}'.format(random.randint(0, 1000))def connect_mqtt():#连接mqtt服务器def on_connect(client, userdata, flags, rc):if rc == 0:print("Connected to MQTT Broker!")else:print("Failed to connect, return code \n", rc)client = mqtt_client.Client(client_id)client.on_connect = on_connect# broker = 'broker.emqx.io'# port = 1883# client.connect(broker, port)client.connect(host='127.0.0.1', port=1883)return clientdef publish(client):# 发布消息msg_count = 0while True:time.sleep(1)msg = '这是客户端发送的第{}条消息'.format(msg_count)result = client.publish(topic, msg)status = result[0]if status == 0:print('第{}条消息发送成功'.format(msg_count))else:print('第{}条消息发送失败'.format(msg_count))msg_count += 1def run():client = connect_mqtt()client.loop_start()publish(client)if __name__ == '__main__':run()

3.2、MQTT订阅消息

import randomfrom paho.mqtt import client as mqtt_clienttopic = "python_mqtt"
client_id = 'python-mqtt-{}'.format(random.randint(0, 100))def connect_mqtt() -> mqtt_client:# 连接MQTT服务器def on_connect(client, userdata, flags, rc):if rc == 0:print("Connected to MQTT Broker!")else:print("Failed to connect, return code \n", rc)client = mqtt_client.Client(client_id)client.on_connect = on_connect# broker = 'broker.emqx.io'# port = 1883# client.connect(broker, port)client.connect(host='127.0.0.1', port=1883)return clientdef subscribe(client: mqtt_client):def on_message(client, userdata, msg):data = msg.payload.decode()print('订阅【{}】的消息为:{}'.format(msg.topic, data))client.subscribe(topic)client.on_message = on_messagedef run():client = connect_mqtt()subscribe(client)client.loop_forever()if __name__ == '__main__':run()

经过沉淀后,发现网上关于Python的MQTT协议没有一个非常系统的讲解,大部分都是七零八落的片段,于是我也自己整理了一份更加详细的关于MQTT协议讲解,一方面是自己学习研究后的总结,一方面希望可以帮到有需要的人,大家能够互相学习精进。

这是传送门,点我跳转,其中有MQTT简介、安装服务器、使用示例、设置登录验证、后台访问、客户端上线下线通知。

4、感悟

对于小白的我来说,MQTT协议就是技术盲区,一开始很排斥,人在面对未知时往往是恐惧的。如果要成长,要蜕变,那就必须果敢地去学习,去钻研。
完成工作中的任务并不难,只需要把技术学习到七七八八就可以了,但要精通,到能够教导别人,这就需要下一番功夫了,不经一番寒彻骨,怎得梅花扑鼻香。

只有不断刻意练习,技术才能日益精进。

猿创征文|工作中遇到技术盲区后的自我成长相关推荐

  1. 猿创征文|点亮技术之路的三盏灯

    目录 前言 第一盏灯:学习&运气 第二盏灯:技术&信任 第三盏灯:思维&沟通 前言 也许,我是幸运的,可以说几乎每一次的技术储备,都能在关键时刻起到"救命稻草&quo ...

  2. 猿创征文|pycharm中的翻译插件translation以及将其更换为百度翻译获取ID和密钥的详细步骤

             我们在用python时有时候遇到一些英语单词,一时忘记了或者从来没见过,这个时候我们就需要百度或者其他途径去查单词的意思,很麻烦,那么能不能像专门的英语软件一样用鼠标一点就可以知道它 ...

  3. 猿创征文|laravel中JWT的使用

    一.什么是 JWT? JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制. 从 JWT 的全称可以看出,JWT 本身也是 Token,一种 ...

  4. 猿创征文|项目中使用Git,解决一些项目开发中常见的Git问题

    写在前面:Git的教程在网上很多,但我在最开始接触项目中需要用Git命令时,发现网上的教程并没有统一的答案告诉我,我到底该输入什么命令,什么又不需要

  5. 猿创征文|服务器中常用的几个资源监控工具整理

    系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化.性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码.代码优化的目标是针对具体性能问题而优化 ...

  6. 猿创征文|我的四个月Java学习成长之路——从基础到框架再到项目

    个人简介:  >

  7. 猿创征文|我Java开发那些年陪我成长的工具清单

  8. 猿创征文|前路有光,初心莫忘,从编程小白,到如今小有所成,我这一路是如何走来的?

    前言 无论是谁,对于编程来说,一开始看都很难看懂的,这也是为什么这个行业,属于互联网高薪行业代表的原因之一. 我是属于自学编程的非科班码农,在我看来,自学编程应该重点思考下自己的学习方式以及是否对 J ...

  9. 猿创征文|当我在追光 我与光同航--我与Java的技术成长之路

    文章目录 前言 材料转码 初识JAVA 大学建议 1. 参加比赛 2. 坚持创作 3.养成看书的习惯 Java路线 1. java基础 2. 数据库 3. javaWeb 4. 框架 前言 今天借着官 ...

最新文章

  1. Ubuntu中Apache修改DocumentRoot(修改网站根目录)
  2. 通过分析 JDK 源代码研究 Hash 存储机制
  3. 【云隐】STM32F103C8T6实现串口IAP方式升级固件
  4. python怎么索引txt数据中第四行_python txt读取第一行数据库
  5. JDOM与DOM的相互转换
  6. SAP License:ERP横向集中部署还是纵向集中部署
  7. 剑指offer面试题22. 链表中倒数第k个节点(链表)
  8. bigsur降级回catalina_big sur怎么降到Catalina,macOS Big Sur降级教程
  9. android模拟机神器[Genymotion]的使用
  10. python数字图像处理——边缘检测算子(Laplacian算子、Roberts算子、Prewitt算子和Sobel算子)
  11. 坚果云根目录同步冲突解决方法
  12. Windows 10 无法访问共享的解决办法
  13. BootStrap左侧菜单栏
  14. 移动apn接入点哪个快_提升移动联通电信网速
  15. (下篇)校园小程序前端部署教程-优雅草老八写
  16. 离职原因体面表达方式
  17. junit-vintage-engine和junit-jupiter-engine之间的区别?
  18. 关于 字号、PX像素、PT点数、em、CM厘米、MM毫米之间的换算
  19. 【原创】HTML学习(2020.2.4)
  20. TCP—-SYN、ACK-、FIN、RST、PSH、URG-详解

热门文章

  1. element menu子菜单默认展开高亮
  2. 必修三计算机选修三知识点总结,高中-必修三统计知识点整理.doc
  3. C语言(十一)-共同体类型
  4. 什么是段错误,段内,段间
  5. 打破逆境,新型CRM怎样成为华为有赞们营销新增长的关键?
  6. Eclipse(JavaEE)创建JavaWeb项目简单流程
  7. 科技大佬该向柴静学点什么?
  8. 华云积极响应合肥高新区抗疫号召:践行社会责任 贡献科技企业力量
  9. (三)python的文件操作
  10. python绘制樱花洒落_Python画图之浪漫樱花