class TPCNN(nn.Module): def __init__(self, num_class=10, head_payload=False): super(TPCNN, self).__init__() # 上 self.uconv1 = nn.Sequential( # nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1, dilation=1, bias=True), nn.BatchNorm2d(16, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), ) self.uconv2 = nn.Sequential( # nn.Conv2d(16, 32, kernel_size=3, stride=2, padding=1, dilation=1, bias=True), nn.BatchNorm2d(32, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), ) # 中 self.mconv1 = nn.Sequential( # nn.Conv2d(1, 32, kernel_size=3, stride=2, padding=1, dilation=1, bias=True), nn.BatchNorm2d(32, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), ) # 下 self.dconv1 = nn.Sequential( # nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1, dilation=1, bias=True), nn.BatchNorm2d(32, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), nn.MaxPool2d(kernel_size=2) ) self.uconv3 = nn.Sequential( # nn.Conv2d(96, 128, kernel_size=3, stride=1, padding=1, dilation=1, bias=True), nn.BatchNorm2d(128, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), ) self.mconv2 = nn.Sequential( # nn.Conv2d(96, 128, kernel_size=3, stride=2, padding=1, dilation=1, bias=True), nn.BatchNorm2d(128, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), ) self.dconv2 = nn.Sequential( # nn.Conv2d(96, 128, kernel_size=3, stride=1, padding=1, dilation=1, bias=True), nn.BatchNorm2d(128, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), ) self.uconv4 = nn.Sequential( # nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1, dilation=1, bias=True), nn.BatchNorm2d(512, eps=1e-05, momentum=0.9, affine=True), nn.ReLU(), ) self.globalconv1 = nn.Sequential( nn.Conv2d(896, 1024, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(1024, eps=1e-05, momentum=0.9, affine=True), nn.ReLU() ) self.dmaxpool = nn.MaxPool2d(kernel_size=2,padding=1) # self.lstm1 = nn.LSTM(256,512, 2) # self.lstm2 = nn.LSTM(self.i_size*2,self.i_size*2, 2) self.avpool = nn.AdaptiveAvgPool2d(2) # self.globallstm = nn.LSTM(512, 256, 1) self.fc1 = nn.Linear(1024*2*2, 512) self.fc2 = nn.Linear(512, num_class)

时间: 2023-06-08 09:04:07 浏览: 47
这段代码定义了一个名为TPCNN的类,继承自nn.Module。它具有一个num_class参数,默认值为10,以及一个head_payload参数,其默认值为False。在__init__函数中,它首先调用父类的构造函数,然后定义了该类的其余属性和方法。
相关问题

修改代码使其能动态调整分辨率 def run(self): self.sock.bind(self.ADDR) self.sock.listen() print('视频服务器已经启动...') print(f'\n工作地址是:{self.ADDR}') conn,addr = self.sock.accept() print(f'\n接受了远程视频客户端{addr}的连接...') data = "".encode("utf-8") payload_size = struct.calcsize("L") cv2.namedWindow('Remote',cv2.WINDOW_AUTOSIZE) while True: cap = cv2.VideoCapture(0) # 动态调整画面分辨率 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) if width > 800: scale_percent = 50 # 缩小画面尺寸 new_width = int(width * scale_percent / 100) new_height = int(height * scale_percent / 100) frame = cv2.resize(frame, (new_width, new_height), interpolation=cv2.INTER_AREA) while len(data)<payload_size: data+=conn.recv(81920) packed_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("L",packed_size)[0] while len(data) < msg_size: data += conn.recv(81920) zframe_data = data[:msg_size] data = data[msg_size:] frame_data = zlib.decompress(zframe_data) #解压数据 frame = pickle.loads(frame_data) #还原 cv2.imshow('Remote',frame) if cv2.waitKey(1) & 0xFF ==27: break

