对于荣威的项目,更多的是对于数据的处理,以及与客户沟通交流的经验,对于此次项目
总结如下:
第一次去面见客户,关于听需求的问题:
听需求的时候,一定不能不懂装懂,在听了客户自己述求后,通过自己的理解,复述一遍,跟客户对其颗粒度,才能保证回来做项目时,理解没有偏差,导致后期着急忙慌的更改错误。最好带上笔记本,或者提前录音,便于事后复盘。
阅读协议需求,了解协议传输机制:
数据传输是通过那种方式,串口,UDP,或是NTP。这一次的NTP协议传输是通过UDP传输方式传输数据。所以预写了一个UDP类,用于处理UDP传输:
# -*- coding: utf-8 -*-
# !/usr/bin/env python
"""udp_server.py
This module demonstrates a server of udp.
"""
import socket
import logging
import threading
class UDP_Server:
"""Class for UDP Server."""
def __init__(self, rcvCallBack):
self.udpSocket = None
self.isUdpServerRunning = False
self.udpServerWorker = None
self.udpServerRcvCallBackHandle = rcvCallBack
def udp_server_start(self, serverIP, serverPort):
"""udp server start to run."""
# creat the socket for udp server
self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.udpSocket.bind((serverIP, serverPort))
self.udpServerWorker = threading.Thread(target=self.udp_server_receiver, name="LoopThread_udp_receive")
self.udpServerWorker.setDaemon(True)
self.udpServerWorker.start()
self.isUdpServerRunning = True
def udp_server_send(self, data, addr):
"""Send data through udp server."""
# logging.info(addr)
self.udpSocket.sendto(data, addr)
# logging.info(ret)
def udp_server_hex_send(self, data, addr):
"""Send hex data through udp server."""
hex_data = bytes.fromhex(data)
self.udpSocket.sendto(hex_data, addr)
def udp_server_stop(self):
"""stop the udp server."""
logging.info("start close socket")
self.udpSocket.close()
self.udpServerWorker.join()
self.isUdpServerRunning = False
def udp_server_receiver(self):
"""Read the data from udp server."""
while True:
try:
data, addr = self.udpSocket.recvfrom(1024)
# logging.info("Receive from %s:%s", addr, data)
self.udpServerRcvCallBackHandle(data, addr)
except Exception as e:
logging.info(e)
然后通过回调函数,控制不同IP以及不同端口号收到的数据,并作出协议内相应的处理,其中关于数据的处理较多:
处理int型转16进制:
ipAddrList = ipAddr.split(".")
ipAddr_hex = '{:02x}'.format(int(ipAddrList[0])) + ' '
ipAddr_hex += '{:02x}'.format(int(ipAddrList[1])) + ' '
ipAddr_hex += '{:02x}'.format(int(ipAddrList[2])) + ' '
ipAddr_hex += '{:02x}'.format(int(ipAddrList[3])) + ' '
以及把接收到的16进制转换成两个字节的列表:
def icd_hex_to_list(data):
# 将16进制的字符串划分为 两字节一组的列表
hexdata = data.hex()
hexlist = [hexdata[i: i + 2] for i in range(0, len(hexdata), 2)]
return hexlist
通过wireshark去查看软件发送数据:
打开wireshark,并且打开应用软件,点击软件里面的按键,筛选出具体数据,根据数据对症下药。
通过底板线路查看TX,RX以及接地:
TTL信号的串口,一般TX和RX在底板上会有两条线,分别就是TX和RX,可以挨个试。
完成NTP client功能:
NTP功能主要是用了chrony软件来实现NTP的分发,通过配置chrony的配置文件chrony.config,在用户通过切换状态时,更改配置文件即可,配置文件中的server源。
在完成后,与客户交谈时:
切忌说谎!做了就是做了,没做就是没做,千万不能撒谎,一个谎言可能导致严重的后果。
都只是阐述一下内心心得,具体操作未描述。