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

news/2024/5/15 9:24:57/文章来源:https://blog.csdn.net/lm_is_dc/article/details/126688355

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

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

只有不断刻意练习,技术才能日益精进。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_5532.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象编程原则(03)——单一职责原则

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 《大话设计模式》 作者:程杰《Java设计模式》 作者:刘伟《图解设计模式》 作者:结城浩《重学Java设计模式》 作者:…

[论文阅读] HairGAN: Spatial-Aware Palette GAN for Hair Color Transfer

[论文地址] [代码] [ICME 22] Abstract 头发颜色转移的目的是将头发颜色从参考图像转移到原始图像,同时保持原始图像的头发结构。然而,由于复杂的头发结构以及原始图像和参考图像之间头发区域的错位,现有的方法不能很好地完成这一任务。为了…

CTFshow_MISC入门_图片篇(基础操作信息附加)wp

文章目录前言Tipsmisc1misc2misc3misc4misc5misc6misc7misc8misc9misc10misc11后记前言 挺长时间没有打CTF了,感觉技术从之前就一直没有提升多少,摸了段时间的渗透&护网,感觉CTF的基础还是比较重要,温故而知新,就…

03.thymeleaf在业务系统中的应用

thymeleaf是Java方向开源的服务端模板引擎,支持多种格式的格式渲染。在存前端项目盛行的年代,webUI纯服务端渲染已经不再适合,但并不影响服务端模板的继续应用。 在企业集成业务系统中,由于低代码平台的业务标准化/组件化/所见及…

[ Linux长征路第三篇 ] 权限理解

目录 1.root用户和普通用户相互切换 2.文件类型和访问权限(事物属性) 2.1 文件类型 2.2 基本权限 2.3 文件权限值得表示方法 1)字符表示法 2)8进制数值表示法 2.4 文件访问权限的相关设置方法 1) chomd 2)三位8进制数字 3) cho…

解决找回密码不在右边的问题

问题如下: 在10.5中,按照书中代码写法为float-right,则出现上述的问题,找回密码不能和书中的结果一样呈现在右边,而出现在了左边 解决问题:把float-right改为float-end即可。其实这也不是什么大问题,不过可能会有的同学可能找不到解决方法,所以在这里写一下。因为淋过…

2022java-web一条龙工具安装

@目录java安装java-jdk安装java环境变量配置java-eclipse工具安装Java-idea工具安装MySQL安装navicat安装tomcat安装maven安装配置本地仓库配置镜像配置jdk 备忘~安装常见的一些我需要的集成工具以及jdk java安装 java-jdk安装 1,去官网进行安装下载jdk2,找到下载jdk的文件位…

json/xml/schema

JSON JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式,是理想的接口数据交换语言。官网:https://www.json.org/json-en.html 工作json请求体: json字符串 hashmap对象 jackson库 json响应结果断言 语法…

堆优化dijkstra的两种写法

例题: https://www.acwing.com/problem/content/description/1131/ 1、仅用dis数组记录,出队时记录最小距离#include<bits/stdc++.h>#define fore(x,y,z) for(LL x=(y);x<=(z);x++) #define forn(x,y,z) for(LL x=(y);x<(z);x++) #define rofe(x,y,z) for(LL x=(…

瑞吉外卖git

文章目录&#x1f492; Git&#x1f68f; 1、Git 概述&#x1f680; Git 简介&#x1f684; 下载与安装&#x1f68f; 2、Git 代码托管服务&#x1f680; 常用的 Git 代码托管服务&#x1f684; 使用码云代码托管服务&#x1f6ac; 使用码云的操作流程如下&#xff1a;&#x1…

程序人生 | 编程的上帝视角应该怎么去找

前言 &#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于Linux内核/汇编/HotSpot/C/Java/源码/架构/算法 就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计&#x1f4eb; &#x1f3c6; CSDN专家博主/Java优质…

SpringBoot基于guava集成令牌桶算法

SpringBoot基于guava集成令牌桶算法一、什么是令牌桶1、令牌桶2、功能图二、Guava1、简单介绍2、pom引入3、限速器4、浅析重载方法三、系统应用1、单个接口应用2、多个接口应用一、什么是令牌桶 1、令牌桶 有一个固定大小的水桶&#xff0c;在水桶的水满之前&#xff0c;水龙…

无意中发现腾讯Java开发手册

RPC&#xff08;Remote Procedure Call&#xff09;—远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在&#xff0c;如TCP或UDP&#xff0c;为通信程序之间携带信息数据。在OSI…

【SpringCloud-Seata分布式事物】

简介 1、是什么 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 http://seata.io/zh-cn/ 2、 能干什么 3、处理过程 TM向TC申请开启一个全局事务&#xff0c;全局事务创建成功并生成一个全局唯一的XID&#xf…

Spark写入支持更新【源码二次开发】

在大数据开发过程中&#xff0c;遇到很多Spark写入mysql得场景&#xff0c;目前由于Spark仅支持以下几种 SaveMode: Append、Overwirte、ErrorIfExists、Ignore、ReplaceInto 由于在写入mysql时&#xff0c;需要数据根据主键进行更新&#xff0c;而不覆盖或追加&#xff0c;次…

交换机的工作原理

1 交换机的工作原理假设主机A要和主机B通信,交换机转发数据帧的过程如下: (1)MAC地址的学习和记录 A主机发送数据帧(源MAC地址为00-00-00-11-11-11,目标MAC地址为00-00-00-22-22-22)到交换机的1号接口,交换机首先查询MAC地址表中1号接口对应的源MAC地址条目。如果查询不…

曝光一下字节跳动的工资待遇和职位级别

BAT 是互联网大厂的标杆&#xff0c;也是很多程序员的梦想之地。随着抖音、TikTok 和今日头条的崛起&#xff0c;BAT 中的“B”也由原来的百度替换成了现在的字节跳动&#xff08;ByteDance&#xff09;。 字节跳动是全球独角兽企业的榜一大哥&#xff0c;不仅霸占了国内市场&…

Altium Dsigner 20 工艺参数设置修改

本文根据在学习凡亿教育的Altium Dsigner 20课程&#xff0c;总结了关于系统参数、设计规范等内容的优化修改。仅供参考 。 目录1 系统设置1.1 本地化菜单设置1.2 主题颜色设置1.3 弹出面板设置1.4 文件路径修改1.5 交叉选择模式1.6 设计检视设置1.7 自动保存设置1.8 原理图器件…

董宇辉:读书让你更加深刻|程序员必读的一本书

久负盛名的CSAPP&#xff08;Computer Systems: A Programmers Perspective&#xff09;一直都是计算机界“圣经”般存在&#xff0c;本书主要是软件程序员角度来看待计算机系统&#xff0c;主要包括以下内容&#xff1a;第一部分&#xff1a;程序结果和执行数据如何在内存里面…

微信输入法来了,如何下载?

微信早就有想做输入法的想法&#xff0c;早在去年年初&#xff0c;“微信之父”张小龙就曾经在一年一度的微信之夜活动上表示&#xff0c;“在未来&#xff0c;腾讯微信团队将会开发一套专属于微信的定制输入法。”张小龙表示&#xff0c;微信原来并不想去做输入法&#xff0c;…