您可以将动态调整画面分辨率的代码移动到接收视频帧之前,并将其放在每次循环之前,以便可以实时调整视频分辨率。以下是修改后的示例代码: ``` def run(self): self.sock.bind(self.ADDR) self.sock.listen() print('视频服务器已经启动...') print(f'\n工作地址是:{self.ADDR}') conn, addr = self.sock.accept() print(f'\n接受了远程视频客户端{addr}的连接...') data = "".encode("utf-8") payload_size = struct.calcsize("L") cv2.namedWindow('Remote',cv2.WINDOW_AUTOSIZE) while True: # 动态调整画面分辨率 cap = cv2.VideoCapture(0) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) if width > 800: scale_percent = 50 # 缩小画面尺寸 new_width = int(width * scale_percent / 100) new_height = int(height * scale_percent / 100) else: new_width = width new_height = height ret, frame = cap.read() if not ret: break frame = cv2.resize(frame, (new_width, new_height), interpolation=cv2.INTER_AREA) while len(data) < payload_size: data += conn.recv(81920) packed_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("L", packed_size)[0] while len(data) < msg_size: data += conn.recv(81920) zframe_data = data[:msg_size] data = data[msg_size:] frame_data = zlib.decompress(zframe_data) #解压数据 frame = pickle.loads(frame_data) #还原 cv2.imshow('Remote',frame) if cv2.waitKey(1) & 0xFF == 27: break cap.release() cv2.destroyAllWindows() conn.close() ``` 在每次循环开始之前,您可以使用OpenCV的VideoCapture对象获取当前视频帧的分辨率,并根据需要进行调整。然后,您可以使用cv2.resize函数将帧调整为新分辨率。最后,您可以通过调整后的帧继续进行后续处理和发送。

nested exception is javax.mail.AuthenticationFailedException: 454 Authentication failed(WRONG_PASSWORD_ERR)

这个错误通常是由于密码错误导致的。如果您使用的是Gmail,则需要在应用程序密码中生成一个应用程序密码,并使用该密码代替您的常规密码。如果您使用的是其他电子邮件提供程序,则需要确保您输入的密码是正确的,并且您的帐户已启用SMTP。以下是一些可能有用的步骤: 1. 确保您的密码是正确的,并且您的帐户已启用SMTP。 2. 如果您使用的是Gmail,请在Google帐户中生成一个应用程序密码,并使用该密码代替您的常规密码。 3. 确保您的代码中使用了正确的端口和主机名。 4. 确保您的代码中使用了正确的身份验证方法。 以下是一个使用Python发送电子邮件的示例代码,其中包括身份验证和错误处理: ```python import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders # 设置发件人和收件人 sender_email = "your_email_address" receiver_email = "recipient_email_address" # 创建一个带有附件的电子邮件 message = MIMEMultipart() message["From"] = sender_email message["To"] = receiver_email message["Subject"] = "Test email with attachment" # 添加正文 body = "This is a test email with attachment." message.attach(MIMEText(body, "plain")) # 添加附件 filename = "example.txt" attachment = open(filename, "rb") part = MIMEBase("application", "octet-stream") part.set_payload((attachment).read()) encoders.encode_base64(part) part.add_header("Content-Disposition", "attachment; filename= " + filename) message.attach(part) # 连接到SMTP服务器并发送电子邮件 try: server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login(sender_email, "your_app_password") text = message.as_string() server.sendmail(sender_email, receiver_email, text) print("Email sent successfully!") except Exception as e: print("Error sending email: ", str(e)) finally: server.quit() ```

相关推荐

首先,要判定出男生和女生的声音,需要通过语音信号的频率范围来进行判定。一般来说,男性的声音频率范围为85Hz-180Hz,而女性的声音频率范围为165Hz-255Hz。因此,可以通过对语音信号进行快速傅里叶变换(FFT)来获得语音信号的频谱,然后根据频率范围来判断声音属于男性还是女性。 接下来是变音的部分。变声可以通过改变语音信号的基频、共振峰等参数来实现。在Python中,可以使用librosa库来实现语音信号的变声。例如,可以使用pitch_shift函数来改变语音信号的基频,使用resample函数来改变语音信号的采样率等。 下面是修改后的代码示例: python import librosa import numpy as np def run(self): global TERMINATE self.sock.bind(self.ADDR) self.sock.listen() print('音频服务器开始启动...') print(f'工作地址:{self.ADDR}') conn,addr = self.sock.accept() print(f'\n接受了远程音频客户端{addr}的连接...') data = "".encode("utf-8") payload_size = struct.calcsize("L") self.stream = self.p.open(format = FORMAT, channels = CHANNELS, rate = RATE, output=True, frames_per_buffer=CHUNK) while True: if TERMINATE: self.sock.close() break while len(data) < payload_size: data += conn.recv(81920) packed_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("L",packed_size)[0] while len(data)<msg_size: data += conn.recv(81920) frame_data = data[:msg_size] data = data[msg_size:] frames = pickle.loads(frame_data) # 对每一帧语音进行判定和变声 for frame in frames: # 计算语音信号的频谱 spec = np.abs(librosa.stft(frame)) freqs = librosa.fft_frequencies(sr=RATE, n_fft=CHUNK) # 找到频率范围内的能量最大的频率 male_energy = np.sum(spec[(freqs >= 85) & (freqs <= 180)]) female_energy = np.sum(spec[(freqs >= 165) & (freqs <= 255)]) if male_energy > female_energy: # 男声 shifted = librosa.effects.pitch_shift(frame, sr=RATE, n_steps=-2) else: # 女声 shifted = librosa.effects.pitch_shift(frame, sr=RATE, n_steps=2) # 写入输出流 self.stream.write(shifted, CHUNK) 需要注意的是,这只是一个简单的示例,实际上判定声音性别和变声是一个相对复杂的任务,需要结合更多的特征和算法来实现。
这段代码主要是通过调用requests库下载一张图片,然后使用PIL库对图片进行加密,最后将加密后的图片保存在本地。同时,还使用了一个区块链API对一个文本信息进行加密和解密。 具体注释如下: from PIL import Image # 导入PIL库,用于图片加密 import hashlib # 导入hashlib库,用于生成加密密钥 import requests # 导入requests库,用于下载图片和调用区块链API import json # 导入json库,用于将数据转换为JSON格式 import certifi # 导入certifi库,用于SSL证书验证 import os # 导入os库,用于操作系统相关的操作 # 定义要下载的图片的URL image_url = "xxxxxxxx" # 发送GET请求下载图片 response = requests.get(image_url) # 判断请求是否成功 if response.status_code == 200: # 如果请求成功,将图片保存到本地 image_path = 'original_image.jpg' with open(image_path, 'wb') as f: f.write(response.content) # 定义一个文本信息 owner_info = "XXXXXXX" else: # 如果请求失败,抛出异常 raise Exception("Unable to download image") # 定义区块链API的URL blockchain_api_url = "XXXXXXXXXXXXXXXXXXX" # 调用区块链API对文本信息进行加密 payload = {"text": owner_info} response = requests.post(blockchain_api_url, data=json.dumps(payload)) if response.status_code == 200: # 如果加密成功,获取加密后的数据 encrypted_data = response.json()["data"] else: # 如果加密失败,抛出异常 raise Exception("Unable to encrypt data using blockchain API") # 调用区块链API对加密后的数据进行解密 response = requests.get(blockchain_api_url + f"/{encrypted_data}") if response.status_code == 200: # 如果解密成功,获取解密后的文本信息 decrypted_data = response.json()["text"] else: # 如果解密失败,抛出异常 raise Exception("Unable to decrypt data using blockchain API") # 定义图片加密函数 def encrypt_image(image_path, key): # 打开图片并转换为RGB模式 img = Image.open(image_path).convert('RGB') pixels = img.load() # 获取像素数据 width, height = img.size # 获取图片的宽和高 # 对密钥进行哈希加密,生成加密密钥 key = hashlib.sha256(key.encode()).digest() # 将加密密钥分成多个部分 key_parts = [key[i:i+3] for i in range(0, len(key), 3)] # 遍历每个像素点,并执行异或运算 for x in range(width): for y in range(height): r, g, b = pixels[x, y] # 获取像素点的RGB值 r = r ^ key_parts[x % len(key_parts)][0] g = g ^ key_parts[y % len(key_parts)][1] b = b ^ key_parts[(x+y) % len(key_parts)][2] pixels[x, y] = (r, g, b) # 更新像素点的RGB值 img.save(image_path.replace('.jpg', '_encrypted.jpg')) # 保存加密后的图片 os.environ['REQUESTS_CA_BUNDLE'] = certifi.where() # 设置SSL证书验证环境变量 encrypt_image(image_path, decrypted_data) # 对图片进行加密
AttributeError: 'tuple' object has no attribute 'part_of_payload'的错误是由于在使用元组对象时,尝试访问了该元组对象不存在的属性'part_of_payload'导致的。 有可能是在代码中对元组对象进行了错误的操作或调用。根据引用中的代码片段来看,这个错误可能与udp_socket.recvfrom(1024)语句有关。recvfrom()方法返回一个元组对象,包含接收到的数据以及发送方的IP地址和端口号。然而,元组对象并没有part_of_payload这个属性,因此尝试访问这个属性会导致AttributeError的发生。 要解决这个问题,你可以检查代码中是否有对元组对象的错误操作,确保只访问正确存在的属性。如果不确定哪里出错了,可以尝试打印相关的变量或使用调试工具来跟踪代码的执行过程,以找到出错的地方并进行修正。123 #### 引用[.reference_title] - *1* *3* [AttributeError: 'tuple' object has no attribute 'decode'](https://blog.csdn.net/qq_40808154/article/details/89159003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【Python】AttributeError: ‘AutoSchema’ object has no attribute ‘get_link’](https://download.csdn.net/download/weixin_38534444/13745029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
问题是:修复 test_update_success 执行后显示 token 不存在的问题,并给出解决后的代码。 解决方案如下: python import unittest import requests Host = 'https://testlhy.eparklife.com' class LoginTest(unittest.TestCase): token = '' def setUp(self): login_url = f'{Host}/api/v1/admin/login?name=lsl&pwd=e7KikcBwG0FSVVIyEL%2FZvLzdaRxFiMPESanpeeMe3Llaweg8of9voFK4lt5jw7vwLOCJSn9M7em3PjmoEORPXvC36ftxjB%2BZ2djptRCCtk%2F%2FRGuNdMxgVW%2BhSduvI%2FXuPibMos4ohJnJUVeKc3ToXXAbh%2FDXvXRDKETOGSMlHLo%3D' headers = { 'Content-Type': 'application/json' } payload = { "name": "lsl", "pwd": "e7KikcBwG0FSVVIyEL/ZvLzdaRxFiMPESanpeeMe3Llaweg8of9voFK4lt5jw7vwLOCJSn9M7em3PjmoEORPXvC36ftxjB+Z2djptRCCtk//RGuNdMxgVW+hSduvI/XuPibMos4ohJnJUVeKc3ToXXAbh/DXvXRDKETOGSMlHLo=" } response = requests.post(url=login_url, json=payload, headers=headers) response_text = response.json() print(response_text) if 'result' in response_text and 'token' in response_text['result']: LoginTest.token = response_text['result']['token'] print(LoginTest.token) else: print("Token does not exist.") def test_update_success(self): if LoginTest.token == '': print("Token does not exist. Skipping test_update_success.") return update_url = f'{Host}/api/v1/admin/changePwd' headers = { 'Content-Type': 'application/json', 'token': LoginTest.token } payload = { "oldPwd": 'a123456', "newPwd": "123456" } response = requests.post(url=update_url, json=payload, headers=headers) print(response.json()) if __name__ == '__main__': unittest.main() 在修复后的代码中,我们添加了一个条件语句来检查 token 是否存在。如果 token 不存在,则跳过执行 test_update_success 测试用例,并打印相应的提示信息。这样可以避免在没有有效 token 的情况下进行请求,进而避免出现 token 不存在的问题。

@allure.title("验证周期MA批量同步") def test_schedule_ma_multiple(self): ma_count = 2 ma_list = [] vin_list = ["L6T79T2E1NP004452"] ecu_cmd_list = generate_ecu_cmd_list( [{"model": 0, "ecu": "VGM", "service": "22", "interval": 1, "did": "F1AE"}, {"model": 1, "ecu": "VGM", "service": "1902", "interval": 1, "input_parameter": "FF"}]) for i in range(ma_count): ma_list.append(create_schedule_or_event_ma("schedule", "2.0多任务周期同步" + str(randint(0, 100)), vin_list, ecu_cmd_list)) # 验证创建结果 assert len(ma_list) == ma_count # 车端请求云端:同步请求 res1 = vehicle_req_synchronization({"rvdc.eventId": rvdc_get_datetime(0, "TIMESTAMP"), "rvdc.requestId": 0, "rvdc.appId": 1, "rvdc.vin": self.vin, "rvdc.dataType": "maSynchronizationReq", "rvdc.payload.storageQuota": 25, "rvdc.payload.maFormatVersion": 0 }) assert res1.get("code") == 100000 # 车端请求云端:移除异常ma任务 res1 = vehicle_req_remove({"rvdc.eventId": rvdc_get_datetime(0, "TIMESTAMP"), "rvdc.requestId": 0, "rvdc.appId": 1, "rvdc.vin": self.vin, "rvdc.dataType": "rvdcRemoveMasResp", "rvdc.payload.masremoved": "true", }) assert res1.get("code") == 100000 # 因为是异步推送,验证推送结果 res = query_vehicle_cloud_log(**{"vin": self.vin, "type": "maSynchronization", "createTimeStart": "", "createTimeEnd": "", "maId": ma_list[0]}) res_log = res.get("data")["records"][0]["content"] res_content_json = json.loads(res_log) res2 = res_content_json["request"]["jsonObject"]["rvdc"]["payload"]["newMas"] assert ma_list[0] in res2 assert ma_list[1] in res2优化一下这段代码

考虑以下几点优化: 1. 将一些重复的代码抽象成函数,如创建MA任务、车端请求云端等,可以提高代码的复用性和可维护性。 2. 对于同步请求和移除异常MA任务的验证,可以使用pytest中的assert语句,使代码更加简洁易读。 3. 对于异步推送的验证,可以使用pytest中的fixture和mock,模拟推送结果,避免依赖实际的推送结果。 修改后的代码如下: import pytest import json from random import randint from utils import ( create_schedule_or_event_ma, generate_ecu_cmd_list, vehicle_req_synchronization, vehicle_req_remove, query_vehicle_cloud_log, rvdc_get_datetime ) @pytest.fixture(scope="module") def ma_list(): ma_count = 2 vin_list = ["L6T79T2E1NP004452"] ecu_cmd_list = generate_ecu_cmd_list([ {"model": 0, "ecu": "VGM", "service": "22", "interval": 1, "did": "F1AE"}, {"model": 1, "ecu": "VGM", "service": "1902", "interval": 1, "input_parameter": "FF"} ]) return [create_schedule_or_event_ma("schedule", "2.0多任务周期同步" + str(randint(0, 100)), vin_list, ecu_cmd_list) for _ in range(ma_count)] @pytest.fixture(scope="module") def sync_request(): return { "rvdc.eventId": rvdc_get_datetime(0, "TIMESTAMP"), "rvdc.requestId": 0, "rvdc.appId": 1, "rvdc.vin": "L6T79T2E1NP004452", "rvdc.dataType": "maSynchronizationReq", "rvdc.payload.storageQuota": 25, "rvdc.payload.maFormatVersion": 0 } @pytest.fixture(scope="module") def remove_request(): return { "rvdc.eventId": rvdc_get_datetime(0, "TIMESTAMP"), "rvdc.requestId": 0, "rvdc.appId": 1, "rvdc.vin": "L6T79T2E1NP004452", "rvdc.dataType": "rvdcRemoveMasResp", "rvdc.payload.masremoved": "true" } def test_create_ma(ma_list): assert len(ma_list) == 2 def test_sync_request(sync_request): res = vehicle_req_synchronization(sync_request) assert res.get("code") == 100000 def test_remove_request(remove_request): res = vehicle_req_remove(remove_request) assert res.get("code") == 100000 def test_query_vehicle_cloud_log(ma_list): # 模拟异步推送结果 res_content_json = { "request": { "jsonObject": { "rvdc": { "payload": { "newMas": ma_list } } } } } res = { "data": { "records": [ { "content": json.dumps(res_content_json) } ] } } # 验证推送结果 res = query_vehicle_cloud_log(vin="L6T79T2E1NP004452", type="maSynchronization") res_log = res.get("data")["records"][0]["content"] res_content_json = json.loads(res_log) res2 = res_content_json["request"]["jsonObject"]["rvdc"]["payload"]["newMas"] assert set(ma_list) == set(res2)
在这段代码中,首先根据需要打印日志信息,显示正在进行DNA解码为位的操作。 然后,创建一个大小为(len(dna_sequences), payload)的全零数组bit_segments,用于存储解码后的位段。 接着,创建了一个默认值为列表的字典dubious,用于存储解码失败的位段备选方案。 然后,创建一个监视器对象monitor,用于跟踪进度。 接下来,使用enumerate()函数遍历dna_sequences列表,其中i表示索引,sequence表示每个DNA序列。 在循环中,首先根据是否有可变长度(vt_length)来截取DNA序列和可变长度校验位(vt_check)。 然后,尝试调用dsw.decode()函数对DNA序列进行解码,根据给定的参数和编码图(coding_accessor)、起始顶点索引(start_index)、是否使用快速模式(is_faster)以及可变长度校验位(vt_check)等。 解码结果被分割为索引位(index_bits)和有效负载位(payload_bits),将索引位转换为整数类型,并将有效负载位存储在对应索引的bit_segments数组中。 如果解码失败,会尝试修复并获取多个备选方案(candidates),然后再次进行解码。 解码成功后,根据备选方案的数量和是否只有一个备选方案,将解码结果存储在bit_segments数组中或者存储在dubious字典中。 最后,根据需要打印日志信息,显示解码的进度。 请注意,以上只是对代码的简要解释,并不包括完整的代码功能和细节。如果您需要更详细的解释或有其他问题,请随时提问。

try { //获取用户载荷 authorizationToken = authorizationToken.substring(7); //检查redis 只要有就继续 Long remainTime = redisUtils.getExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, TimeUnit.SECONDS); if (remainTime <= 0) { throw new AuthorizationException(BusinessCode.NOT_AUTHORIZED.getCode(), BusinessCode.JWT_SIGNATURE_EXCEPTION.getMsg()); } //检查签名 JwtPayLoad<UserVo> payLoadFromJwt = JwtUtils.getPayLoadFromJwt(authorizationToken, publicKey, UserVo.class, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey()); //redis续期时间 min long now = System.currentTimeMillis(); long jwtExpiredTime = payLoadFromJwt.getExpiredTime().getTime(); long reNewTime = Long.parseLong(BusinessConstant.JWT_RENEW_TIME.getKey()) * 60 * 1000; //判断是否需要续期 if (jwtExpiredTime - now <= reNewTime) { //获取旧的用户属性 UserVo user = payLoadFromJwt.getPayLoadData(); //过期时间 int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey()); String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey()); redisUtils.setNewAndDeleteOldWithExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(),BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, expiredTime, TimeUnit.MINUTES); response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(), jwtTokenWithExpireTimeMinutes); log.info("====客户端:" + ipAddr + " 用户:" + user.getName() + " -- (" + user.getUserId() + ") token续期成功!!!!"); }

这段代码是一个 Java 代码块,其中包含了一些逻辑代码。这段代码主要是用于实现用户认证和 JWT Token 的续期功能。下面是对代码块中各行代码的解释: 1. authorizationToken = authorizationToken.substring(7);:从请求头中获取 JWT Token,去掉前缀 "Bearer ",并将其赋值给变量 authorizationToken。 2. Long remainTime = redisUtils.getExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, TimeUnit.SECONDS);:从 Redis 中获取 JWT Token 的剩余过期时间,单位为秒,并将其赋值给变量 remainTime。 3. if (remainTime <= 0) {throw new AuthorizationException(BusinessCode.NOT_AUTHORIZED.getCode(), BusinessCode.JWT_SIGNATURE_EXCEPTION.getMsg());}:如果 JWT Token 已经过期,则抛出一个自定义异常 AuthorizationException,该异常包含了错误码和错误信息。 4. JwtPayLoad<UserVo> payLoadFromJwt = JwtUtils.getPayLoadFromJwt(authorizationToken, publicKey, UserVo.class, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey());:使用公钥 publicKey 解析 JWT Token,并获取其中的 Payload 数据,即 JWT Token 中携带的用户信息。 5. long jwtExpiredTime = payLoadFromJwt.getExpiredTime().getTime();:从 Payload 中获取 JWT Token 的过期时间,并将其赋值给变量 jwtExpiredTime。 6. long reNewTime = Long.parseLong(BusinessConstant.JWT_RENEW_TIME.getKey()) * 60 * 1000;:从配置文件中获取 JWT Token 续期时间,单位为分钟,并将其转换为毫秒,并将其赋值给变量 reNewTime。 7. if (jwtExpiredTime - now <= reNewTime) {...}:如果 JWT Token 的过期时间与当前时间的差值小于等于续期时间,则进行续期操作。 8. UserVo user = payLoadFromJwt.getPayLoadData();:从 Payload 中获取用户信息,并将其赋值给变量 user。 9. int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey());:从配置文件中获取 JWT Token 的过期时间,单位为分钟,并将其转换为整数,并将其赋值给变量 expiredTime。 10. String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey());:使用私钥 rsaProperties.getPrivateKey() 生成新的 JWT Token,并指定其过期时间和 Payload 数据。 11. redisUtils.setNewAndDeleteOldWithExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(), BusinessConstant.JWT_REDIS_KEY.getKey() + authorizationToken, expiredTime, TimeUnit.MINUTES);:将新生成的 JWT Token 和 Redis 中旧的 JWT Token 进行替换,并设置过期时间为 expiredTime 分钟。 12. response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(), jwtTokenWithExpireTimeMinutes);:将新生成的 JWT Token 放入响应头中,以便客户端获取。 13. log.info("====客户端:" + ipAddr + " 用户:" + user.getName() + " -- (" + user.getUserId() + ") token续期成功!!!!");:记录续期操作的日志信息,包括客户端 IP 地址、用户名称和用户 ID。
抱歉,我犯了一个错误。OpenMV并没有提供fs_mkdir函数来创建文件夹。相反,您可以使用os模块来创建文件夹。请尝试以下修改后的代码: python import sensor import image import time import pyb import os # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time=2000) # 初始化引脚 pin1 = pyb.Pin("P1", pyb.Pin.OUT_PP) pin2 = pyb.Pin("P2", pyb.Pin.OUT_PP) pin3 = pyb.Pin("P3", pyb.Pin.OUT_PP) pin4 = pyb.Pin("P4", pyb.Pin.OUT_PP) # 在内存卡中创建一个文件夹并保存四张二维码图片 # 创建一个文件夹 if not "qr_codes" in os.listdir("/sd"): os.mkdir("/sd/qr_codes") # 拍摄和保存四张二维码图片 for i in range(4): # 拍摄图片 img = sensor.snapshot() # 保存图片 img.save("/sd/qr_codes/qr_code{}.bmp".format(i + 1)) # 等待一段时间 time.sleep(1) while True: # 拍摄一张图片 img = sensor.snapshot() # 在图像中寻找二维码 codes = img.find_qrcodes() # 如果找到了二维码 if codes: for code in codes: # 获取二维码的数据 data = code.payload() # 检查是否是保存的四张二维码之一 if data == "qr_code1": pin1.high() time.sleep(2) pin1.low() elif data == "qr_code2": pin2.high() time.sleep(2) pin2.low() elif data == "qr_code3": pin3.high() time.sleep(2) pin3.low() elif data == "qr_code4": pin4.high() time.sleep(2) pin4.low() 请确保在运行代码之前,已经将四张二维码图片保存在OpenMV的内存卡中的"qr_codes"文件夹中,并将引脚名称适当修改为您所使用的引脚。如果您仍然遇到问题,请提供完整的错误消息以便我更好地帮助您。

最新推荐

payload_type

RTP中更重编码的代号RTP中更重编码的代号RTP中更重编码的代号RTP中更重编码的代号RTP中更重编码的代号

抖音上的给朋友发送天气的小程序.zip

如题,抖音小程序源码,易于运行部署,用于学习交流

300596利安隆财务报告资产负债利润现金流量表企业治理结构股票交易研发创新等1391个指标(2013-2022).xlsx

包含1391个指标,其说明文档参考: https://blog.csdn.net/yushibing717/article/details/136115027 数据来源:基于上市公司公告数据整理 数据期间:从具体上市公司上市那一年开始-2022年度的数据,年度数据 包含各上市公司股票的、多年度的上市公司财务报表资产负债表、上市公司财务报表利润表、上市公司财务报表现金流量表间接法、直接法四表合在一个面板里面,方便比较和分析利用 含各个上市公司股票的、多年度的 偿债能力 披露财务指标 比率结构 经营能力 盈利能力 现金流量分析 风险水平 发展能力 每股指标 相对价值指标 股利分配 11类财务指标分析数据合在一个面板里面,方便比较和分析利用 含上市公司公告的公司治理、股权结构、审计、诉讼等数据 包含1391个指标,如: 股票简称 证券ID 注册具体地址 公司办公地址 办公地址邮政编码 董事会秘书 董秘联系电话 董秘传真 董秘电子邮箱 ..... 货币资金 其中:客户资金存款 结算备付金 其中:客户备付金 .........

ssm数据结构课程网络学习平台的+vue毕业论文.doc

ssm数据结构课程网络学习平台的+vue毕业论文.doc

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

Objective-C中的协议与代理设计模式介绍

# 1. 理解Objective-C中的协议 协议是Objective-C中一种很重要的特性,它类似于其他编程语言中的接口,用来定义对象之间的通信规则和行为约定。在Objective-C中,协议可以帮助实现对象之间的松耦合和重用性。让我们深入了解Objective-C中的协议。 ## 1.1 什么是Objective-C中的协议? 在Objective-C中,协议是一组方法的声明,定义了一个对象可以遵循的接口。协议本身并不实现任何方法,而是规定遵循该协议的类需要实现协议中定义的方法。通过协议,可以在不同的类之间定义一组公共的行为和方法。 ## 1.2 协议的声明和使用方法 在Ob

编写求n!的函数f(int n),在主函数中输入两个整数m、n,然后调用函数求: C=m!/n!(m -n)!

好的,我可以编写这个函数。以下是代码示例: ```c++ #include <iostream> using namespace std; int f(int n) { if (n <= 1) { return 1; } else { return n * f(n - 1); } } int main() { int m, n; cout << "请输入两个整数m和n,以空格分隔:" << endl; cin >> m >> n; int C = f(m) / (f(n) * f(m - n));

视频中运动目标跟踪算法的研究.doc

视频中运动目标跟踪算法的研究.doc

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依

Objective-C中的推送通知与APNs实现

# 1. 推送通知简介 推送通知是移动应用开发中常用的一种技术,它可以向用户发送消息、提醒或通知,即使用户并未在使用应用时也能及时获取重要信息。在Objective-C中,实现推送通知需要使用苹果提供的苹果推送通知服务(APNs)。本章将介绍推送通知的基础知识,包括推送通知的概念、作用和原理。接下来我们将深入了解。 ### 1.1 什么是推送通知 推送通知是通过网络将消息发送到设备的一种技术。应用程序可以向设备发送推送通知,无论用户当前是否在使用该应用,都可以及时获取到消息或通知。用户收到推送通知后,可以通过通知中的内容了解到消息的来源和内容,以便及时处理。 ### 1.2 推送通知的