提交 10473ed8 作者: 崔世豪

.

上级 1d93391d
{
"BackgroundImageAbsolutePath": "D:\\元气壁纸缓存\\khealtheye\\wallpaper\\819085eea5630f629d254db412dd465d.jpg",
"BackgroundImagesDirectoryAbsolutePath": "c:\\users\\94549\\appdata\\local\\microsoft\\visualstudio\\17.0_5fa53c3a\\extensions\\e25nvwu4.ep5\\Images",
"BlurRadius": 0,
"ExpandToIDE": true,
"Extensions": ".png, .jpg, .gif, .bmp",
"ImageBackgroundType": 0,
"ImageFadeAnimationInterval": "PT5S",
"ImageStretch": 3,
"IsLimitToMainlyEditorWindow": true,
"LoopSlideshow": true,
"MaxHeight": 0,
"MaxWidth": 0,
"Opacity": 1,
"PositionHorizon": 2,
"PositionVertical": 2,
"ShuffleSlideshow": false,
"SoftEdgeX": 0,
"SoftEdgeY": 0,
"TileMode": 0,
"UpdateImageInterval": "PT1M",
"ViewBoxPointX": 0,
"ViewBoxPointY": 0,
"ViewPortHeight": 1,
"ViewPortPointX": 0,
"ViewPortPointY": 0,
"ViewPortWidth": 1,
"WebApiDownloadInterval": "PT5M",
"WebApiEndpoint": "",
"WebApiJsonKey": "",
"WebSingleUrl": ""
}
\ No newline at end of file
......@@ -87,11 +87,12 @@ void acquire_config::get_configuration_file()
QString key = "/Chair/";
chair_type = msetting->value(key + "chair_type").toInt();
chair_type = msetting->value(key + "chair_type").toInt();
publish_message_type = msetting->value(key + "//publish_message_type").toInt();
username = msetting->value(key + "/username").toString();
password = msetting->value(key + "/password").toString();
server_url = msetting->value(key + "/server_url").toString();
server_grpc_host = msetting->value(key + "/server_grpc_host").toString();
mqtt_host = msetting->value(key + "/mqtt_host").toString();
mqtt_port = msetting->value(key + "/mqtt_port").toInt();
mqtt_keep_alive = msetting->value(key + "/mqtt_keep_alive").toInt();
......
......@@ -29,7 +29,7 @@ public:
{
std::lock_guard<std::mutex> lock(m_mutex);
if (m_instance == nullptr){
if (m_instance == nullptr) {
m_instance = std::shared_ptr<acquire_config>(new acquire_config());
}
return m_instance;
......@@ -51,6 +51,7 @@ public:
QString password = "";//登录密码
QString server_url = "";//服务器
QString mqtt_host = "";//mqtt ip
QString server_grpc_host = "";//grpc域名
int mqtt_port = 0;//mqtt 端口
int mqtt_keep_alive = 0;//从发心跳间隔
int hardware_to_chair_way = 0;//读取座椅数据的方式
......
#include "bulldozer_module.h"
#include "bulldozer_module.h"
#include "global_signal.h"
#include <QString>
#include <QStringList>
#include <QMap>
#include <iostream>
#include <QThread>
bulldozer_module::bulldozer_module(const QString& ip, quint16 port,QObject *parent)
bulldozer_module::bulldozer_module(const QString& ip, quint16 port, QObject* parent)
: QObject(parent)
{
QThread* _pthread = new QThread(this);
_udp_thread = new udp_thread(ip, port, "bulldozer", this);
connect(_udp_thread, &udp_thread::udp_received_data, this, &bulldozer_module::no_udp_received_data);
connect(_pthread, &QThread::finished, this, &bulldozer_module::deleteLater);
connect(this, &bulldozer_module::destroyed, _pthread, &QThread::deleteLater);
this->moveToThread(_pthread);
_pthread->start();
_udp_thread->udp_write_date("1111112222222222", "192.168.1.3", 44444);
qDebug() << "bulldozer_module thread ID: " << QThread::currentThreadId();
}
......@@ -23,5 +27,67 @@ bulldozer_module::~bulldozer_module()
void bulldozer_module::no_udp_received_data(const QByteArray& data)
{
global_signal::instance()->publish_chair_movement(data);
}
\ No newline at end of file
parseData(data);
}
void bulldozer_module::parseData(const QString& data)
{
QStringList dataList = data.split("#");
QMap<QString, QString> values;
foreach(const QString & entry, dataList)
{
QStringList keyValue = entry.split("=");
if (keyValue.size() == 2)
{
QString key = keyValue[0];
QString value = keyValue[1];
values[key] = value;
}
else if (entry.endsWith("bt1_down#"))
{
QString key = "bt1_down";
values[key] = "";
}
else if (entry.endsWith("bt2_down#"))
{
QString key = "bt2_down";
values[key] = "";
}
}
// 读取解析后的值
int left = values.value("left").toInt();
int right = values.value("right").toInt();
QStringList joy1Values = values.value("joy1_f_b_l_r").split("_");
QStringList joy2Values = values.value("joy2_f_b_l_r").split("_");
int joy1_f = joy1Values.value(0).toInt();
int joy1_b = joy1Values.value(1).toInt();
int joy1_l = joy1Values.value(2).toInt();
int joy1_r = joy1Values.value(3).toInt();
int joy2_f = joy2Values.value(0).toInt();
int joy2_b = joy2Values.value(1).toInt();
int joy2_l = joy2Values.value(2).toInt();
int joy2_r = joy2Values.value(3).toInt();
// 检查按钮状态
bool bt1_down = values.contains("bt1_down");
bool bt2_down = values.contains("bt2_down");
// 输出解析结果
std::cout << "left: " << left << std::endl;
std::cout << "right: " << right << std::endl;
std::cout << "joy1_f: " << joy1_f << std::endl;
std::cout << "joy1_b: " << joy1_b << std::endl;
std::cout << "joy1_l: " << joy1_l << std::endl;
std::cout << "joy1_r: " << joy1_r << std::endl;
std::cout << "joy2_f: " << joy2_f << std::endl;
std::cout << "joy2_b: " << joy2_b << std::endl;
std::cout << "joy2_l: " << joy2_l << std::endl;
std::cout << "joy2_r: " << joy2_r << std::endl;
std::cout << "bt1_down: " << (bt1_down ? "true" : "false") << std::endl;
std::cout << "bt2_down: " << (bt2_down ? "true" : "false") << std::endl;
}
#pragma once
#pragma once
#include <QObject>
#include "udp_thread.h"
class bulldozer_module : public QObject
class bulldozer_module : public QObject
{
Q_OBJECT
public:
explicit bulldozer_module(const QString& ip, quint16 port,QObject* parent = nullptr);
explicit bulldozer_module(const QString& ip, quint16 port, QObject* parent = nullptr);
~bulldozer_module();
public slots:
void no_udp_received_data(const QByteArray& data);
private:
void parseData(const QString& data);
private:
udp_thread* _udp_thread = nullptr;
};
-----BEGIN CERTIFICATE-----
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
o6lAJKPRuI9JE9nF/+sBC+Z7Nc2K+D3+EEAdsw==
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0vbZ0cF0Bj3zu7bCC/GE
brAFn4NES4vbYUEmczOsAFSi58imUYk1ZkjZ/SG9rVq6K9QnMVu1ZjnPeTUUC1yx
8C9k8bAM+xdRpisKNrPL18ju7AcRcxgRYdcPS81017KXx+7ZFgQvxl0a89gy7DOC
l1wg0mQ8/nFb1sMy47uT9OvFbsOW29yRmWZAtIaaVCFpWoBhXLYPXYdNcFNlOnTk
yBq04IAaLj8NKoiaOY+DS55XykNC4+inTvzZOUFlFKSfjTitz5aNdIfuOi5VFfte
xHH8LT5piDtjvOUzyahjgv0GQTPOxmkcCdweAkegbumvsHKW7QzjgY0V8md34hrP
h14qNy9+/0M1uuZY5rXDvgItD76y2s4X4+YJswwY1xB9IiWe7HTUgVqMQ3KpHebn
EL59Hpp6pmgObrzcIR19EX/3555Y7KeErApdMtObZzmTsV9LYb8ggFtffUScfnIx
BAr52Xi8BSivtSajwo37q0uQvhcpiNx6g1KRXXWSV76xKf6RbMzJS+iKIe1sYtDS
ohx+DJLdM3T2Acy4ivqoS83yf5ONzOFw0zt06NzKo0rnFjEbuYaWiivdm0SIB4NL
QsEFr1p4F4fpck/TQxyEzAsl6Ffk5/SokQEVUQMHfkf3ZyD24ymMtV9bTTPkh2Kk
n1NhQ1mRMcdbj89KXhuIvtcCAwEAAaNgMF4wHQYDVR0OBBYEFOgvkc5HmPmMF7lK
wAWkjyG50w7VMB8GA1UdIwQYMBaAFOgvkc5HmPmMF7lKwAWkjyG50w7VMA8GA1Ud
EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQBWdpdn
/Z+0fYRSZzRfY72hsLvmfrBy5CSjtxZ7OhJJNpnY9wprPXFHT4M07PCkCryb1Yk1
liRvk9LwkbEQez2jCc9Fe3MsDAyP3TumNSnGEH5P8wg6ISBILJW70Vlzjf993Rj3
R5ASTydfmEyKsTnxO2SdFaWJqrcnx0wd+/g8ImrQkNS8JG36Q49beGf8u13gdVkF
06SsY1Edf9zh7UPdL3scg89nLzVq3hswCtg8j2Kbee60Nap/Q5xrsJJ6uwgg8XnG
Zx6GsOL+rulXZ7KrPT8T5i/qD9YZyn9jztMeJfSOujmtY2vum2uOibkE3QhnyIlw
NTd9e8OryWEGFfjUiaw8YkOxoiajVyumD3q5LaYKbjshUX2Ui1+Vk1htN9/Ak2XG
/+WlaA1X6d/oU6lJ5XHTix86boR8zO/gtyz/ZhXIxeYXBOHAo3qHNLhV9YY1VgeX
rrEaYWinwUN0tcIGqIkTeoERSrOfx6/9ouxHEbpBZn4RjHps2Zy8RInn2wYjXPrW
JrUsFHIXvjy0cxdgWny+K/XSkclb0tp05knfw6pJ3myacxb8VGra5xauum27EZnj
3F7QtCISjzNXMtStzCcB/ji+ZT8wZm1hL7P4SKRzO2n+IrVd3/wIbn10YzWAr5Na
RkBI0znua6P2lEqtym3seAq4RYRBr5JpWrh0VQ==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC4guItZKtQYna3
IQL+RgWqGbpV9rHE2W3fi19/FAIzTXSsrItIGO7gQG8RdLhnqHnxjufVC/ONtjNC
nf1s4DlefXRFnHT2cVPOvu99tSyDd9q4/nwa6agccPoBzLyTiYiSDDHxQAVq2FQD
3EuN+gJ/FkCWeTAiKjLA89EtVNSNd6fE7lHow/BFbZzuN63TkpJmlmzV+F5JJisQ
o5wc2S5ZbtJocpKPkzFmatL6oEQ5N0/kS1QOnvlsarw3W3t6Ju5TK4GLS6u2fcq5
NL1C6bnv5azCWy+PZi6l0vKTyFrhpU9oS+3QyD7glvF3Y+q5IanuJBr4cPVK28I0
SHgS6c8T7uv7VNx7m1GowKLkzmEJosJMltnBsk0rAAnNhy+II1Ez2zJtUur4T9WW
0khjGVEPuM4b05JygHvo3LEseb50xiaki46JUxR7J2JbAddTIQMmTbmswxnuXnMW
NA29rE4XPCwYEIgW2exMBefUpl9kn8aTDnW6TWd0lpSNi8xyjp18y4w87BrYUOA8
bWhIWMPY7RbSHNyYMTTQ8XTT1ghIXIC9hBu0K5/az420n3cnt3bCwtdRIpu46KiO
MBCSu2l4uU9yiRhN0RxkASgpU/o7FgQhWWE3CmYl9CuiIPpcV7qryjKlzu6vxWLW
cuwhN7jtg3E+Wd0JQ0I4a6pvEZLIJQIDAQABAoICABJnc7oFZZUiDSddEphcUapS
4KQ8dCTnby8yDrd1Pnbxjea/WzE403Lo2mtKUi58vpUapQM6KvQCrYBClAmtH+vN
5bAf2AbQ7QQdRXQrgyIl7VowgB6LGeqkVjuhuVmaCVZQAxdGRIQQyeiMq7igrGkS
xiR8OBHgVamraDz2TjFCMyjQgLkP+kJimZmlUiBdaV70OCzrljQDq54AQ80Y2Kex
BynF69qIWxAVLbA0FjoCy2RBI0RGFSj8SIPZCyr3ASSonUZQqPMN/w+UNCCdgZ9t
MFs+jzLlhVei//E/tdj2DUKg+DqwDp2GUNWQ0NPgiLupPEt1sPHjk651YAy6552w
9s2ZR20uMLrKNFPWWJD830eEBdbzf6zHTf42zqlaYKJz8DkIs+j4OXFwzKL4LMw+
BSJT93sgkVQ6fWZgEk27qlxlfB3aRvMM8VQz1m//mtOyoX9RHd9ZtPXbnMO2I0ML
a8MikRw76BmTioIDlHdjvLwAiZQTJUw8BEwX3LanH9H5Bs7bo5ajf1onnGQ29xLR
f0ZOxXj3eoQGV6IODgIHadJ0KWarDj294uBo98wzfetc+EnJrqHHBW4AkSxoi5+G
cdxTp3LPskMEWMEugfFjBwGttxh8LOLMCRKspyAumxxiDOzQ+6uDnlxq45WSk9wy
b+FStkjgF2VWBaePR/mtAoIBAQDlUrBdd5khakvFylDFNvezkHMXEr5u4tDSDAXd
oVW3cPc/zSimZM5ljX/tpmV7WiVVWQsAInVSbVnFe9st5yIRcnWGRlJyl476FkK7
mox8+hhdHDCjgKC9e/U9BXFxwddVKvbPgLThrb4zLNo2w8B6hOVW17ZuHD7Ws0yh
Apx1xkn0VeQuia/ap+BFALIWpKnM9NzZm0JduJPXGZ5fkfrfn6pcEpU00bUYYBe2
axDhkI8w7JUcsVmeuiV8upMoKwGCoxGueYSBMwmcWjNM1r7E4Irn/kOBQAgvVYjQ
FJvAsrLsWGmqMNXi3F8DSLkjhxP0LNd0lhadb4aZuakPew2bAoIBAQDN+a/X/EQL
AFlhK8GN8iJTcC4Jks+slEiYy1HBGLSh62eLgjW3keLK0Y9iVrsgvAoJzSp5D0uK
Yd0lomNe2Nun0OMDifQhROiUCuyQOlq1oDTtUWVOqe28/jHmSTcV0LJ2dhWIIwnk
9rZoo1ePHUSBNA9+TQs+1W+UO6Jsa9P9GHozBBFKxEDRJ2qmK60nZvnX4CyOpmv+
WTVawGMZLS89DS0VAjwzMjag3vby/HUCEaMvZlaYcTAczxQmivInWjB8IY8fea6Z
JBtb2G+JTqVcDLqPlssmQEcCXUvibh6qt87/FrSv0yy9XZ6WhprJdQ9lNFrjkcNJ
WgVL4/HfLb0/AoIBAQCUSHCkL3aEBeCzJ4wsyctHf+r7i3I5704J1B5i3jS35kLq
LXXQijRvtBx5hfPu3C5xzp7vWli0kOLQcLMcLm14DKPzzDr5wAiCq6xA9MFM+saQ
Rm8o+j5159Z+u6tMXIQpnRt0t4u+tgLbwm/jo5YtYwuMqPVco8T6PXwaTL7w5OPj
Kzrd4MgmQhEhbT66p4Toc5ju2JcEVRq7puQidhlbSjn1SUrTmZpZBaGvofGLeVct
0nzkzcTefw1IZrhK6+wRFfKT+B13EZJwWF79m4pFcdBADMiHpejk+pD5w6mm46YQ
b2b71pInHEoPrJGSaIC9jdVPnNFIwdmuQ0APM4lrAoIBADOTI763QepnSfoU1MBQ
MtwlqMFo62tRLeRkdLIfF4u7wA+kqQKwGtOiKX78LJsDupe9sbbiZ43c91znDm6/
ajDZEx7dui1ibcI0AgwTMIdt+BK8YNuTnR3HoIMDLjHeMfGLm9ScwWt9gyssS05g
i7i2anK7o+c11lyNmhv/2/Lx4BdKG3JXNcupTQESyqalGEY/sah+b2geukdhCO9S
6xMka3dpOd2v4xHhAoDRShMci3ng7Cn7nYp5J5iHDh9ga+eJF6dP9rIN4nPa/AKr
mKg137j4jyGi0qT663dlD3S71a715oRoIjnAaWdTiQqMrzAuLdvxsa56Rf08tGGn
uE0CggEBAKyxuCer8zx4JTmysu/FtMJIeaeR1wGAObgxZ6Ugi1QuRijktat/GQn9
EQ5w2bo/g2vA1T9A5qbc0INv/VOSsDI9nmOP4GKWn97SI+35bzhV2hPWM9l6SPik
UntQ2hOPJyPzsutTgs52Ps5O/kuG2mooGjld2D4p1UFC/n/lRWJWEKkdbD9b4KvG
vat2X97C+b3igPNgKyz0tAFukfjTZ9qJCtd2lWqWFBEeyf6H18WA5hJKJPgfTs5z
LPy9I25ijGMn0U0pM3BLHpEBETEPHpiGfkYDuxFuCh7oKQ6Pbcw4go6LuLJXdsRY
1dTFMNhema2Li7ZPqxNGgbNT6T8BmfA=
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
7kxzzoqMAuHGhHLlI9vWUdj6Y3mKUKw=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
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
o6lAJKPRuI9JE9nF/+sBC+Z7Nc2K+D3+EEAdsw==
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0vbZ0cF0Bj3zu7bCC/GE
brAFn4NES4vbYUEmczOsAFSi58imUYk1ZkjZ/SG9rVq6K9QnMVu1ZjnPeTUUC1yx
8C9k8bAM+xdRpisKNrPL18ju7AcRcxgRYdcPS81017KXx+7ZFgQvxl0a89gy7DOC
l1wg0mQ8/nFb1sMy47uT9OvFbsOW29yRmWZAtIaaVCFpWoBhXLYPXYdNcFNlOnTk
yBq04IAaLj8NKoiaOY+DS55XykNC4+inTvzZOUFlFKSfjTitz5aNdIfuOi5VFfte
xHH8LT5piDtjvOUzyahjgv0GQTPOxmkcCdweAkegbumvsHKW7QzjgY0V8md34hrP
h14qNy9+/0M1uuZY5rXDvgItD76y2s4X4+YJswwY1xB9IiWe7HTUgVqMQ3KpHebn
EL59Hpp6pmgObrzcIR19EX/3555Y7KeErApdMtObZzmTsV9LYb8ggFtffUScfnIx
BAr52Xi8BSivtSajwo37q0uQvhcpiNx6g1KRXXWSV76xKf6RbMzJS+iKIe1sYtDS
ohx+DJLdM3T2Acy4ivqoS83yf5ONzOFw0zt06NzKo0rnFjEbuYaWiivdm0SIB4NL
QsEFr1p4F4fpck/TQxyEzAsl6Ffk5/SokQEVUQMHfkf3ZyD24ymMtV9bTTPkh2Kk
n1NhQ1mRMcdbj89KXhuIvtcCAwEAAaNgMF4wHQYDVR0OBBYEFOgvkc5HmPmMF7lK
wAWkjyG50w7VMB8GA1UdIwQYMBaAFOgvkc5HmPmMF7lKwAWkjyG50w7VMA8GA1Ud
EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQBWdpdn
/Z+0fYRSZzRfY72hsLvmfrBy5CSjtxZ7OhJJNpnY9wprPXFHT4M07PCkCryb1Yk1
liRvk9LwkbEQez2jCc9Fe3MsDAyP3TumNSnGEH5P8wg6ISBILJW70Vlzjf993Rj3
R5ASTydfmEyKsTnxO2SdFaWJqrcnx0wd+/g8ImrQkNS8JG36Q49beGf8u13gdVkF
06SsY1Edf9zh7UPdL3scg89nLzVq3hswCtg8j2Kbee60Nap/Q5xrsJJ6uwgg8XnG
Zx6GsOL+rulXZ7KrPT8T5i/qD9YZyn9jztMeJfSOujmtY2vum2uOibkE3QhnyIlw
NTd9e8OryWEGFfjUiaw8YkOxoiajVyumD3q5LaYKbjshUX2Ui1+Vk1htN9/Ak2XG
/+WlaA1X6d/oU6lJ5XHTix86boR8zO/gtyz/ZhXIxeYXBOHAo3qHNLhV9YY1VgeX
rrEaYWinwUN0tcIGqIkTeoERSrOfx6/9ouxHEbpBZn4RjHps2Zy8RInn2wYjXPrW
JrUsFHIXvjy0cxdgWny+K/XSkclb0tp05knfw6pJ3myacxb8VGra5xauum27EZnj
3F7QtCISjzNXMtStzCcB/ji+ZT8wZm1hL7P4SKRzO2n+IrVd3/wIbn10YzWAr5Na
RkBI0znua6P2lEqtym3seAq4RYRBr5JpWrh0VQ==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
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
1dTFMNhema2Li7ZPqxNGgbNT6T8BmfA=
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDS9tnRwXQGPfO7
tsIL8YRusAWfg0RLi9thQSZzM6wAVKLnyKZRiTVmSNn9Ib2tWror1CcxW7VmOc95
NRQLXLHwL2TxsAz7F1GmKwo2s8vXyO7sBxFzGBFh1w9LzXTXspfH7tkWBC/GXRrz
2DLsM4KXXCDSZDz+cVvWwzLju5P068Vuw5bb3JGZZkC0hppUIWlagGFctg9dh01w
U2U6dOTIGrTggBouPw0qiJo5j4NLnlfKQ0Lj6KdO/Nk5QWUUpJ+NOK3Plo10h+46
LlUV+17EcfwtPmmIO2O85TPJqGOC/QZBM87GaRwJ3B4CR6Bu6a+wcpbtDOOBjRXy
Z3fiGs+HXio3L37/QzW65ljmtcO+Ai0PvrLazhfj5gmzDBjXEH0iJZ7sdNSBWoxD
cqkd5ucQvn0emnqmaA5uvNwhHX0Rf/fnnljsp4SsCl0y05tnOZOxX0thvyCAW199
RJx+cjEECvnZeLwFKK+1JqPCjfurS5C+FymI3HqDUpFddZJXvrEp/pFszMlL6Ioh
7Wxi0NKiHH4Mkt0zdPYBzLiK+qhLzfJ/k43M4XDTO3To3MqjSucWMRu5hpaKK92b
RIgHg0tCwQWvWngXh+lyT9NDHITMCyXoV+Tn9KiRARVRAwd+R/dnIPbjKYy1X1tN
M+SHYqSfU2FDWZExx1uPz0peG4i+1wIDAQABAoICABPUQAUHOfCcQhySwQp+WQRO
ZzjnDbRMIQKzLPoHEVO2oNlIctmXG/3ROywfz8RLktQrzMNG63YAWQ/7fTbUL6Vz
zvkoow+20WXdBci+fZp6uHpW77zxtjCMFlP5q9HaZ4nTWXRIUHVEqxPgbmjlLpEr
h6o+4bzIyukUz+O37eBHiPcwSy2/PbA9fDd7r2XY/h4TkxMzyZ3w6cZ1ED6+XgKw
/+9aGxvdsU8eJ+DhLGYfLAFG8TKa258BBSnsi6O1FYogmbW5YPJjFHFDiZvXVMEC
NcHK7AByFJ3crVF3EmNthPj79aOQnaIPnoJ4WQwTyv+6xZTicT/sEvQF5a7K9laH
QRgArCV7Eg9CRbnHXZ4oyuWVn8zkRxqyHg72+7bWLee9QmCQcQiw/qUbH8EFtRGm
tQX1jziXqk6S7UQMK3P0UbspiT/9ZCcF5zx4Qmvjopv3tUpz8xgy2Qi5ou3nvHmj
G9I4Bd8YmYtaQeHMY51cof4dpdvkQOquItefGa+bV2S46R/ntpMsPOb8uKVtokFz
SXC3KgtDBJDQ9y8JFiTeY4iUmgqOMd6P+EwRvzYH93RGRQ5+l5WWMM+Uaa8uisV2
DubWqfs7qOCKamzwahbXylEfldodStDPhZM5a13W2BjHV0uTCV5FDQd5dxkwIvB1
UvJ4s8UfaJquwPXczTCBAoIBAQDtICopU0fhm5vaNR+nNb8PqkoLJkGgAbXBccmd
sNiS2ahK3mjbdYcwUF3wPGHSHbir7CJrm2ia1JvI5U19k25RiSOKLwmIDFeZ6yej
XvC4SwuMk14MDD08X5xGL5dEZDhFjVMtVBP+0IlPIaV1IxJfupOB3pdlr65y018/
k2e5VIsaaqYqYTUXlIkX53qIQIXbkkQ5RfcRfd6OFzxabmeUARlv6mE61qMUif7w
B9sQeA8qZgTJGs4HiYd+cUKvDFVk8EQ5e60aS2m952MasuaKDGyM3+RpQvEifwlV
d17EYmbXuTfR1fT22ltZhpX1adxBpZC/pw09SnD7Tsit/FjVAoIBAQDjwZqU9ZnS
/hjiCqyUkG0PZECxVKOmRhkljzkDkqP7HT7gUOU6OAgLV5H8kiGW3FJDfoFlLnIL
m/miWZy1NhmMnf90ZVXhdXyVFtlW2TcVoG+I29TFImLKgGU0dzqEeZ884qlgWQSC
nS2tu3ZFK/lTl+F0i7XdUzACa/d7GEJDkySH0KIHNRoGJqsNY5I+8TvwrRzFhy03
lzrz0y1eLqwu9G8cNxI1DAbZgAYZgfXPe9FC1MKNWvq8/2QDivutRBSOb/qGBaVf
e51g7OY0ulJ5vK/pURQJh51x7+6eU/ovjbPXiK+RW5noXdj7AhJfbUW300+06uXn
QJONBAk4Og77AoIBAQCyAvaDxYht3rKWklDr5xZCvVUOn66eXwpCaZiwr+U2AP4t
DmBreASACaUrxzisUzGipweD/sv9h+RXYYTV48rqnOg4QW2HW7Sb0QQVyh0uTPAj
nTH6G2oRG7mmmu2VIyN3W0v4+Gh2X7jk1d5vXF/by6YW1bKUXNm6S+HySUeRwt0W
fL+3ivgfdpugfV7oUH/swRZEZLjAwdxEkT72qHFLk7Oz56EMWbtdnObs7QjQiUDh
VGr9SgkncWBtVLt5y+mDeDfPa4AdAEYmkUE99tXJBuCqtR20w9NgUTwBlDZpeXG5
Osuj1FoswunXAIktDkaSZaePqOnwfCTrFE7lBk7tAoIBAQDQ06Ei15Y1CVpTV6op
hcsZg7h1X7+1IyzHbWy/Q+MqygPutP2YxetKSv7F8E7v/g9HZ2TJGy7iSh83pqay
2GnQrsWdOZTm5kxWft7EbOG+6J2bhMSwA/lE5zjkRDXZZZKFxuW6O6SRBgDt/KZS
giFXbjkAHWGhDzdD4S7HJNUNFIs4JCmMJjo4TZgk7JkZMSLeaDurOWhSQk2BZq2A
X5bsbp655hzBmsdlAaeWF70Egui6OE4yQasJQ7m2LebZVUTr3Ox9mgupYrRIPK5O
xk/84u8AJKEUo83OvEmzzhflJi4xf1hLFQwnLHVYoOurp4t3Iz9ACOjHgkRH1d2G
OmWlAoIBADpRi23FapBO0QeVP+M42cDkydnAB79lCbLIlQh5K13M+RSe3XQQIPs+
yXprndZ/ZTxz5y2Up9Je660GWMTMN5SlwUij//TlzwoyfBKE5jJwELYrfM2NmnD+
BBJ60E8gg6Nm41oFyvRi3UR1ImSVUyExRaue9aeus01q0gLmg+mzu0lBOgA6GwrS
pRW6BEQZknBWczxWcJp590X3JTv2po5u/C4EXqk4ISv8VUebzxEWIc2VPAxLv4Oz
tTRkMnIka7EhgzLKfSzLlp0kn1BoEyOYePX1vZ/S4aAKRvBURAfDg6Be4Vtpog0t
7kxzzoqMAuHGhHLlI9vWUdj6Y3mKUKw=
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC6IVgX5N4HlLsu
VtUf1t7cZeWJrxMJkKxQ5GlHputpSrq/aSZUcWys4YC+3mnPJB8sRr+gyJ1mR76y
OxxrCi+C/kvtstDdXbnD4aQLMcSeRSFPWH03WGMLQnitZDssMz8RyeOsLziQBUKU
FKkG/zVIwcJoxO3d4fxRRpGAv7GFnLmOnJodw+H2ugls/atv6H9scabo5m88Jvrv
LY3nUysCqOr5532xDw+FKKxoGLuZQZVVJpXefbPeguulN5fiPNPWMO+lbaXlhbyf
Wsg/DFIME5OPPZdv2Hv9Avt7h6WAALbdLhm82iDeNKbIIWKeZHsXHJumpyKCYELt
vQKYhLstAgMBAAECggEAZ6ya/PQmF+LoP+9t1sZAbFL1f7Nczz8ePBB988Mt7QAK
9QMErpRfDAyvQaFxHkfodSkTI+OaiJX9yhjSw2xw+m3arROk8yh5iHnufa3C7sVi
wGdxl5pL0MG9phbmPsBsqOPjRM0onE/RvdmkLJmKfHQwbVsDg0uU11CPSz97CghG
xTLKQKohJ2P2Dmf5bRgr36AwgIssUlwTBtKxW9hoehevWOi9q2E8UgcoZmmoH1HK
Prc3EUzI7tbJbDalnIoiNM4zI2MuptTJ9rSZ2VY5Ua+ij9SS7617qlEOKdGFo3A7
OvqQGgARDTp9SJc71PitQW8mD4ps0yvycxbhJhErAQKBgQDbho6c52RnWj3oMNqd
a3wL0z4jetiXtFrAqjDv1k4eRGCD+YDpBy18KHvcQ2G67WApwuDS28hmKbdPbIYw
e6Ag5jn5+uhoWbVRQPaTSb8U7qFJK8aIMxFlJfQYZ1+voA7qbw8TZUrCAd9Z+bM9
4Kq2JXCKddI89GyWoqSX0uPFyQKBgQDZDlPJH8nk+QUKRaHZhmdzmZDBpLqpmVr5
HPHmgZtgbp1jkzkI4YsfUTSfWbfavRdEvocjR8z2qhThJsulw/hTHsCKKShf+sM6
wjWjGo3Lj/Jmqx1/wEf90cBWvm6nk2DWK23/L1UrfSgs3KYajpEw30ug/jkRG40w
T74d7oMMRQKBgQC3wThbKm2m/ajYVRyJrNEW7OoUtN3cjsFwiIWSHOci+sV3c0Bu
zu1KAnE7fMOvvsdB7bhXiFWE/uJMf2EL8E+nek+Jandj8cOOkjxUKeTi1qT3JMd4
dpbW/iAG1XEJB4e0wOXzrFQZdYvKOvPIlekPsuMzY1BqaYcDyHzSAVtb0QKBgDtx
bQi7p/MJL5QslbKY2GQUPkyJ7ITd9sgaYTUbcY3rPTcz7n68Jfmhp6OsUmmZN3Ig
K6pB06QJ2EYA9eyjyrIYzeoIc4I1jpnc7guJDiQde+kaG64M3qpocyBObsd92RtO
MYWdVNngIMyIcQT83k5gGLoyZTaGMRh1/j78Pu9xAoGBAMA2sD/a4bipkeyrEsJH
lkZBiZIpvMCLVDSgV33yQN1p8FR4u8E2mg0jY4DDk6KkqbvjYyWrNHUzeOliS0p/
8A9yvNjTYz+PvnDPKH7VrJyI2sPyrY8+XmPye7nlaRRaXv97eLfi4GvMmS/5v4/k
8WdIerO+0dQdCpGBrypLXRrZ
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCkONeEs8ljY6uv
lwNF4e0YVd8RE2v+Uh5GRs1pFzLztAbHML74PiKZD2KdEWK7b2DfwFkkZUbCl8KH
yuSN99FgIhil/8+GmIxE9IJqPcqOih/OPi3Y1SRQDWG4tFpTM85vZ27Xn+Zw0TEO
NlRWzO9UfWToEALdKUom1vpFipJ8aUeOrhJ4pvdKbspb+ZgkBW4M4uyQKgrcxhMP
tEEVs+uDhY5RhkYMDV+snF5qB4EL/6Nto341GeqJxwTLB39I8QcI7RF/t9YKtrPH
lVXeDljl8EXtgj/ydzzqs8HrsuOTxPaUiPcqgdTOgPaKU/CJjVWI5lEygc9XCGfI
EN6Ze49ZAgMBAAECggEAcVyrqXdSNcG/6l4cbEkhGgNtEKSPj+ev7mNBuKHDEmfb
pfUIXuTFjVMJh9NQjIK+JLbq0iz3Q6zvJD3yt+2yIuJmkXCdGRSE/7Spsh0ljm/a
tMxHab74aipSouYc1AKXJmAIK+C9enNtoZnvblvZekF1PpyO3Yx7G4SbDxYxOJ94
/5/sNAf7YAM2NXUpQDPt2gJ+pQKsTa4kuRWUoCnLFt0gG//V9CZsOweIQ5+53O/N
TuSmEMgAPX1DPm2DkO8cwJ3gTbs5/VKQdX35+HEnlMjpg1pbjKmSfEMlKn4OdUGy
x9srNIEEnQLQ9epquR9+HQ7EBQIsnAPtDNeERVfjgQKBgQDUJX7RLQO/6ZQm8n3X
v0W6sprlREfmAFidSNHpw5hqezajC0b5+JjQQI+maft3Hm45eLLHC7wJe1zunKcM
pPkjL+ZcgWQ9jTCG54915z7MVm9yosHFHH03iys5afQuIMFkBiDPUg1lB3yAmPDq
sNMgVpae/mG4Fl6M2znLg/0iZQKBgQDGK0AedfDnBlKc70gPlcq2To33aNk36uZo
M0q+9K4GB/HlSt11VuHiZKZBPW7JQatuZo5cl22gj6xnDqNvhpK5tAaoEjmoYHsB
mNKWXVQwZzXeUExS9XSSIPvq5CSa/jeh5NaYqM6nG6zI6weqPvqhgEiJk0rcjE5b
8Hsrunpv5QKBgQCeuos/YOncTp0N4wOrSC6Y+QeSINuWyI2E6TY+LJ2+lgAUT9zE
LW/Q6W1RuxxuTPN1xswkx6/ifE3VLpqCiHDsFevLLPjeYOR9G4aoVeQTqVxrrkFD
BQTfaR5nL9KGLPXlq/wigqcI/2f1I/ml77WYDZFW1sgwn3QQ+fotPs1ITQKBgBfh
unZxTDjrQCV9iLeoG6fgy6cXUaY1ftLr64QbxKUha/twDERJ1isMaiTOnH1QlrJV
Va6+6Q1Cg0pgLz4Pf7s1gN/cYmpyRiCpJCfO04iJx6olDy2oOwYpR3LFT8wF+vpd
s6buIQlugmIsQN45fMbdyOAbihgOKJtX3eAlNwApAoGAHM59rRkdbQ9NhzR1HwkH
wyomxFcCwO/vaYacTcSqwsfMGu3z74o4PtQVDpSEVSeMCJyBLTxloBp5pJPQOM/4
afH8JdNtxq+PdH/GVboC94RJu0PbTAAZNw3aB9g2YcDz2+fcgctV3Pk+roGsTL0c
P1WOrGLIIosCk7Qfo3B7AQU=
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9Hog6AYPLYHYP
csX/RLgjYL4SJm50Wk/KTaEdk0de0MpMXiZhmtMHoaOoWTecpRv/ZzSn50dLcq0n
6EhREhGY5LkiZxlOJ4q0bFKVxR4/A7EozthIU9fMdrfTilIspAgr4qUxGJe6vOsv
8Iy6u76h3Jkn14oVRzn9EeQf7gti8tVLCCetSnz8kjzkiMEiXjGdjKjXuB7zuss/
SGRiw/WBwItDFJl41C4iU50fyvlJpiu9iz6t5XFohzWHAUJjAyfEkbjEugr331O3
PgtoFyTAMpplsosWtZJAbClk31JVDPHMtTw4+aEpqB71Yt2xP9I8ufIKZhijEBkg
F3Y3rLBXAgMBAAECggEBAKg1pu8I9+OF2Zxl9mvVAH8fBg/4tNeymDOVFo/KtnlD
9hs0xqib38Vy5LDRIeCnDp79ed05nbUiu5a6SNAq5RH7phtOXjigfQN7MX1bBUsB
CqsER2UVheSrV1fFOM/R2h7GiS2A9Tu32uwZ5eIVKTqojmTclknUv2QzbJdl0CTh
1qAizfNGrGPqfC51HR05LvDFXjVZSbJq2RbIUMDTEIwcts11dA6mAl5oRviF2NkV
KJFcwdvYWqvNxEouadIKbfOIeF/Nl0aRj9SZ4pIR0QcTucSOuNCzhZesSKhnedwd
FCgg9ULz1PpNiT7TOrH/Hou+G3GRt2ER7TPGMMBtfQkCgYEA3A4uHudhzXemhmGP
YI9hnuvV2+/PLt4jbjIOpEMl9staLlP96+T/xCQxKlwXHGsPaeNs7fFs6EkGgyGu
RrDTNoEn7BxxugBzedQp47lHAos3cADblBtcAgBVENFVgq4j2DD//E+Pt+LysCKE
ghwW9f/zPDikeARxb7gPxthJlTMCgYEA3AK6sb3CbRP++qnGJjXqR9dc/lGeC4Md
bJCiTp9N0CDa3RNvBBg7cLJ1E9wEI1pmvUGGfKayEL6H4IFOK3jUbm/5f4lwdyOS
hfAWn1dGWJ3umxkuRFPfgIXJuHWsfMAlVzFlbX+lhnhGt/nDqY/Nb0dKpqkSBe8c
Twr4qJWp8E0CgYAPsM8nEvaNUQfFszUm/HJIg6ZnHU1XmS1LkTQsEEGnvE482W5U
oKqAENiUnaZkN1oNAdNlj/5k/bgCJ6emkLsuurzfABQ34Apb2H34J+DhVI3qZZVC
lUTVO7LVFSgUvlf99Vh7ZCzqPrtxRbTPFjOo7MwqMhvAFwkDn0s4sXllswKBgGCF
kgKIjdPtAeBWu2foH3CFO3cXt461ZyNKEOsNWMYGo/55mCrjtrAqmtKro+UetBQz
uxzUxSozbMlB8VmBGTGaTot1cLHUGWRJgKNHVsVqBFRnJ7UyVsu75lPWzGWuprMq
KKVxat0jx2LPYNfzDt3TGR0k75NK49CJr63Ge1fBAoGAbFJXjNUsQHPzbqqwOgAl
iLKZW6E/BTrXfOxG83kqisJO2Y2LAD5woqsFUBrhavoIxY/wzUTrRc0FpZc7gP2E
jgzdE6A4lOQPQbTVRt5KccETdbPE2Szp2OzxqqKROJGKBccP6DHMa7/et3A7tVNV
AfzFXO9/4x4hwae2TTnSBnQ=
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCwepP+uWCVaJpf
vqIJtNynT4cZQGUGDD5Bz9LUF0vPaKNo9aFL+xxQVbL/Yrv12uQkNqYdasyu0ra+
vAL8X2cQm7D7dJX38l+K3z1nXG8U9Yji4/0JBUyalTykRaqrTL103mjSjzxx3RCH
g6W6mA/Lyqs1/Uq0SbpJcdvOlg8OOqzMx95BKJ6qp/2vHr3UUPdlNfVzDn6g4wr/
f9sAUbd/O5pJqUFF1e820Jz/MsOIZG1RH7LoigN2813xrrLl4bOm/W2kTSMamAsG
FXRHoWjcjQ3LYes/kGaARP7KDGLXILejRwuEJEhcXu5RD8tVDDbP9zwgChWu/K+p
G2nfCjHVAgMBAAECggEAaz5yRS8+BE2G0nw0WBWyqXHotW2udphmFPRIOF7X0PjT
pOrv1A6LTD5oAk5rzqHwVhlnpSTLscmXCB2U6uzG4w7Z5FUa9Ywyh1/WHsPLNT9o
qgjGMf8oaCAcs+8qIeMGlsi5hotIviEK9G8J/XR+1OcaWDrOdPUA4bTxUH9cMtZu
jTytCoJvjAwKtDNDjNyArCnB8mS0dg0xLXugc9aZaDzwkLn80bDWItAz6CRHCNjG
Slr9wrA7WCF8lbIEswc5LW7I4xet+dZ9lyVltQE4EIEIEDWeaHBlHUKV85/AEHX+
Ls0Tt+AZS+7+cf24OkBeJpJ0QHiV4cSj5+tehXcaAQKBgQDgIwHzFErxBQJTZsqx
a5UB6BKaw7H+d2k/iuvMu+BNRf4/n29vkE+TuAX8xBwrQz4ZGsmAYYbCKHofN337
/eepEN10eONCwXwJGilG/wAYeRAAwfSl9dUBwqI12TuZnFrpGx1HZOVJ9XaBSfYh
Zh/NlsgZevkkG5A0CR2qVUfAQQKBgQDJkSizp9/wylp6mS3uqOKK5WWZoGsmoOWL
kekPPCg0jr3/i1el2MPfxan+MUp1/S75Qx6/wHP5wtB7EL7O9zluviH9WTp7iPgQ
5qvGrZGiwiByMS3s8RXTMC8gEF2tFivnhMlrpDdPrUrPUVrhaCNeFYff3XxGhons
0VmJYjRMlQKBgQDCRRWXf2tFZLYTW/Ervre0o1Yc1qociZur+9lN5zoPQC+TLboE
1OxkeQiXgdN4nBvi3pjwsZeACl1vWUXVeMmmfHu2TGGOpu2/ZfGJG9UVYTlBrttC
TcWGdRDr45IJHsCdc2b5TrZ+WEeS4Gx5nm7KX3qouzHe3hUrRQt1a915AQKBgBQe
Hc7YiXxR5ffog/IW/w1X2e0cWrVvR5nHhVhU67pbKNFxidzuppYV92J8bu8Zxu9v
6IjA35JlBEPUJwcnG59W8LOFjVW5FPEy5KAewLNa5rwe9nN4mHIMlBeCKqdU2Cry
UNwidrbIF/hbKVPn/eetBHOuenHbibaOKn6Qw6GFAoGAa5BEt6wx67UIkd4VHfvf
Ne5UIt2qhsgAssImEhCR5Rj6zLGlUirskWfYyxPV6w/Aoy7euvgWrxsodW6I5z67
6vS1wDg7w2naiyR0H3ucZxG4cQJ9YFtlydLRUJWQ4OIKSSZNQc2Hpd8c6D11zE5J
gjPwDoRqQ5kQAdTdFIFhpBY=
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC6IVgX5N4HlLsu
VtUf1t7cZeWJrxMJkKxQ5GlHputpSrq/aSZUcWys4YC+3mnPJB8sRr+gyJ1mR76y
OxxrCi+C/kvtstDdXbnD4aQLMcSeRSFPWH03WGMLQnitZDssMz8RyeOsLziQBUKU
FKkG/zVIwcJoxO3d4fxRRpGAv7GFnLmOnJodw+H2ugls/atv6H9scabo5m88Jvrv
LY3nUysCqOr5532xDw+FKKxoGLuZQZVVJpXefbPeguulN5fiPNPWMO+lbaXlhbyf
Wsg/DFIME5OPPZdv2Hv9Avt7h6WAALbdLhm82iDeNKbIIWKeZHsXHJumpyKCYELt
vQKYhLstAgMBAAECggEAZ6ya/PQmF+LoP+9t1sZAbFL1f7Nczz8ePBB988Mt7QAK
9QMErpRfDAyvQaFxHkfodSkTI+OaiJX9yhjSw2xw+m3arROk8yh5iHnufa3C7sVi
wGdxl5pL0MG9phbmPsBsqOPjRM0onE/RvdmkLJmKfHQwbVsDg0uU11CPSz97CghG
xTLKQKohJ2P2Dmf5bRgr36AwgIssUlwTBtKxW9hoehevWOi9q2E8UgcoZmmoH1HK
Prc3EUzI7tbJbDalnIoiNM4zI2MuptTJ9rSZ2VY5Ua+ij9SS7617qlEOKdGFo3A7
OvqQGgARDTp9SJc71PitQW8mD4ps0yvycxbhJhErAQKBgQDbho6c52RnWj3oMNqd
a3wL0z4jetiXtFrAqjDv1k4eRGCD+YDpBy18KHvcQ2G67WApwuDS28hmKbdPbIYw
e6Ag5jn5+uhoWbVRQPaTSb8U7qFJK8aIMxFlJfQYZ1+voA7qbw8TZUrCAd9Z+bM9
4Kq2JXCKddI89GyWoqSX0uPFyQKBgQDZDlPJH8nk+QUKRaHZhmdzmZDBpLqpmVr5
HPHmgZtgbp1jkzkI4YsfUTSfWbfavRdEvocjR8z2qhThJsulw/hTHsCKKShf+sM6
wjWjGo3Lj/Jmqx1/wEf90cBWvm6nk2DWK23/L1UrfSgs3KYajpEw30ug/jkRG40w
T74d7oMMRQKBgQC3wThbKm2m/ajYVRyJrNEW7OoUtN3cjsFwiIWSHOci+sV3c0Bu
zu1KAnE7fMOvvsdB7bhXiFWE/uJMf2EL8E+nek+Jandj8cOOkjxUKeTi1qT3JMd4
dpbW/iAG1XEJB4e0wOXzrFQZdYvKOvPIlekPsuMzY1BqaYcDyHzSAVtb0QKBgDtx
bQi7p/MJL5QslbKY2GQUPkyJ7ITd9sgaYTUbcY3rPTcz7n68Jfmhp6OsUmmZN3Ig
K6pB06QJ2EYA9eyjyrIYzeoIc4I1jpnc7guJDiQde+kaG64M3qpocyBObsd92RtO
MYWdVNngIMyIcQT83k5gGLoyZTaGMRh1/j78Pu9xAoGBAMA2sD/a4bipkeyrEsJH
lkZBiZIpvMCLVDSgV33yQN1p8FR4u8E2mg0jY4DDk6KkqbvjYyWrNHUzeOliS0p/
8A9yvNjTYz+PvnDPKH7VrJyI2sPyrY8+XmPye7nlaRRaXv97eLfi4GvMmS/5v4/k
8WdIerO+0dQdCpGBrypLXRrZ
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCkONeEs8ljY6uv
lwNF4e0YVd8RE2v+Uh5GRs1pFzLztAbHML74PiKZD2KdEWK7b2DfwFkkZUbCl8KH
yuSN99FgIhil/8+GmIxE9IJqPcqOih/OPi3Y1SRQDWG4tFpTM85vZ27Xn+Zw0TEO
NlRWzO9UfWToEALdKUom1vpFipJ8aUeOrhJ4pvdKbspb+ZgkBW4M4uyQKgrcxhMP
tEEVs+uDhY5RhkYMDV+snF5qB4EL/6Nto341GeqJxwTLB39I8QcI7RF/t9YKtrPH
lVXeDljl8EXtgj/ydzzqs8HrsuOTxPaUiPcqgdTOgPaKU/CJjVWI5lEygc9XCGfI
EN6Ze49ZAgMBAAECggEAcVyrqXdSNcG/6l4cbEkhGgNtEKSPj+ev7mNBuKHDEmfb
pfUIXuTFjVMJh9NQjIK+JLbq0iz3Q6zvJD3yt+2yIuJmkXCdGRSE/7Spsh0ljm/a
tMxHab74aipSouYc1AKXJmAIK+C9enNtoZnvblvZekF1PpyO3Yx7G4SbDxYxOJ94
/5/sNAf7YAM2NXUpQDPt2gJ+pQKsTa4kuRWUoCnLFt0gG//V9CZsOweIQ5+53O/N
TuSmEMgAPX1DPm2DkO8cwJ3gTbs5/VKQdX35+HEnlMjpg1pbjKmSfEMlKn4OdUGy
x9srNIEEnQLQ9epquR9+HQ7EBQIsnAPtDNeERVfjgQKBgQDUJX7RLQO/6ZQm8n3X
v0W6sprlREfmAFidSNHpw5hqezajC0b5+JjQQI+maft3Hm45eLLHC7wJe1zunKcM
pPkjL+ZcgWQ9jTCG54915z7MVm9yosHFHH03iys5afQuIMFkBiDPUg1lB3yAmPDq
sNMgVpae/mG4Fl6M2znLg/0iZQKBgQDGK0AedfDnBlKc70gPlcq2To33aNk36uZo
M0q+9K4GB/HlSt11VuHiZKZBPW7JQatuZo5cl22gj6xnDqNvhpK5tAaoEjmoYHsB
mNKWXVQwZzXeUExS9XSSIPvq5CSa/jeh5NaYqM6nG6zI6weqPvqhgEiJk0rcjE5b
8Hsrunpv5QKBgQCeuos/YOncTp0N4wOrSC6Y+QeSINuWyI2E6TY+LJ2+lgAUT9zE
LW/Q6W1RuxxuTPN1xswkx6/ifE3VLpqCiHDsFevLLPjeYOR9G4aoVeQTqVxrrkFD
BQTfaR5nL9KGLPXlq/wigqcI/2f1I/ml77WYDZFW1sgwn3QQ+fotPs1ITQKBgBfh
unZxTDjrQCV9iLeoG6fgy6cXUaY1ftLr64QbxKUha/twDERJ1isMaiTOnH1QlrJV
Va6+6Q1Cg0pgLz4Pf7s1gN/cYmpyRiCpJCfO04iJx6olDy2oOwYpR3LFT8wF+vpd
s6buIQlugmIsQN45fMbdyOAbihgOKJtX3eAlNwApAoGAHM59rRkdbQ9NhzR1HwkH
wyomxFcCwO/vaYacTcSqwsfMGu3z74o4PtQVDpSEVSeMCJyBLTxloBp5pJPQOM/4
afH8JdNtxq+PdH/GVboC94RJu0PbTAAZNw3aB9g2YcDz2+fcgctV3Pk+roGsTL0c
P1WOrGLIIosCk7Qfo3B7AQU=
-----END PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9Hog6AYPLYHYP
csX/RLgjYL4SJm50Wk/KTaEdk0de0MpMXiZhmtMHoaOoWTecpRv/ZzSn50dLcq0n
6EhREhGY5LkiZxlOJ4q0bFKVxR4/A7EozthIU9fMdrfTilIspAgr4qUxGJe6vOsv
8Iy6u76h3Jkn14oVRzn9EeQf7gti8tVLCCetSnz8kjzkiMEiXjGdjKjXuB7zuss/
SGRiw/WBwItDFJl41C4iU50fyvlJpiu9iz6t5XFohzWHAUJjAyfEkbjEugr331O3
PgtoFyTAMpplsosWtZJAbClk31JVDPHMtTw4+aEpqB71Yt2xP9I8ufIKZhijEBkg
F3Y3rLBXAgMBAAECggEBAKg1pu8I9+OF2Zxl9mvVAH8fBg/4tNeymDOVFo/KtnlD
9hs0xqib38Vy5LDRIeCnDp79ed05nbUiu5a6SNAq5RH7phtOXjigfQN7MX1bBUsB
CqsER2UVheSrV1fFOM/R2h7GiS2A9Tu32uwZ5eIVKTqojmTclknUv2QzbJdl0CTh
1qAizfNGrGPqfC51HR05LvDFXjVZSbJq2RbIUMDTEIwcts11dA6mAl5oRviF2NkV
KJFcwdvYWqvNxEouadIKbfOIeF/Nl0aRj9SZ4pIR0QcTucSOuNCzhZesSKhnedwd
FCgg9ULz1PpNiT7TOrH/Hou+G3GRt2ER7TPGMMBtfQkCgYEA3A4uHudhzXemhmGP
YI9hnuvV2+/PLt4jbjIOpEMl9staLlP96+T/xCQxKlwXHGsPaeNs7fFs6EkGgyGu
RrDTNoEn7BxxugBzedQp47lHAos3cADblBtcAgBVENFVgq4j2DD//E+Pt+LysCKE
ghwW9f/zPDikeARxb7gPxthJlTMCgYEA3AK6sb3CbRP++qnGJjXqR9dc/lGeC4Md
bJCiTp9N0CDa3RNvBBg7cLJ1E9wEI1pmvUGGfKayEL6H4IFOK3jUbm/5f4lwdyOS
hfAWn1dGWJ3umxkuRFPfgIXJuHWsfMAlVzFlbX+lhnhGt/nDqY/Nb0dKpqkSBe8c
Twr4qJWp8E0CgYAPsM8nEvaNUQfFszUm/HJIg6ZnHU1XmS1LkTQsEEGnvE482W5U
oKqAENiUnaZkN1oNAdNlj/5k/bgCJ6emkLsuurzfABQ34Apb2H34J+DhVI3qZZVC
lUTVO7LVFSgUvlf99Vh7ZCzqPrtxRbTPFjOo7MwqMhvAFwkDn0s4sXllswKBgGCF
kgKIjdPtAeBWu2foH3CFO3cXt461ZyNKEOsNWMYGo/55mCrjtrAqmtKro+UetBQz
uxzUxSozbMlB8VmBGTGaTot1cLHUGWRJgKNHVsVqBFRnJ7UyVsu75lPWzGWuprMq
KKVxat0jx2LPYNfzDt3TGR0k75NK49CJr63Ge1fBAoGAbFJXjNUsQHPzbqqwOgAl
iLKZW6E/BTrXfOxG83kqisJO2Y2LAD5woqsFUBrhavoIxY/wzUTrRc0FpZc7gP2E
jgzdE6A4lOQPQbTVRt5KccETdbPE2Szp2OzxqqKROJGKBccP6DHMa7/et3A7tVNV
AfzFXO9/4x4hwae2TTnSBnQ=
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCwepP+uWCVaJpf
vqIJtNynT4cZQGUGDD5Bz9LUF0vPaKNo9aFL+xxQVbL/Yrv12uQkNqYdasyu0ra+
vAL8X2cQm7D7dJX38l+K3z1nXG8U9Yji4/0JBUyalTykRaqrTL103mjSjzxx3RCH
g6W6mA/Lyqs1/Uq0SbpJcdvOlg8OOqzMx95BKJ6qp/2vHr3UUPdlNfVzDn6g4wr/
f9sAUbd/O5pJqUFF1e820Jz/MsOIZG1RH7LoigN2813xrrLl4bOm/W2kTSMamAsG
FXRHoWjcjQ3LYes/kGaARP7KDGLXILejRwuEJEhcXu5RD8tVDDbP9zwgChWu/K+p
G2nfCjHVAgMBAAECggEAaz5yRS8+BE2G0nw0WBWyqXHotW2udphmFPRIOF7X0PjT
pOrv1A6LTD5oAk5rzqHwVhlnpSTLscmXCB2U6uzG4w7Z5FUa9Ywyh1/WHsPLNT9o
qgjGMf8oaCAcs+8qIeMGlsi5hotIviEK9G8J/XR+1OcaWDrOdPUA4bTxUH9cMtZu
jTytCoJvjAwKtDNDjNyArCnB8mS0dg0xLXugc9aZaDzwkLn80bDWItAz6CRHCNjG
Slr9wrA7WCF8lbIEswc5LW7I4xet+dZ9lyVltQE4EIEIEDWeaHBlHUKV85/AEHX+
Ls0Tt+AZS+7+cf24OkBeJpJ0QHiV4cSj5+tehXcaAQKBgQDgIwHzFErxBQJTZsqx
a5UB6BKaw7H+d2k/iuvMu+BNRf4/n29vkE+TuAX8xBwrQz4ZGsmAYYbCKHofN337
/eepEN10eONCwXwJGilG/wAYeRAAwfSl9dUBwqI12TuZnFrpGx1HZOVJ9XaBSfYh
Zh/NlsgZevkkG5A0CR2qVUfAQQKBgQDJkSizp9/wylp6mS3uqOKK5WWZoGsmoOWL
kekPPCg0jr3/i1el2MPfxan+MUp1/S75Qx6/wHP5wtB7EL7O9zluviH9WTp7iPgQ
5qvGrZGiwiByMS3s8RXTMC8gEF2tFivnhMlrpDdPrUrPUVrhaCNeFYff3XxGhons
0VmJYjRMlQKBgQDCRRWXf2tFZLYTW/Ervre0o1Yc1qociZur+9lN5zoPQC+TLboE
1OxkeQiXgdN4nBvi3pjwsZeACl1vWUXVeMmmfHu2TGGOpu2/ZfGJG9UVYTlBrttC
TcWGdRDr45IJHsCdc2b5TrZ+WEeS4Gx5nm7KX3qouzHe3hUrRQt1a915AQKBgBQe
Hc7YiXxR5ffog/IW/w1X2e0cWrVvR5nHhVhU67pbKNFxidzuppYV92J8bu8Zxu9v
6IjA35JlBEPUJwcnG59W8LOFjVW5FPEy5KAewLNa5rwe9nN4mHIMlBeCKqdU2Cry
UNwidrbIF/hbKVPn/eetBHOuenHbibaOKn6Qw6GFAoGAa5BEt6wx67UIkd4VHfvf
Ne5UIt2qhsgAssImEhCR5Rj6zLGlUirskWfYyxPV6w/Aoy7euvgWrxsodW6I5z67
6vS1wDg7w2naiyR0H3ucZxG4cQJ9YFtlydLRUJWQ4OIKSSZNQc2Hpd8c6D11zE5J
gjPwDoRqQ5kQAdTdFIFhpBY=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIGWDCCBECgAwIBAgIUJmQAm+PgZZiED7jf6vg4jZE+SokwDQYJKoZIhvcNAQEL
BQAwgbMxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhNYXJ5bGFuZDESMBAGA1UEBwwJ
QmFsdGltb3JlMRkwFwYDVQQKDBBUZXN0IENBLCBMaW1pdGVkMSMwIQYDVQQLDBpT
ZXJ2ZXIgUmVzZWFyY2ggRGVwYXJ0bWVudDEcMBoGA1UEAwwTcGFuZ2FuZy5ib29u
YXJ5LmNvbTEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbTAgFw0yMzEy
MDQwMzM2MTZaGA8yMTIzMTExMDAzMzYxNlowgbMxCzAJBgNVBAYTAlVTMREwDwYD
VQQIDAhNYXJ5bGFuZDESMBAGA1UEBwwJQmFsdGltb3JlMRkwFwYDVQQKDBBUZXN0
IENBLCBMaW1pdGVkMSMwIQYDVQQLDBpTZXJ2ZXIgUmVzZWFyY2ggRGVwYXJ0bWVu
dDEcMBoGA1UEAwwTcGFuZ2FuZy5ib29uYXJ5LmNvbTEfMB0GCSqGSIb3DQEJARYQ
dGVzdEBleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
ANE+m0+t4yNhkU6iKlYLEblDXAjX5pzC2VNN1iMMXm+xaWyFcLGGz3bzElXWYkoJ
EZof5txiliSZHyR6NilcVQ2Mc8eKNT7f0MZWKtQpuSwjnMYhVLYwR/ANh//1WFXx
sfZqS7MTrX0QeiLr2S+aFfsajKHnGXbrAs21yFsroOWXtCNHnHVuHPrR7KFfrECA
UTHmP9LfLpE3MoqvN8OTCYwuhM+spzFJRbBlWd7QSrTddcVUvIu4+x+XSNJa5XWc
OFh04o9/fhHDhnx2EPxyOWkN3jO+lEYJCl7n8wqCggz5ISHkx5YMS6EHBk9ZGMqi
bkYIGvx2zV9uLPOwv/2nHqd0BxXQYHJdUZC+FH78Oe2ZPdKgQk+61A1fF6OUd/LP
Z/x9cKDD5Eo9yZywCvJAvRvpPJALBb2cleUvONre11iHndXe6T4ldQZ9cVeSLTpK
PNM8FSZwVJ92aRlwpEF10FVbk9qgyDMgDRfmpO9WBqpdSJvkKeY4fQ17vIm2qUoB
xYag7F75ibLB/PBMBTJfHQRcQWy6nXqxgitWR1iOIOiHZ1+p3Tqz4W+UE3gf1zXo
yCx/GVKU8KPP6AGU7JA9EXp2g3B5dkqYYCThRGSTW/IInCWc2gCPTcil5w5TyQjb
NPCwjnMWQUbLrz+7o9iI3p4oiS5oAkCzLxXgKCH5WmcJAgMBAAGjYDBeMB0GA1Ud
DgQWBBRCglFUfXvTy8kxwfEC/8FFNELlhjAfBgNVHSMEGDAWgBRCglFUfXvTy8kx
wfEC/8FFNELlhjAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG
9w0BAQsFAAOCAgEArDMa+cl6UA+HwGDBzXoCdBHcsYiS79bybVbAyWF7LhimRXOc
usdKna8VOB75FvfednMR1W9/Ecv82gDigkC7L7X/C7Xyl/T39bQFMo2Fanmbvqis
SutIfiJpbDprVGOgXA9QBjZipKcWToxeDesMh/reLfmk6ap5Y9psmFw9JzIGNNYB
rKDMTacLk50EZMyAn+zZ+wP9Kd9ZRNfPErbMJYsOqu9Me62QhN4Ny7B55aSNgZQ8
Bg6DJXMqYi0FxOFLTO16LiErLxK6xL1hTyFHyhuEOhN1id1y9QR+DLWAX1RBADUV
fxGDLUnGPIEWNU4F0Oj8PomsFQEK4pUCSAbKGaS+fOgdrXEgjqyFf17gACblRV9J
4A6P34B2AzY+yz2uWenha02TgAjKZbaoC5k7PziMnsvg2Djzab0XFDn6IjNtIURT
xKatMaCtylIo+kUzk/EKtQ+3rz2639b3Hs/jAWM2NVVP9FDNBFU81Rb0GTTKpwJv
BnfiE2TnuOBZU+SbjWTYdSPCib6cwbCIcCrnyJy2PyJNB9qDzur5+a9nfbKJbmIX
WWcdE0dhdWHDWQjWli9s4N9ZhXuacxy7YGY1XwRK15RXm8aL1cikHdOA97bRMkoP
BzNhlMPAhZ1R2geZYdk+BexiWtsEcX1RPqD2Z+3u8jwuUzGFg3blkBsb/Gs=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQDRPptPreMjYZFO
oipWCxG5Q1wI1+acwtlTTdYjDF5vsWlshXCxhs928xJV1mJKCRGaH+bcYpYkmR8k
ejYpXFUNjHPHijU+39DGVirUKbksI5zGIVS2MEfwDYf/9VhV8bH2akuzE619EHoi
69kvmhX7Goyh5xl26wLNtchbK6Dll7QjR5x1bhz60eyhX6xAgFEx5j/S3y6RNzKK
rzfDkwmMLoTPrKcxSUWwZVne0Eq03XXFVLyLuPsfl0jSWuV1nDhYdOKPf34Rw4Z8
dhD8cjlpDd4zvpRGCQpe5/MKgoIM+SEh5MeWDEuhBwZPWRjKom5GCBr8ds1fbizz
sL/9px6ndAcV0GByXVGQvhR+/DntmT3SoEJPutQNXxejlHfyz2f8fXCgw+RKPcmc
sAryQL0b6TyQCwW9nJXlLzja3tdYh53V3uk+JXUGfXFXki06SjzTPBUmcFSfdmkZ
cKRBddBVW5PaoMgzIA0X5qTvVgaqXUib5CnmOH0Ne7yJtqlKAcWGoOxe+Ymywfzw
TAUyXx0EXEFsup16sYIrVkdYjiDoh2dfqd06s+FvlBN4H9c16MgsfxlSlPCjz+gB
lOyQPRF6doNweXZKmGAk4URkk1vyCJwlnNoAj03IpecOU8kI2zTwsI5zFkFGy68/
u6PYiN6eKIkuaAJAsy8V4Cgh+VpnCQIDAQABAoICAHeVz0+PcqPS7CfDmGyKcPuv
mpbXRU5MMcZhUsO/Gu28uCK0dL6Q7Frv+oeiOZRUcIHkP52unl6WQG0ph3DF+zn+
DmF5BItFgN0Je/q7ScAHLl8xx2dEWqjAIvzO7EhaFLpe75qN4XX7h8IThpGk/3D+
MGeLW0tSbszAWpx4Z8EvnV0YXTvjzZ4vgYyM0DYg38aj79AFi2ik4jbOgxE8JJXA
NFk4NGl/lduFYQJtinSpqNg5YHR+KM9aN90447D+slkjnCQk2hku5NqW44hTg6od
qeNqxPTtz8aDy6wzAD6H1z62sLZ5mnOSPzH0Gq4cfOd7VGj7QM6MehZf6qn97A8B
ESw1+unO3YXO2j31hH6IxLZEOabt4xCi05PlJ5X6Kew9Yq4nd1wuW1Vqe0QlU0o9
c+5FOjelaxpftlpRdMLoMvfg9rGkmcc2DLbk5FKMeQwoNG4zEhAgFJurCPLaNfY3
Hrnsft41ykceRJLXHYqKGIMiNLnqhmSDRMcH5GE4zE5U9tAUGyWPcdxmCXXrfItR
0dvGX1KeFfVch15bTbYOvb5/c2sI+llHf11jpXdQmnGLlacWiKDI6lpDHR/r555g
afxL95dECRzj7yShZi0D+2qKTNU2BmZIiEN4ZEWuAKxuHvazGMUOTt6Fd/HR+8+7
06viseETk4NMGLlf5j89AoIBAQDv8GhhQiN0XzBKuSoetdMYbLdTatiG4HaGUy9y
LkfKY88/noFnUOWW3MDm2vbDhUtYEZkBmT3KAmzQpH+ZKtavL0heuDttsJSqGdGe
iv/vul6ZN9VrkyagWN0KLJtWGCE1c2qkcakJOvwO+FweQhstu3JwU/tcki/Du8dl
hd9W1H8IJUMqLipRTBRGd2iOdzIFnqA208CEW/VZ8YC7q4NZs1nERof/XhdPK38W
2WTjC6dbWSN6JfAlnhZOAnL350dqSMUsOL3xyUiL3FSDpyBEa9Zi7/c9HEPKjDIW
upH4kOPyVanIgZo1jmlwlz1tmKJHoO6OFdaLuNoPuNc0KuNDAoIBAQDfQDfIz7/t
DyIe8h+oUTCzd+XPl996lUV1N1DFrAjZspYNVbQmHKyFywjJtYSLcft/ph4XFVlI
ga/x7W9m88kbJdmGhEFSvsCh/OEt64Pl7FSLdTm6j7u8Ij2eixMLFFr2rfB+TfMy
teNh+tOlO4JG9CJtnCl1OLAJbL24JpLXhZIsAbXjlJQ9buyvkLpF3ND5zbRBmvTR
FiOYuA3XHpcFqnkcYmay3P060f/c8tVHsc1PD9p82oW5bVKMdqcU2HBUN+crLRwm
v1EX5jeFrW9WGnYv2clTwSNRITALDerIRPzKuFjCpiwXIw2Av2PxW46Ca1LbRYW8
j3uGUTjmT1nDAoIBAGwCrxpJKaizSQv6OsnEVBjEp+o3SO2+kdx6Cfu+dbbYI22i
LuKReijlizjhDQCLOpWUpmofz77mRJHP21jZ/faytENfb/E68lF4efKC5B/Ip9kV
V0+r2FGKb0arOeoRxrFHGZSZTdzH3rvmdaFxZMa7gRKr25WagUH9gA9lqlpuIhlK
nOeaDJa4RtBJ5JltcukwtTK5NArhUpuAqdDRrrlskVZX4dTFSHztObLRfibvEhF/
GQddmLN2bNgFJjgOtwlTZN85U9hKIgxDzQ/O5imm2cWD/KpX1PSTE+FDb36TyulG
Qr3uCbteNnzmuFJjyXmxKnJvxjrzpcY6ETZ8r/0CggEAbp9JhQ28UmD/TUo4eZTR
hvxQOY9Nw1YX9r8UHP7j28tsIutmusPWkO1MS3bQWLCAKH5Nxq5jcVQhtMUsQF1o
NzWIFemO3Mt8dEfz5GchElsKgZfypQj3w39L/TV4mDLb6APEeTFy4pvSMgixutxD
75ilPp70xAr035asY4VpmbWr+nZWhJBo7A/84/nY8yk5u648NY3s5XYM6W26HfAg
cURJgtEXhmWObQkFuZvyJvZpf1Whs+AsBveuwb9Bh0jAUFrrBy/xFRoTur3uoSSR
WJ8AFTHbWs8HCvpg7flVbysP//tcsAbbLhPGaxdrFHuDoAhCJDjMzeRjFulEQorr
NQKCAQBUqgLKCDgsJLVT2oZoyUE9GhZoEFibHBYFWJvBdEcR9pM9imbXtpFZwVe3
w13uL+Z76AYHqaM0fa2/E02Ogy4Va/EfSNfwniSwIqUp/sx7j6kd5oGFIyH0Agty
N/6S9JUhJOdHl7PouZ+MwQiDBTjoF5z6GhpEkJRXJRiz89g3rrCV16MjA8rRzu8j
Ht4KrYxzK66RfxUz6UMDMFdmXnf6EnXp30mz/vrBtG9bln3ffGBR37VJIgNdAKLg
OraBE2X0Pqb1YB1NrIfMuwxzMJCDjo32UuqwpDX+scKXnnJYyPxfa9REqCnBjkio
8hQ7ufsBnXpLoDC7FbkQ4frPEHKS
-----END PRIVATE KEY-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 2 (0x2)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Maryland, L=Baltimore, O=Test CA, Limited, OU=Server Research Department, CN=pangang.boonary.com/emailAddress=test@example.com
Validity
Not Before: Dec 4 03:36:16 2023 GMT
Not After : Nov 10 03:36:16 2123 GMT
Subject: C=US, ST=MD, L=Baltimore, O=Test Server, Limited, CN=pangang.boonary.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:d3:50:c1:ef:11:ab:44:ad:07:96:6d:46:95:17:
33:dd:18:04:95:47:e4:7a:c4:1b:80:a0:f1:1d:74:
81:c6:26:11:57:15:c5:28:c2:f6:60:bc:d3:9d:12:
e1:4a:df:62:4a:cf:d8:00:ff:55:35:30:1e:3d:62:
4f:ed:6a:5b:d3:be:35:49:52:fb:a8:ad:67:71:35:
9f:4d:ea:95:d7:e7:a3:fb:ef:9b:5e:54:32:aa:32:
45:a1:c4:a7:b6:5c:cf:a5:24:27:8b:84:9c:64:0f:
5a:2a:69:3c:26:d9:29:3e:de:52:9c:33:8e:fd:f2:
06:51:1d:e3:1e:03:f5:23:5c:a6:db:35:1d:d7:de:
ae:c3:92:be:76:f7:91:b1:93:c5:c1:54:52:1d:56:
9c:43:5c:1e:e5:93:c8:e2:13:a0:b0:b4:29:ab:58:
c0:75:25:10:6a:61:71:09:6b:2c:d7:0c:54:93:a4:
a7:1f:93:37:06:5b:75:f6:ab:95:4c:14:9f:b9:48:
07:d2:68:ec:7f:51:bc:ac:81:a4:33:14:d6:13:04:
c5:f5:5a:fd:41:30:b8:45:94:fb:76:33:5c:e3:1f:
35:cc:4d:4b:a9:d2:fc:ba:c6:94:2f:56:96:0d:d7:
84:31:20:88:95:a6:e5:73:f2:7b:8d:b7:6c:51:e6:
d6:37
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
70:E7:25:08:0D:CB:CA:FE:30:AA:F4:0E:DC:EA:DD:A0:20:6B:87:66
X509v3 Authority Key Identifier:
keyid:42:82:51:54:7D:7B:D3:CB:C9:31:C1:F1:02:FF:C1:45:34:42:E5:86
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:pangang.boonary.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
aa:d6:7a:4e:85:27:d2:42:24:d5:fd:ed:b5:53:98:2f:dc:40:
4e:0f:5a:e0:e2:49:74:6e:34:a8:41:66:cd:7d:d7:63:18:a4:
e1:e8:1d:6d:fe:06:54:5c:88:27:fe:9d:4b:86:c6:3f:f2:bf:
f2:9c:68:6b:d9:92:ba:89:ae:4d:b8:b5:84:02:bf:ff:41:22:
43:22:e7:2f:e9:f2:7f:13:4d:5d:4a:4c:ea:5f:9e:9f:97:47:
bf:40:31:c6:df:a6:71:e1:6b:af:38:2d:ee:e5:c7:3c:23:03:
cd:57:85:9e:f3:ef:86:92:3a:be:8c:69:7e:5c:36:17:af:6f:
15:95:99:d3:db:b8:8a:70:80:70:fe:67:69:43:a2:6f:b0:03:
ae:2f:89:6b:10:f1:2e:a4:c2:24:9b:14:c8:6c:db:62:b3:0f:
46:f7:ca:f8:39:cf:cd:8a:c5:63:7e:db:52:8b:13:46:b7:7c:
c7:9c:17:14:88:f6:74:e5:7b:22:0b:3c:c3:37:57:02:00:bf:
82:34:51:f5:22:27:42:be:48:03:73:d3:07:a0:a2:c5:ef:f3:
39:02:75:e9:07:4a:47:95:48:96:b7:bc:db:98:43:66:34:30:
69:06:11:d5:3b:a6:52:e4:2d:7b:d6:92:06:0e:e2:dc:a6:05:
dc:b1:43:5f:dd:4f:44:2f:cb:ae:71:2a:53:84:ab:ed:55:bb:
c5:f2:cf:c3:45:1a:a9:16:d2:f9:f3:ad:2b:db:16:80:63:6b:
3d:b4:af:00:83:b0:31:0c:92:eb:66:75:55:c6:b4:c3:59:de:
c4:23:ac:9e:84:bd:a8:f5:d3:bc:49:70:26:ed:b2:61:63:ce:
be:ab:8a:95:44:38:31:8a:e4:2c:2d:13:97:78:53:ae:6c:92:
0b:04:20:28:c8:46:25:b3:b0:8a:b8:c4:b1:e1:73:34:d7:8b:
f8:fd:10:bc:be:5b:7e:b8:44:b8:52:4e:a2:c0:09:bd:32:92:
d1:fc:13:83:91:ef:ff:7f:7a:80:4e:08:e7:cc:32:b0:83:e0:
1a:99:6f:11:c1:e7:ff:77:5e:f7:10:cd:6d:f2:60:e8:ac:c5:
db:a5:ac:49:31:54:41:86:eb:54:df:d6:6d:84:00:ae:ab:97:
87:85:99:8d:04:2c:56:2f:51:4e:14:46:5b:06:83:9a:3c:8e:
ae:52:51:bd:d9:69:16:8a:21:ea:7b:2d:b2:31:b4:b2:b0:3f:
f7:2a:7a:bf:ce:26:fd:48:85:b6:4e:7a:5d:2d:6c:64:9d:d4:
8b:31:c2:4c:e7:9e:9b:af:98:4c:a5:3d:a2:59:42:53:97:6e:
83:29:5e:89:4a:71:89:06
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBszELMAkGA1UEBhMCVVMx
ETAPBgNVBAgMCE1hcnlsYW5kMRIwEAYDVQQHDAlCYWx0aW1vcmUxGTAXBgNVBAoM
EFRlc3QgQ0EsIExpbWl0ZWQxIzAhBgNVBAsMGlNlcnZlciBSZXNlYXJjaCBEZXBh
cnRtZW50MRwwGgYDVQQDDBNwYW5nYW5nLmJvb25hcnkuY29tMR8wHQYJKoZIhvcN
AQkBFhB0ZXN0QGV4YW1wbGUuY29tMCAXDTIzMTIwNDAzMzYxNloYDzIxMjMxMTEw
MDMzNjE2WjBrMQswCQYDVQQGEwJVUzELMAkGA1UECAwCTUQxEjAQBgNVBAcMCUJh
bHRpbW9yZTEdMBsGA1UECgwUVGVzdCBTZXJ2ZXIsIExpbWl0ZWQxHDAaBgNVBAMM
E3BhbmdhbmcuYm9vbmFyeS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDTUMHvEatErQeWbUaVFzPdGASVR+R6xBuAoPEddIHGJhFXFcUowvZgvNOd
EuFK32JKz9gA/1U1MB49Yk/talvTvjVJUvuorWdxNZ9N6pXX56P775teVDKqMkWh
xKe2XM+lJCeLhJxkD1oqaTwm2Sk+3lKcM4798gZRHeMeA/UjXKbbNR3X3q7Dkr52
95Gxk8XBVFIdVpxDXB7lk8jiE6CwtCmrWMB1JRBqYXEJayzXDFSTpKcfkzcGW3X2
q5VMFJ+5SAfSaOx/UbysgaQzFNYTBMX1Wv1BMLhFlPt2M1zjHzXMTUup0vy6xpQv
VpYN14QxIIiVpuVz8nuNt2xR5tY3AgMBAAGjgakwgaYwHQYDVR0OBBYEFHDnJQgN
y8r+MKr0Dtzq3aAga4dmMB8GA1UdIwQYMBaAFEKCUVR9e9PLyTHB8QL/wUU0QuWG
MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMB4GA1UdEQQXMBWCE3BhbmdhbmcuYm9v
bmFyeS5jb20wLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRp
ZmljYXRlMA0GCSqGSIb3DQEBCwUAA4ICAQCq1npOhSfSQiTV/e21U5gv3EBOD1rg
4kl0bjSoQWbNfddjGKTh6B1t/gZUXIgn/p1LhsY/8r/ynGhr2ZK6ia5NuLWEAr//
QSJDIucv6fJ/E01dSkzqX56fl0e/QDHG36Zx4WuvOC3u5cc8IwPNV4We8++Gkjq+
jGl+XDYXr28VlZnT27iKcIBw/mdpQ6JvsAOuL4lrEPEupMIkmxTIbNtisw9G98r4
Oc/NisVjfttSixNGt3zHnBcUiPZ05XsiCzzDN1cCAL+CNFH1IidCvkgDc9MHoKLF
7/M5AnXpB0pHlUiWt7zbmENmNDBpBhHVO6ZS5C171pIGDuLcpgXcsUNf3U9EL8uu
cSpThKvtVbvF8s/DRRqpFtL5860r2xaAY2s9tK8Ag7AxDJLrZnVVxrTDWd7EI6ye
hL2o9dO8SXAm7bJhY86+q4qVRDgxiuQsLROXeFOubJILBCAoyEYls7CKuMSx4XM0
14v4/RC8vlt+uES4Uk6iwAm9MpLR/BODke//f3qATgjnzDKwg+AamW8Rwef/d173
EM1t8mDorMXbpaxJMVRBhutU39ZthACuq5eHhZmNBCxWL1FOFEZbBoOaPI6uUlG9
2WkWiiHqey2yMbSysD/3Knq/zib9SIW2TnpdLWxkndSLMcJM556br5hMpT2iWUJT
l26DKV6JSnGJBg==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDTUMHvEatErQeW
bUaVFzPdGASVR+R6xBuAoPEddIHGJhFXFcUowvZgvNOdEuFK32JKz9gA/1U1MB49
Yk/talvTvjVJUvuorWdxNZ9N6pXX56P775teVDKqMkWhxKe2XM+lJCeLhJxkD1oq
aTwm2Sk+3lKcM4798gZRHeMeA/UjXKbbNR3X3q7Dkr5295Gxk8XBVFIdVpxDXB7l
k8jiE6CwtCmrWMB1JRBqYXEJayzXDFSTpKcfkzcGW3X2q5VMFJ+5SAfSaOx/Ubys
gaQzFNYTBMX1Wv1BMLhFlPt2M1zjHzXMTUup0vy6xpQvVpYN14QxIIiVpuVz8nuN
t2xR5tY3AgMBAAECggEBALAHKNX+kP4PaS+s7cwKXQDDHiZAkhqWPBbFerU/tU8b
rPwvPWK8LcLd6SWCcbwOI3IQe24xRIifAcG+oLg0DjRv0TG4d7zGXlIXChI85P/K
jXaz3WgRmXbfk9Oy3sZxv+NgH7UADcroYwLLUPlHky00w/oslOQD9bEixWvefhkq
czYVwkMpdzmulKhwhp3vrSl3oSaMT40JEF54x6fCfF8vMLn/oUpy+fFa6O1uKISP
M6a4e7jgmGefA7a+TtufQs4phmeAHEHVe8jEU9S9nz5Dh1Os/3g2tzOSI7qm7YY9
NGY+rbvqfuInbQi0xK8keSPad4ioL4fBDIQR6P3Nm6ECgYEA/cwXSKSAG+exVX39
dTVEU6Cf2ec2g8vPChdlverDrsCx/FojouTmk99R2WoFpAByiMHKksJDtV6vzZen
IAh64kSJn1iLM/ZF8pmmO7vwC3+dDcWW3uW5RzB8U+f9JlThFbOxqdmKHas/fihf
Ulu2/lif2gJDQZsE3doN5jjN9acCgYEA1SZG4Eu40jIj3UxwpVDMJX7UF0isgogL
g/iITQQpABFZ4WIks6bauJBiRsOufXRBKLf/2qIs453yoLvHrFlVq0FNG8wgizH9
zZlK4yxbhQLpa9cLRcPEwsDv0udkuZO6+TrDmAw9gp5WU43fKO4VP6HRip42m7sG
3vwkUiDjTPECgYAFBNQxC4+8/Yf0ONmaR8NiI/sFRB0/3ffqKyxH5SyZeBYM93tc
7UniAriLpB0YcSnSqoJnBJByNb0kQ6t6ZrCHaPOPwyB9lpEriv5OkBjfIVbpvs6M
+d4AGmVbA2tuJp+M3lDVGwgwLgLDa+j2p/mmbfo7RXAvC/G8sWM0+kqYYQKBgF7C
tZ/iCjjosakg4rOcSCYjTIdNd+RQN05kn7QdtVyiWiMpTsfP1k1XY1myhVCg7pb7
tnOsxegrwEJVOWAWF1Abp/xDs/QuNXfCPtjgT4/Cy6N15z0M29z5iaVp2g3m76j9
xxdB2dbILfjXie7YafnwJwhJbl2tuFBKKJuao3MBAoGAUmzoCBsYOgC34YJySNCG
5qs+DVkGfzX1zQzvPnNpgME79CWOUiarQQYeW8YYFvbUN7TlRjjaxk8W2viL/rnr
jEWOiJLuJjgcS8im9lVuPCc5xIAU3Bi+ryldR7wQov+dqAPCLwlCMnQOfl3bcLoo
4/v97srJR3Hl2wUV3b0s8ys=
-----END PRIVATE KEY-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Maryland, L=Baltimore, O=Test CA, Limited, OU=Server Research Department, CN=pangang.boonary.com/emailAddress=test@example.com
Validity
Not Before: Dec 4 03:36:16 2023 GMT
Not After : Nov 10 03:36:16 2123 GMT
Subject: C=US, ST=MD, L=Baltimore, O=Test Server, Limited, CN=pangang.boonary.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:dc:89:36:89:3f:46:c7:f8:82:75:0c:f2:b3:59:
17:47:ea:f6:ee:65:ce:75:48:b8:1e:28:9c:e4:20:
87:00:c7:2c:30:ad:4c:a8:a1:5a:4b:5a:99:20:c2:
22:7f:47:cf:8b:bd:cc:bb:78:45:aa:07:a7:0d:8d:
4a:76:ba:b1:47:3f:35:91:8e:c3:0f:87:35:b0:f8:
7e:ca:0f:7d:19:39:65:8e:52:3d:10:12:9a:af:41:
9e:7e:bd:b5:bb:2b:94:76:7d:bb:47:03:66:a0:27:
a2:43:48:d4:2b:ef:53:12:53:a9:80:fd:cc:ba:30:
ae:e7:c4:ee:1a:f6:e9:ef:82:09:47:df:cc:b3:93:
6a:4b:be:9a:69:11:ec:df:4d:ff:23:ea:de:81:5f:
86:4a:82:68:8c:24:7d:89:6d:f5:d3:ad:c0:4a:fa:
3b:3f:18:e7:9f:c2:63:b4:83:e9:c6:23:db:c4:9c:
b3:70:ba:b3:5c:23:22:47:f9:d8:13:99:ab:df:17:
fb:3a:21:34:f7:c9:9c:b0:68:0d:91:86:5f:bd:ee:
21:bd:e9:86:14:56:f1:dd:ba:09:05:ed:d6:1f:37:
96:f1:39:9a:8e:bc:d5:49:41:fe:a5:c4:d0:89:7d:
9c:b4:86:80:d8:5d:d0:f4:4c:dd:b0:43:9a:63:15:
9d:d1
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
81:CF:2C:88:6A:0F:6C:30:AE:81:09:0E:B0:DD:91:77:DD:09:34:C1
X509v3 Authority Key Identifier:
keyid:42:82:51:54:7D:7B:D3:CB:C9:31:C1:F1:02:FF:C1:45:34:42:E5:86
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:pangang.boonary.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
18:53:86:96:93:13:e7:02:ef:5e:c9:08:bb:8c:93:c4:ea:d8:
2b:36:14:f6:ec:42:06:c5:69:dc:5b:b7:46:d4:75:31:40:4d:
55:79:52:90:8a:f1:d5:76:56:93:0e:1d:63:19:c1:f0:8c:23:
df:b7:7e:0a:09:77:05:ce:e6:a6:6e:df:d9:45:59:70:f6:f4:
3a:eb:af:07:ca:f9:4c:5d:1d:67:94:ff:84:e1:18:fe:20:51:
e3:9a:b0:73:cc:f5:e3:8e:ba:f3:d2:9a:7e:3e:4a:0e:30:95:
a7:7c:e6:9c:d0:0f:f0:13:5a:0d:a3:bb:b2:b4:5d:fd:f3:0d:
7e:38:26:60:91:6a:e2:4d:cc:3e:76:2d:e2:17:19:9a:02:c3:
e6:6a:ff:bb:da:b7:97:29:cd:d5:82:e3:67:86:ff:16:89:26:
c7:a2:3d:03:05:9d:65:25:b9:28:5d:2b:05:0b:22:ce:89:9a:
71:98:06:c6:00:69:a2:fe:ce:b3:c6:3a:0f:3b:80:7a:b2:e3:
6c:3d:c1:14:b7:55:b2:2b:f8:22:47:34:0e:4e:11:6a:54:f0:
6f:2b:67:22:e4:39:ba:d5:c1:e5:82:36:93:0d:8b:05:45:84:
44:bf:2c:c8:11:3b:45:5f:de:03:1f:81:99:64:09:a0:57:d2:
05:ab:9b:d0:a8:42:72:e4:95:e7:94:ef:b7:d6:fb:3f:a0:e4:
98:52:b3:46:09:e0:3d:f1:a7:61:ae:98:83:0f:6d:18:5a:cb:
d3:4a:5a:e4:c8:ae:e8:e3:3c:54:81:48:39:65:88:1b:d1:a8:
db:0f:a0:2c:dd:58:58:e8:fb:07:e9:26:ea:81:9f:f2:8c:04:
65:07:0b:e4:06:cd:eb:45:b7:b0:47:65:46:6e:66:a7:9e:0e:
91:7a:1c:af:02:9d:a9:d5:28:a4:91:a3:08:b5:52:db:9b:e5:
08:5c:68:a7:10:90:c9:ca:f5:35:63:33:b9:31:93:52:cc:ec:
06:4d:ee:5e:09:47:2d:e1:32:1a:1b:a3:c7:f4:58:7e:cc:78:
fe:4e:ce:6d:0c:18:44:75:5a:dc:eb:a0:52:24:15:6f:cf:fc:
87:d1:bb:49:87:e1:2a:2d:e3:7f:1c:15:4d:56:42:b8:d6:fc:
70:c3:65:fb:02:ff:c1:20:4e:ca:a3:72:b2:14:82:8a:dd:67:
2d:f0:b2:d2:7a:11:b0:66:1c:57:79:23:1c:44:90:47:6d:7d:
91:08:c1:40:5f:ad:de:d4:fa:3a:7a:e9:96:d7:06:a6:20:e2:
c0:7b:b0:c2:5c:00:43:2f:3a:67:91:df:9e:33:cd:d4:3a:37:
9c:cd:c5:71:4b:0d:87:7b
-----BEGIN CERTIFICATE-----
MIIFRjCCAy6gAwIBAgIBATANBgkqhkiG9w0BAQsFADCBszELMAkGA1UEBhMCVVMx
ETAPBgNVBAgMCE1hcnlsYW5kMRIwEAYDVQQHDAlCYWx0aW1vcmUxGTAXBgNVBAoM
EFRlc3QgQ0EsIExpbWl0ZWQxIzAhBgNVBAsMGlNlcnZlciBSZXNlYXJjaCBEZXBh
cnRtZW50MRwwGgYDVQQDDBNwYW5nYW5nLmJvb25hcnkuY29tMR8wHQYJKoZIhvcN
AQkBFhB0ZXN0QGV4YW1wbGUuY29tMCAXDTIzMTIwNDAzMzYxNloYDzIxMjMxMTEw
MDMzNjE2WjBrMQswCQYDVQQGEwJVUzELMAkGA1UECAwCTUQxEjAQBgNVBAcMCUJh
bHRpbW9yZTEdMBsGA1UECgwUVGVzdCBTZXJ2ZXIsIExpbWl0ZWQxHDAaBgNVBAMM
E3BhbmdhbmcuYm9vbmFyeS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDciTaJP0bH+IJ1DPKzWRdH6vbuZc51SLgeKJzkIIcAxywwrUyooVpLWpkg
wiJ/R8+Lvcy7eEWqB6cNjUp2urFHPzWRjsMPhzWw+H7KD30ZOWWOUj0QEpqvQZ5+
vbW7K5R2fbtHA2agJ6JDSNQr71MSU6mA/cy6MK7nxO4a9unvgglH38yzk2pLvppp
EezfTf8j6t6BX4ZKgmiMJH2JbfXTrcBK+js/GOefwmO0g+nGI9vEnLNwurNcIyJH
+dgTmavfF/s6ITT3yZywaA2Rhl+97iG96YYUVvHdugkF7dYfN5bxOZqOvNVJQf6l
xNCJfZy0hoDYXdD0TN2wQ5pjFZ3RAgMBAAGjgakwgaYwHQYDVR0OBBYEFIHPLIhq
D2wwroEJDrDdkXfdCTTBMB8GA1UdIwQYMBaAFEKCUVR9e9PLyTHB8QL/wUU0QuWG
MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMB4GA1UdEQQXMBWCE3BhbmdhbmcuYm9v
bmFyeS5jb20wLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRp
ZmljYXRlMA0GCSqGSIb3DQEBCwUAA4ICAQAYU4aWkxPnAu9eyQi7jJPE6tgrNhT2
7EIGxWncW7dG1HUxQE1VeVKQivHVdlaTDh1jGcHwjCPft34KCXcFzuambt/ZRVlw
9vQ6668HyvlMXR1nlP+E4Rj+IFHjmrBzzPXjjrrz0pp+PkoOMJWnfOac0A/wE1oN
o7uytF398w1+OCZgkWriTcw+di3iFxmaAsPmav+72reXKc3VguNnhv8WiSbHoj0D
BZ1lJbkoXSsFCyLOiZpxmAbGAGmi/s6zxjoPO4B6suNsPcEUt1WyK/giRzQOThFq
VPBvK2ci5Dm61cHlgjaTDYsFRYREvyzIETtFX94DH4GZZAmgV9IFq5vQqEJy5JXn
lO+31vs/oOSYUrNGCeA98adhrpiDD20YWsvTSlrkyK7o4zxUgUg5ZYgb0ajbD6As
3VhY6PsH6SbqgZ/yjARlBwvkBs3rRbewR2VGbmanng6RehyvAp2p1SikkaMItVLb
m+UIXGinEJDJyvU1YzO5MZNSzOwGTe5eCUct4TIaG6PH9Fh+zHj+Ts5tDBhEdVrc
66BSJBVvz/yH0btJh+EqLeN/HBVNVkK41vxww2X7Av/BIE7Ko3KyFIKK3Wct8LLS
ehGwZhxXeSMcRJBHbX2RCMFAX63e1Po6eumW1wamIOLAe7DCXABDLzpnkd+eM83U
OjeczcVxSw2Hew==
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDciTaJP0bH+IJ1
DPKzWRdH6vbuZc51SLgeKJzkIIcAxywwrUyooVpLWpkgwiJ/R8+Lvcy7eEWqB6cN
jUp2urFHPzWRjsMPhzWw+H7KD30ZOWWOUj0QEpqvQZ5+vbW7K5R2fbtHA2agJ6JD
SNQr71MSU6mA/cy6MK7nxO4a9unvgglH38yzk2pLvpppEezfTf8j6t6BX4ZKgmiM
JH2JbfXTrcBK+js/GOefwmO0g+nGI9vEnLNwurNcIyJH+dgTmavfF/s6ITT3yZyw
aA2Rhl+97iG96YYUVvHdugkF7dYfN5bxOZqOvNVJQf6lxNCJfZy0hoDYXdD0TN2w
Q5pjFZ3RAgMBAAECggEBALkNKgXgYrRJgq5VPxHfH/no32sLYkJn0pb73SpPYPj2
J85wnHKjcfDpBLTIMco7p5vKl5B3S31xDmwAswsNfNQb5gdNk7/j5NmqqjlC5eXU
k7LorvRdqA6HMUeISIXV+62xswPThrm8iBuNcPusxjgKm6DxVmilkR5J0MIvjfy5
weAax7j91/DXT0T+kNbn0wgQ+8ZJSq8UaDvxUs8z6UQYe4zbSNcUYAzOVQ7WRFFR
X9sec+Rsgn0e5RAAyJ1/eqIKTjaGPPCgI6CeyAjM7ik2Qi3PWM/xX7+BElOddCmE
ntmX+2Ht+p3kPvp41lTP06MRGc93x738fQZw/kb38kECgYEA8Ymop/XWB+ELyORR
y8qoqchGz/B8qfoYtVNFd2xpRIZCbtfOKYWtbVjLUJTjpHGmU878/HFOTFf43XMy
qnXjyi7Y9EYGdOZLm9ytqLlQh+hh9L56v1Z49257N/wnDbRLa7WEFhyVbT1t2RYI
aO0UCBbTWgnETkMmTV84BzeIIJsCgYEA6b2iljyPM0ZaoR8XLGBuBTbTyHFuNv8B
r95nVajK7avbMbHuEohZHxqUmUgXpz2Y74IIhI8ZsYeMNGAcDKC6A8t79Br21UOi
G6M6ZBB/LVANbRvz7A+tV4jwOlYMdpotv/w3nfKYMMxyz7AZlHYGVD+t88h8DlJj
SoMIbLMVdAMCfxAKFCkTKiNbzmyIvOXLj2e25Pzp+11OPlXMMdC8YkEqqT6zFf2r
4thgDSBMwtEouuLV2/bnj0uCjAQoojSvn3DNq5qNC+C3ak3vWZjatX5Q8DBQddY+
58mGjKgrFmzSjC+a3iqZu1KFwcWosOZG2A2xdleEToTj8Kcyq4XPKjsCgYBUtYQh
3GqtU3bu43ybeYsF2rvf7bPavIoY+YoLkjOQ9PJoTSqRjtZ1nkVyU5023+z4B/Ec
UVwnaY9XP+mKbglb7LfMXKVN3sf2Ki60KwJcIqHrA/FfgML6cUdWbO7xYKjp5fcm
B9A+ByoouJJcqnVavQVGz0aeTh9r1pcMBc7ljwKBgQDgv2dVi8uEixHHFAJft4r6
lmQdNnLK83+UvuF1hJQFU5jALhZZ0asL9QSqgYc6Atnj8RJJ8D0StwLP3itu4CNn
UnhFP3g5aqf22iFpyrWdMwQPNd6W7W71utkKNQJ98s5AbdDjms7euDSkZCitF9OF
wsOW8pGAv4Si8xmo5YET/A==
-----END PRIVATE KEY-----
......@@ -6,6 +6,7 @@
***************************************************************************************************
-->
<Project DefaultTargets="Build" ToolsVersion="17.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.props" Condition="Exists('..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.props')" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
......@@ -43,8 +44,8 @@
<QtBuildConfig>debug</QtBuildConfig>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="QtSettings">
<QtInstall>5.14.2_msvc2017_64</QtInstall>
<QtModules>core;network;gui;widgets;concurrent</QtModules>
<QtInstall>5.14.0_msvc2017_64</QtInstall>
<QtModules>core;network;gui;widgets;serialport;concurrent</QtModules>
<QtBuildConfig>release</QtBuildConfig>
</PropertyGroup>
<Target Name="QtMsBuildNotFound" BeforeTargets="CustomBuild;ClCompile" Condition="!Exists('$(QtMsBuild)\qt.targets') or !Exists('$(QtMsBuild)\qt.props')">
......@@ -154,6 +155,7 @@
<None Include="car_chair.proto" />
<None Include="conf\config-default.ini" />
<None Include="conf\config-sn-ip.json" />
<None Include="packages.config" />
<None Include="protobuf\shovel_chair.proto" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
......@@ -161,5 +163,13 @@
<Import Project="$(QtMsBuild)\qt.targets" />
</ImportGroup>
<ImportGroup Label="ExtensionTargets">
<Import Project="..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.targets" Condition="Exists('..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.targets')" />
</ImportGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.props'))" />
<Error Condition="!Exists('..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vcpkg.D.gitpak.vcpkg.1.0.0\build\native\vcpkg.D.gitpak.vcpkg.targets'))" />
</Target>
</Project>
\ No newline at end of file
......@@ -134,6 +134,7 @@
<None Include="car_chair.proto">
<Filter>Translation Files</Filter>
</None>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<QtMoc Include="acquire_config.h">
......
......@@ -2,9 +2,9 @@
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QtLastBackgroundBuild>2023-12-03T17:55:32.4749765Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2023-12-04T03:03:49.9005770Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QtLastBackgroundBuild>2023-12-03T17:55:32.6514522Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2023-12-04T08:03:26.9085734Z</QtLastBackgroundBuild>
</PropertyGroup>
</Project>
\ No newline at end of file
......@@ -4,11 +4,12 @@ publish_message_type=2;//1云端,2直连
username=boonray;//登录用户名
password=Boonray@123;//登录密码
server_url=http://139.196.75.44:8900;//服务器
server_grpc_host=192.168.9.111
mqtt_host=139.196.75.44;//mqtt ip
mqtt_port=28884;//mqtt 端口
hardware_to_chair_way=2;//读取硬件座椅数据的方式1: joystick,2:tcp,3:udp
mqtt_keep_alive=10;//保活
grpc_enable_cert=true;//是否开启mqtt ssl认证
grpc_enable_cert=false;//是否开启grpc ssl认证
mqtt_enable_cert=false;//是否开启mqtt ssl认证
http_enable_cert=false;//是否开启http ssl认证
publish_control_frequency=10;//发送车铲控制数据的HZ数
......@@ -18,22 +19,22 @@ publish_status_frequency=10;//发送车铲状态数据的HZ数
chair_name=moza;//座椅名称
chair_sn=shihao_test_01;//本座椅的sn
device_sn=;//默认所控的sn
chair_host="192.168.1.3";//座椅程序IP,不接收0.0.0.0
chair_host=192.168.9.198;//座椅程序IP,不接收0.0.0.0
chair_port=8802;//座椅程序端口
chair_to_device_port=8801;//座椅程序下发控制指令的端口
grpc_to_chair_port=50052;//pad到座椅的指令端口,grpc server ip
hardware_host=192.168.9.53;//硬件座椅IP
hardware_to_chair_port=18855;//硬件座椅端口
hardware_host=192.168.9.53;//硬件座椅IP 用于接收座椅指令数据 当与座椅进行tcp 通信时需要
hardware_to_chair_port=18855;//硬件座椅端口 用于接收座椅指令数据
[Car]
chair_name=bulldozer;//gzy:湖州的白色座椅
chair_name=bulldozer;//gzy:湖州的白色座椅 bulldozer:挖机
chair_sn=car_chair_shihao;//本座椅的sn
device_sn=;//默认所控的sn
chair_host=192.168.1.3;//座椅程序IP
chair_host=192.168.9.198;//座椅程序IP
chair_port=8801;//座椅程序端口
chair_to_device_port=8801;//座椅程序下发控制指令的端口
grpc_to_chair_port=50052;//pad到座椅的指令端口,grpc server ip
hardware_host=192.168.1.3;//硬件座椅IP
hardware_to_chair_port=44444;//硬件座椅端口
hardware_host=192.168.9.53;//硬件座椅IP 用于接收座椅指令数据 当与座椅进行tcp 通信时需要
hardware_to_chair_port=18855;//硬件座椅端口 用于接收座椅指令数据
brake_ignore=20.0;//刹车忽略值
steering_ignore=1.0;//方向盘忽略值
\ No newline at end of file
#include "control_module.h"
#include "control_module.h"
control_module::control_module(QObject *parent)
control_module::control_module(QObject* parent)
: QObject(parent)
{
_module_data = module_data::instance();//全局数据中转
_module_data = module_data::instance();//全局数据中转
if (_module_data->chair_name == "moza") {//湖州的白色座椅
_moza_module = new moza_module();//实例moza 解析类
_joy_thread = new joy_thread();//实例读座椅数据 解析类
connect(_joy_thread, &joy_thread::joy_received_button, _moza_module, &moza_module::analyze_seat_button);
connect(_joy_thread, &joy_thread::joy_received_axis, _moza_module, &moza_module::analyze_seat_axis);
if (_module_data->chair_name == "moza") {
_moza_module = new moza_module();//实例moza 解析类
}
else if (_module_data->chair_name == "feishi") {
_feishi_module = new feishi_module(_module_data->hardware_host, _module_data->hardware_to_chair_port);
}
else if (_module_data->chair_name == "gzy") {
_gzy_module = new gzy_module();//实例moza 解析类
//_joy_thread = new joy_thread();//实例读座椅数据 解析类
else if (_module_data->chair_name == "gzy") {//湖州的白色座椅
_gzy_module = new gzy_module();//实例moza 解析类
//_joy_thread = new joy_thread();//实例读座椅数据 解析类
//connect(_joy_thread, &joy_thread::joy_received_button, _gzy_module, &gzy_module::analyze_seat_button);
//connect(_joy_thread, &joy_thread::joy_received_axis, _gzy_module, &gzy_module::analyze_seat_axis);
}
else if (_module_data->chair_name == "bulldozer") {//时兼容推土机ID3
_bulldozer_module = new bulldozer_module("", _module_data->chair_port);
else if (_module_data->chair_name == "bulldozer") {//临时兼容推土机ID3
_bulldozer_module = new bulldozer_module("", _module_data->hardware_to_chair_port);
}
......
#pragma once
#pragma once
#include <QObject>
#include "module_data.h"
......@@ -6,11 +6,11 @@
#include "moza_module.h"
#include "feishi_module.h"
#include "bulldozer_module.h"
#include "udp_thread.h"
#include "joy_thread.h"
class control_module : public QObject
class control_module : public QObject
{
Q_OBJECT
......@@ -19,7 +19,7 @@ public:
~control_module();
private:
//
//单例类
std::shared_ptr<module_data> _module_data = nullptr;
moza_module* _moza_module = nullptr;
......
......@@ -8,38 +8,45 @@ grpc_module::grpc_module(QObject* parent)
{
_module_data = module_data::instance();
QThread* _pThread = new QThread(this);
QThread* _pThread = new QThread(this);
connect(_pThread, &QThread::finished, this, &grpc_module::deleteLater);
connect(this, &grpc_module::grpc_startwork, this, &grpc_module::on_grpc_endthread);
this->moveToThread(_pThread);
emit grpc_startwork();
_pThread->start();
emit grpc_startwork();
}
grpc_module::~grpc_module()
{
if (_car_service) {
delete _car_service;
_car_service = nullptr;
}
if (_shovel_service) {
delete _shovel_service;
_shovel_service = nullptr;
}
if (_car_service) {
delete _car_service;
_car_service = nullptr;
}
if (_shovel_service) {
delete _shovel_service;
_shovel_service = nullptr;
}
qDebug() << "~grpc_thread()";
}
void grpc_module::on_grpc_endthread()
{
int i = 0;
printf("gRPC\n");
std::string serverAddress = _module_data->grpc_server_address.toStdString();
std::string client_ca_file = "./cert/cacert_grpc/cacert.pem";
std::string server_key_file = "./cert/cacert_grpc/serverkey.pem";
std::string server_cert_file = "./cert/cacert_grpc/servercert.pem";
bool require_client_cert = _module_data->grpc_enable_cert;
this->grpc_shovel_server(serverAddress, client_ca_file, server_key_file, server_cert_file, require_client_cert);
printf("Server Exit\n");
std::string serverAddress = _module_data->grpc_server_address.toStdString();
std::string client_ca_file = "./cert/cacert_grpc/cacert.pem";
std::string server_key_file = "./cert/cacert_grpc/serverkey.pem";
std::string server_cert_file = "./cert/cacert_grpc/servercert.pem";
bool require_client_cert = _module_data->grpc_enable_cert;
if (_module_data->isIpAddressValid(serverAddress)) {//检查IP地址的有效性
global_signal::instance()->record_debug_logger("gRPC ");
this->grpc_shovel_server(serverAddress, client_ca_file, server_key_file, server_cert_file, require_client_cert);;
global_signal::instance()->record_debug_logger("Server Exit: ");
}
else {
global_signal::instance()->record_debug_logger("Invalid IP address: " + QString::fromStdString(serverAddress));
}
}
......@@ -52,63 +59,70 @@ std::string grpc_module::get_cacert_contents(const char* fpath)
}
void grpc_module::grpc_shovel_server(const std::string& serverAddress,
const std::string& client_ca_file,
const std::string& server_key_file,
const std::string& server_cert_file,
bool require_client_cert)
const std::string& client_ca_file,
const std::string& server_key_file,
const std::string& server_cert_file,
bool require_client_cert)
{
if (_module_data->chair_type == _CAR) {
_car_service = new car_server_impl();
}
else if (_module_data->chair_type == _SHOVEL) {
_shovel_service = new shovel_server_impl();
}
try {
std::shared_ptr<grpc::ServerCredentials> creds;
ServerBuilder builder;
if (require_client_cert) {
std::string client_ca_pem = get_cacert_contents(client_ca_file.c_str());
std::string my_key_pem = get_cacert_contents(server_key_file.c_str());
std::string my_cert_pem = get_cacert_contents(server_cert_file.c_str());
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {
my_key_pem.c_str(), my_cert_pem.c_str()
};
grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
ssl_opts.pem_root_certs = client_ca_pem;
ssl_opts.pem_key_cert_pairs.push_back(pkcp);
creds = grpc::SslServerCredentials(ssl_opts);
}
else {
creds = grpc::InsecureServerCredentials();
}
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS, 5000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);
builder.AddListeningPort(serverAddress, creds);
if (_module_data->chair_type == _CAR) {
builder.RegisterService(_car_service);
}
else if (_module_data->chair_type == _SHOVEL) {
builder.RegisterService(_shovel_service);
}
const std::unique_ptr<Server> server(builder.BuildAndStart());
qInfo() << "gRPC server listening on " << QString::fromStdString(serverAddress);
server->Wait();
}
catch (std::exception& e) {
qCritical() << "Exception occurred in gRPC server: " << e.what();
}
catch (...) {
qCritical() << "Unknown exception occurred in gRPC server";
}
if (_module_data->chair_type == _CAR) {
_car_service = new car_server_impl();
}
else if (_module_data->chair_type == _SHOVEL) {
_shovel_service = new shovel_server_impl();
}
try {
std::shared_ptr<grpc::ServerCredentials> creds;
ServerBuilder builder;
if (require_client_cert) {
std::string client_ca_pem = get_cacert_contents(client_ca_file.c_str());
std::string my_key_pem = get_cacert_contents(server_key_file.c_str());
std::string my_cert_pem = get_cacert_contents(server_cert_file.c_str());
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {
my_key_pem.c_str(), my_cert_pem.c_str()
};
grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
ssl_opts.pem_root_certs = client_ca_pem;
ssl_opts.pem_key_cert_pairs.push_back(pkcp);
creds = grpc::SslServerCredentials(ssl_opts);
}
else {
creds = grpc::InsecureServerCredentials();
}
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS, 5000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);
builder.AddListeningPort(serverAddress, creds);
if (_module_data->chair_type == _CAR) {
builder.RegisterService(_car_service);
}
else if (_module_data->chair_type == _SHOVEL) {
builder.RegisterService(_shovel_service);
}
const std::unique_ptr<Server> server(builder.BuildAndStart());
global_signal::instance()->record_debug_logger("gRPC server listening on " + QString::fromStdString(serverAddress));
server->Wait();
}
catch (std::exception& e) {
global_signal::instance()->record_error_logger("Exception occurred in gRPC server: " + QString::fromStdString(e.what()));
}
catch (...) {
global_signal::instance()->record_error_logger("Unknown exception occurred in gRPC server ");
}
}
......@@ -127,40 +141,40 @@ void grpc_module::grpc_shovel_server(const std::string& serverAddress,
/*void grpc_thread::grpc_shovel_server() {
const std::string serverAddress(_module_data->grpc_server_address.toStdString());
_service = new car_server_impl();
const std::string serverAddress(_module_data->grpc_server_address.toStdString());
_service = new car_server_impl();
auto client_ca_pem = get_cacert_contents("./cert/cacert_grpc/cacert.pem"); // for verifying clients
auto my_key_pem = get_cacert_contents("./cert/cacert_grpc/serverkey.pem");
auto my_cert_pem = get_cacert_contents("./cert/cacert_grpc/servercert.pem");
auto client_ca_pem = get_cacert_contents("./cert/cacert_grpc/cacert.pem"); // for verifying clients
auto my_key_pem = get_cacert_contents("./cert/cacert_grpc/serverkey.pem");
auto my_cert_pem = get_cacert_contents("./cert/cacert_grpc/servercert.pem");
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {
my_key_pem.c_str(), my_cert_pem.c_str()
};
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {
my_key_pem.c_str(), my_cert_pem.c_str()
};
grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
ssl_opts.pem_root_certs = client_ca_pem;
ssl_opts.pem_key_cert_pairs.push_back(pkcp);
grpc::SslServerCredentialsOptions ssl_opts(GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
ssl_opts.pem_root_certs = client_ca_pem;
ssl_opts.pem_key_cert_pairs.push_back(pkcp);
std::cout << "pem_root_certs length: " << ssl_opts.pem_root_certs.length() << std::endl;
std::cout << "pem_root_certs length: " << ssl_opts.pem_root_certs.length() << std::endl;
std::shared_ptr<grpc::ServerCredentials> creds = grpc::SslServerCredentials(ssl_opts);;
std::shared_ptr<grpc::ServerCredentials> creds = grpc::SslServerCredentials(ssl_opts);;
ServerBuilder builder;
ServerBuilder builder;
builder.AddListeningPort(serverAddress, creds);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS, 5000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);
builder.AddListeningPort(serverAddress, creds);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS, 5000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS, 10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS, 1);
builder.RegisterService(_service);
builder.RegisterService(_service);
const std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << serverAddress << std::endl;
const std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << serverAddress << std::endl;
server->Wait();
server->Wait();
}*/
//void grpc_thread::grpc_shovel_server() {
......
#include "joy_thread.h"
#include "global_signal.h"
joy_thread::joy_thread(QObject* parent)
: QObject(parent)
{
QFuture<void> future = QtConcurrent::run(this, &joy_thread::call_hardware_data);
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("开启 joy_thread ."));
}
joy_thread::~joy_thread()
{
}
void joy_thread::call_hardware_data()
{
const int joyCount = sf::Joystick::Count;
bool detection[joyCount] = { false };
int axisCount[joyCount] = { 0 };
int previousButtonCount[joyCount] = { 0 };
int previousAxisCount[joyCount] = { 0 };
bool previousButtonStates[joyCount][sf::Joystick::ButtonCount] = { false };
for (int joyIndex = 0; joyIndex < joyCount; ++joyIndex) {
sf::Joystick::update();
if (sf::Joystick::isConnected(joyIndex)) {
sf::Joystick::getButtonCount(joyIndex);
axisCount[joyIndex] = 0;
while (sf::Joystick::hasAxis(joyIndex, static_cast<sf::Joystick::Axis>(axisCount[joyIndex]))) {
axisCount[joyIndex]++;
}
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("已经连接到座椅 %1.").arg(joyIndex));
detection[joyIndex] = true;
}
else {
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("没有检测到座椅 %1.").arg(joyIndex));
}
}
while (true) {
for (int joyIndex = 0; joyIndex < joyCount; ++joyIndex) {
if (!detection[joyIndex]) {
continue;
}
sf::Joystick::update();
int buttonCount = sf::Joystick::getButtonCount(joyIndex);
if (buttonCount != previousButtonCount[joyIndex]) {
previousButtonCount[joyIndex] = buttonCount;
}
if (axisCount[joyIndex] != previousAxisCount[joyIndex]) {
previousAxisCount[joyIndex] = axisCount[joyIndex];
}
for (int button = 0; button < buttonCount; ++button) {
if (button < sf::Joystick::getButtonCount(joyIndex)) {
bool state = sf::Joystick::isButtonPressed(joyIndex, button);
if (state != previousButtonStates[joyIndex][button]) {
previousButtonStates[joyIndex][button] = state;
emit joy_received_button(button, state);
//global_signal::instance()->record_debug_logger("joyIndex: " + QString::number(joyIndex) + " button: " + QString::number(button, 10) + " " + QString::number(state, 10));
}
}
}
for (int axis = 0; axis < axisCount[joyIndex]; ++axis) {
if (sf::Joystick::hasAxis(joyIndex, static_cast<sf::Joystick::Axis>(axis))) {
double position = sf::Joystick::getAxisPosition(joyIndex, static_cast<sf::Joystick::Axis>(axis));
emit joy_received_axis(axis, position);
//global_signal::instance()->PublishMsgToWinodw("joyIndex: " + QString::number(joyIndex) + " axis: " + QString::number(axis, 10) + " " + QString::number(position, 'f'));
}
}
}
QThread::msleep(20);
}
}
/*
#include "joy_thread.h"
#include "global_signal.h"
......@@ -6,7 +89,7 @@ joy_thread::joy_thread(QObject* parent)
: QObject(parent)
{
QFuture<void> future = QtConcurrent::run(this, &joy_thread::call_hardware_data);
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("开启 joy_thread ."));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("开启 joy_thread ."));
}
joy_thread::~joy_thread()
......@@ -29,11 +112,11 @@ void joy_thread::call_hardware_data()
while (sf::Joystick::hasAxis(0, static_cast<sf::Joystick::Axis>(axisCount))) {
axisCount++;
}
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("已经连接到座椅."));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("已经连接到座椅."));
detection = true;
}
else {
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("没有检测到座椅."));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("没有检测到座椅."));
}
......@@ -55,8 +138,8 @@ void joy_thread::call_hardware_data()
bool state = sf::Joystick::isButtonPressed(0, button);
if (state != previousButtonStates[button]) {
previousButtonStates[button] = state;
emit joy_received_button(button, state);
global_signal::instance()->record_debug_logger("button:"+QString::number(button,10)+" "+ QString::number(state, 10));
// emit joy_received_button(button, state);
global_signal::instance()->record_debug_logger("button:" + QString::number(button, 10) + " " + QString::number(state, 10));
}
}
}
......@@ -64,10 +147,21 @@ void joy_thread::call_hardware_data()
for (int axis = 0; axis < axisCount; ++axis) {
if (sf::Joystick::hasAxis(0, static_cast<sf::Joystick::Axis>(axis))) {
double position = sf::Joystick::getAxisPosition(0, static_cast<sf::Joystick::Axis>(axis));
emit joy_received_axis(axis, position);
global_signal::instance()->record_debug_logger("button:" + QString::number(axis, 10) + " " + QString::number(position,'f'));
//emit joy_received_axis(axis, position);
global_signal::instance()->PublishMsgToWinodw("axis:" + QString::number(axis, 10) + " " + QString::number(position, 'f'));
}
}
QThread::msleep(50);
QThread::msleep(20);
}
}
\ No newline at end of file
}*/
//Failed to create DirectInput device : -2147467259
//Failed to create DirectInput device : -2147467259
//Failed to create DirectInput device : -2147467259
//Failed to create DirectInput device : -2147467259
//Failed to create DirectInput device : -2147467259
//Failed to create DirectInput device : -2147467259
\ No newline at end of file
#include "chair_code.h"
#include "chair_code.h"
#include <QtWidgets/QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QApplication a(argc, argv);
chair_code w;
w.show();
return a.exec();
chair_code w;
w.show();
return a.exec();
}
#include "module_data.h"
#include "global_signal.h"
#include <QHostAddress>
std::shared_ptr<module_data> module_data::m_instance = nullptr;
std::mutex module_data::m_mutex;
......@@ -40,13 +42,15 @@ module_data::module_data(QObject* parent)
}
server_url = _acquire_config->server_url;
grpc_server_address = _acquire_config->chair_host + ":"//grpc server ip port
server_grpc_host = _acquire_config->server_grpc_host;
grpc_server_address = server_grpc_host + ":"//grpc server ip port
+ QString::number(_acquire_config->grpc_to_chair_port, 10);
chair_host = _acquire_config->chair_host;//座椅程序的ip
chair_port = _acquire_config->chair_port;//座椅程序的端口
chair_to_device_port = _acquire_config->chair_to_device_port;//座椅下发到车铲控制数据的端口
publish_control_frequency = _acquire_config->publish_control_frequency;//下控制数据的频率
publish_status_frequency = _acquire_config->publish_status_frequency;//下发状态数据的频率
......@@ -105,4 +109,11 @@ QString module_data::acquire_device_ip(QString _target_device_sn) {
}
return this->current_controls_device_sn;
}
bool module_data::isIpAddressValid(const std::string& ipAddress)
{
QHostAddress address(QString::fromStdString(ipAddress));
return address.protocol() != QAbstractSocket::UnknownNetworkLayerProtocol;
}
\ No newline at end of file
......@@ -32,6 +32,7 @@ public:
}
QString acquire_device_ip(QString _target_device_sn);
bool isIpAddressValid(const std::string& ipAddress);//检查IP地址的有效性
public:
QString chair_name = "";
QString chair_sn = "";
......@@ -158,7 +159,7 @@ public:
//QString req_chair_hexdata = "0A000104";
QString request_bind_device_path = "";
QString server_grpc_host = "";//grpc 域名
QString chair_host = "";//座椅程序IP,不接收0.0.0.0
quint16 chair_port = 0;
quint16 chair_to_device_port = 0;//座椅下发控制指令所用port
......@@ -177,6 +178,9 @@ public:
bool mqtt_enable_cert = false;//使能 mqtt ssl
bool grpc_enable_cert = false;//使能 grpc ssl
bool publish_control_sign = false;//使能下发控制数据
private:
static std::shared_ptr<module_data> m_instance;
static std::mutex m_mutex;
......
#include "moza_module.h"
#include "moza_module.h"
#include "global_signal.h"
moza_module::moza_module(QObject *parent)
moza_module::moza_module(QObject* parent)
: QObject(parent)
{
_module_data = module_data::instance();//全局数据中转
_module_data = module_data::instance();//全局数据中转
_joy_thread = new joy_thread();//实例读座椅数据 解析类
connect(_joy_thread, &joy_thread::joy_received_button, this, &moza_module::analyze_seat_button);
connect(_joy_thread, &joy_thread::joy_received_axis, this, &moza_module::analyze_seat_axis);
}
moza_module::~moza_module()
......@@ -47,67 +51,67 @@ void moza_module::analyze_seat_button(int button, bool pressed)
case 0: if (pressed) {
if (!_module_data->target_airconditioner) {
_module_data->target_airconditioner = 1;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("调开"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("空调开"));
}
else {
_module_data->target_airconditioner = 0;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("调关"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("空调关"));
}
} break;
case 1: if (pressed) {
if (!_module_data->target_low_beam) {
_module_data->target_low_beam = 1;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("光灯开"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("近光灯开"));
}
else {
_module_data->target_low_beam = 0;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("光灯关"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("近光灯关"));
}
}break;
case 2: if (pressed) {
if (!_module_data->target_high_beam) {
_module_data->target_high_beam = 1;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("远光灯开"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("远光灯开"));
}
else {
_module_data->target_high_beam = 0;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("远光灯关"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("远光灯关"));
}
}break;
case 3: if (pressed) {
if (!_module_data->target_horn) {
_module_data->target_horn = 1;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("叭开"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("喇叭开"));
}
else {
_module_data->target_horn = 0;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("叭关"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("喇叭关"));
}
}break;
case 4: if (!pressed) { _module_data->target_gear = 0; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 P 档")); }break;
case 5: if (!pressed) { _module_data->target_gear = 1; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 R 档")); }break;
case 6: if (!pressed) { _module_data->target_gear = 2; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 N 档")); }break;
case 7: if (!pressed) { _module_data->target_gear = 3; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 D 档")); }break;
case 4: if (!pressed) { _module_data->target_gear = 0; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 P 档")); }break;
case 5: if (!pressed) { _module_data->target_gear = 1; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 R 档")); }break;
case 6: if (!pressed) { _module_data->target_gear = 2; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 N 档")); }break;
case 7: if (!pressed) { _module_data->target_gear = 3; global_signal::instance()->PublishMsgToWinodw(QStringLiteral("档位切换到 D 档")); }break;
case 12: if (pressed) {
if (!_module_data->target_left_light) {
_module_data->target_left_light = 1;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("左转灯开"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("左转灯开"));
}
else {
_module_data->target_left_light = 0;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("左转灯关"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("左转灯关"));
}
}break;
case 13: if (pressed) {
if (!_module_data->target_right_light) {
_module_data->target_right_light = 1;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("右转灯开"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("右转灯开"));
}
else {
_module_data->target_right_light = 0;
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("右转灯关"));
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("右转灯关"));
}
}break;
}
......
#pragma once
#pragma once
#include <QObject>
#include "module_data.h"
#include "joy_thread.h"
class moza_module : public QObject
class moza_module : public QObject
{
Q_OBJECT
......@@ -16,6 +16,8 @@ public slots:
void analyze_seat_button(int button, bool pressed);
private:
//
//单例类
std::shared_ptr<module_data> _module_data = nullptr;
joy_thread* _joy_thread = nullptr;
};
#include "network_module.h"
#include "network_module.h"
#include "global_signal.h"
network_module::network_module(QObject *parent)
network_module::network_module(QObject* parent)
: QObject(parent)
{
_module_data = module_data::instance();
_http_module = http_module::instance();
QString retmsg = "";
//后期 此处改写,当为铲设备时获取token失败就弹出对话框,点击可重新获取?或者用定时器循环获取直到获取成功?
//后期 此处改写,当为铲设备时获取token失败就弹出对话框,点击可重新获取?或者用定时器循环获取直到获取成功?
if (_module_data->chair_type == _SHOVEL) {
retmsg = _http_module->request_device_token_message();//获取token和请求路径 铲端需要自行获取token
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("获取token:")+ retmsg + "[" + _module_data->chair_sn + "]");
if (_module_data->request_bind_device_path != "") {//判断是否获取token和请求路径成功
retmsg = _http_module->request_bind_device_message();//获取绑定sn _module_data->current_controls_device_sn
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("获取绑定sn:") + retmsg);
retmsg = _http_module->request_device_token_message();//获取token和请求路径 铲端需要自行获取token
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("获取token:") + retmsg + "[" + _module_data->chair_sn + "]");
if (_module_data->request_bind_device_path != "") {//判断是否获取token和请求路径成功
retmsg = _http_module->request_bind_device_message();//获取绑定sn _module_data->current_controls_device_sn
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("获取绑定sn:") + retmsg);
if (_module_data->current_controls_device_sn != "") {//判断是否成功获取到sn
if (_module_data->current_controls_device_sn != "") {//判断是否成功获取到sn
if (_module_data->current_controls_device_sn != _module_data->device_sn) {
global_signal::instance()->record_debug_logger(QStringLiteral("目标SN与绑定的SN不匹配: [")+ _module_data->current_controls_device_sn + "] [" + _module_data->chair_sn + "]");
return;//直接返回,或者弹出对话框选择是否重新绑定
global_signal::instance()->record_debug_logger(QStringLiteral("目标SN与绑定的SN不匹配: [") + _module_data->current_controls_device_sn + "] [" + _module_data->chair_sn + "]");
return;//直接返回,或者弹出对话框选择是否重新绑定
}
}
else {
retmsg = _http_module->request_controls_device_message(_module_data->device_sn);
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("请求控制设备:") + retmsg);
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("请求控制设备:") + retmsg);
}
}
else {
//此处 获取token和路径失败后处理
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("请求token失败,请确认云端是否有[") + _module_data->chair_sn + QStringLiteral("]设备"));//测试临时添加;
//此处 获取token和路径失败后处理
global_signal::instance()->PublishMsgToWinodw(QStringLiteral("请求token失败,请确认云端是否有[") + _module_data->chair_sn + QStringLiteral("]设备"));//测试临时添加;
}
}//车设备不需要主动获取token
if (_module_data->publish_message_type == _WEB) {//座椅指令->云端->铲
//控制数据由云端转发,不需要获取目标铲的IP
}//车设备不需要主动获取token
if (_module_data->publish_message_type == _WEB) {//座椅指令->云端->铲
//控制数据由云端转发,不需要获取目标铲的IP
}
else if (_module_data->publish_message_type == _DIRECT) {//座椅指令->铲
_module_data->acquire_device_ip(_module_data->current_controls_device_sn);//需要从本地获取IP
else if (_module_data->publish_message_type == _DIRECT) {//座椅指令->铲
_module_data->acquire_device_ip(_module_data->current_controls_device_sn);//需要从本地获取IP
}
global_signal::instance()->PublishMsgToWinodw("_module_data->device_sn::" + _module_data->device_sn);
}
network_module::~network_module()
......
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="vcpkg.D.gitpak.vcpkg" version="1.0.0" targetFramework="native" />
</packages>
\ No newline at end of file
[2023-12-04 11:44:21.947] [logger4] [debug] Message(request_device_token_message):登录成功
[2023-12-04 11:44:21.947] [logger4] [debug] Token:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJib29ucmF5IiwiZXhwIjoxNzAxNzQ3ODYwLCJkZXZpY2VfaWQiOjUzNTQ2OTg4MjgyOTc3LCJwcm9qZWN0X2lkcyI6WzUzNDcxNTMyOTI5NzkzXSwicm9sZV9pZCI6M30.nQI4u0dlG3jhFh-bAOokjLs0OndT9IbYvmaXBewZamI
[2023-12-04 11:44:21.947] [logger4] [debug] Project ID:53471532929793
[2023-12-04 11:44:21.947] [logger4] [debug] Product ID:52117314322241
[2023-12-04 11:44:21.947] [logger4] [debug] device ID:53546988282977
[2023-12-04 11:44:21.947] [logger4] [debug] device_type ID:0
[2023-12-04 11:44:21.981] [logger4] [debug] Message(request_bind_device_message):查询成功
[2023-12-04 11:44:21.982] [logger4] [debug] Invalid target device serial number : request_controls_device_message()
[2023-12-04 12:00:04.993] [logger4] [debug] Message(request_device_token_message):登录成功
[2023-12-04 12:00:04.993] [logger4] [debug] Token:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJib29ucmF5IiwiZXhwIjoxNzAxNzQ4ODAzLCJkZXZpY2VfaWQiOjUzNTQ2OTg4MjgyOTc3LCJwcm9qZWN0X2lkcyI6WzUzNDcxNTMyOTI5NzkzXSwicm9sZV9pZCI6M30.dGpot_9YaTI9XspYE7I2W3OAYRWu4cBmw1JQSQAh-1c
[2023-12-04 12:00:04.993] [logger4] [debug] Project ID:53471532929793
[2023-12-04 12:00:04.993] [logger4] [debug] Product ID:52117314322241
[2023-12-04 12:00:04.993] [logger4] [debug] device ID:53546988282977
[2023-12-04 12:00:04.993] [logger4] [debug] device_type ID:0
[2023-12-04 12:00:05.027] [logger4] [debug] Message(request_bind_device_message):查询成功
[2023-12-04 12:00:05.028] [logger4] [debug] Invalid target device serial number : request_controls_device_message()
[2023-12-04 12:21:50.175] [logger4] [debug] Message(request_device_token_message):登录成功
[2023-12-04 12:21:50.175] [logger4] [debug] Token:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJib29ucmF5IiwiZXhwIjoxNzAxNzUwMTA5LCJkZXZpY2VfaWQiOjUzNTQ2OTg4MjgyOTc3LCJwcm9qZWN0X2lkcyI6WzUzNDcxNTMyOTI5NzkzXSwicm9sZV9pZCI6M30.kH3ZzE_sxHGrOdwcHnhOfuCTXU8cNjqFOHGQFaMMS5I
[2023-12-04 12:21:50.175] [logger4] [debug] Project ID:53471532929793
[2023-12-04 12:21:50.175] [logger4] [debug] Product ID:52117314322241
[2023-12-04 12:21:50.175] [logger4] [debug] device ID:53546988282977
[2023-12-04 12:21:50.175] [logger4] [debug] device_type ID:0
[2023-12-04 12:21:50.209] [logger4] [debug] Message(request_bind_device_message):查询成功
[2023-12-04 12:21:50.211] [logger4] [debug] Invalid target device serial number : request_controls_device_message()
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
[2023-12-04 15:10:42.563] [logger4] [debug] Invalid IP address: 192.168.9.111:50052
[2023-12-04 15:10:52.820] [logger4] [debug] button:7 1
[2023-12-04 15:10:53.625] [logger4] [debug] button:6 1
[2023-12-04 15:10:53.827] [logger4] [debug] button:6 0
[2023-12-04 15:10:54.733] [logger4] [debug] button:4 1
[2023-12-04 15:10:56.244] [logger4] [debug] button:7 0
[2023-12-04 15:10:58.662] [logger4] [debug] button:4 0
[2023-12-04 15:11:02.086] [logger4] [debug] button:6 1
[2023-12-04 15:11:03.193] [logger4] [debug] button:5 1
[2023-12-04 15:11:03.395] [logger4] [debug] button:5 0
[2023-12-04 15:11:04.806] [logger4] [debug] button:6 0
[2023-12-04 15:11:05.914] [logger4] [debug] button:4 1
[2023-12-04 15:11:06.115] [logger4] [debug] button:4 0
[2023-12-04 15:11:08.936] [logger4] [debug] button:4 1
[2023-12-04 15:11:09.340] [logger4] [debug] button:4 0
[2023-12-04 15:11:10.345] [logger4] [debug] button:4 1
[2023-12-04 15:11:10.748] [logger4] [debug] button:4 0
[2023-12-04 15:11:11.755] [logger4] [debug] button:6 1
[2023-12-04 15:11:11.957] [logger4] [debug] button:6 0
[2023-12-04 15:11:13.770] [logger4] [debug] button:4 1
[2023-12-04 15:11:14.274] [logger4] [debug] button:4 0
[2023-12-04 15:11:15.080] [logger4] [debug] button:4 1
[2023-12-04 15:11:17.597] [logger4] [debug] button:4 0
[2023-12-04 15:11:17.799] [logger4] [debug] button:4 1
[2023-12-04 15:11:18.101] [logger4] [debug] button:4 0
[2023-12-04 15:11:18.907] [logger4] [debug] button:4 1
[2023-12-04 15:11:19.612] [logger4] [debug] button:4 0
[2023-12-04 15:11:20.216] [logger4] [debug] button:4 1
[2023-12-04 15:11:20.821] [logger4] [debug] button:4 0
[2023-12-04 15:11:22.936] [logger4] [debug] button:4 1
[2023-12-04 15:11:23.440] [logger4] [debug] button:4 0
[2023-12-04 15:11:26.159] [logger4] [debug] button:7 1
[2023-12-04 15:11:27.470] [logger4] [debug] button:7 0
[2023-12-04 15:11:28.477] [logger4] [debug] button:5 1
[2023-12-04 15:11:28.980] [logger4] [debug] button:5 0
[2023-12-04 15:11:30.994] [logger4] [debug] button:6 1
[2023-12-04 15:11:31.500] [logger4] [debug] button:6 0
[2023-12-04 15:11:32.506] [logger4] [debug] button:6 1
[2023-12-04 15:11:33.009] [logger4] [debug] button:6 0
[2023-12-04 15:12:07.488] [logger4] [debug] Invalid IP address: 192.168.9.111:50052
[2023-12-04 15:12:11.379] [logger4] [debug] button:4 1
[2023-12-04 15:12:11.581] [logger4] [debug] button:4 0
[2023-12-04 15:12:12.185] [logger4] [debug] button:4 1
[2023-12-04 15:12:12.286] [logger4] [debug] button:4 0
[2023-12-04 15:12:12.890] [logger4] [debug] button:4 1
[2023-12-04 15:12:12.991] [logger4] [debug] button:4 0
[2023-12-04 15:12:13.495] [logger4] [debug] button:4 1
[2023-12-04 15:12:13.595] [logger4] [debug] button:4 0
[2023-12-04 15:12:14.099] [logger4] [debug] button:4 1
[2023-12-04 15:12:14.200] [logger4] [debug] button:4 0
[2023-12-04 15:12:14.703] [logger4] [debug] button:4 1
[2023-12-04 15:12:14.804] [logger4] [debug] button:4 0
[2023-12-04 15:12:15.308] [logger4] [debug] button:4 1
[2023-12-04 15:12:15.409] [logger4] [debug] button:4 0
[2023-12-04 15:12:16.013] [logger4] [debug] button:4 1
[2023-12-04 15:12:16.114] [logger4] [debug] button:4 0
[2023-12-04 15:12:22.861] [logger4] [debug] button:7 1
[2023-12-04 15:12:23.164] [logger4] [debug] button:7 0
[2023-12-04 15:12:43.408] [logger4] [debug] button:4 1
[2023-12-04 15:12:43.710] [logger4] [debug] button:4 0
[2023-12-04 15:12:44.315] [logger4] [debug] button:6 1
[2023-12-04 15:12:44.516] [logger4] [debug] button:6 0
[2023-12-04 15:12:45.020] [logger4] [debug] button:7 1
[2023-12-04 15:12:45.221] [logger4] [debug] button:7 0
[2023-12-04 15:12:45.826] [logger4] [debug] button:4 1
[2023-12-04 15:12:46.027] [logger4] [debug] button:4 0
[2023-12-04 15:12:46.430] [logger4] [debug] button:4 1
[2023-12-04 15:12:47.034] [logger4] [debug] button:4 0
[2023-12-04 15:12:48.444] [logger4] [debug] button:4 1
[2023-12-04 15:12:50.358] [logger4] [debug] button:4 0
[2023-12-04 15:12:50.458] [logger4] [debug] button:4 1
[2023-12-04 15:12:50.559] [logger4] [debug] button:4 0
[2023-12-04 15:12:50.659] [logger4] [debug] button:4 1
[2023-12-04 15:12:50.760] [logger4] [debug] button:4 0
[2023-12-04 15:12:51.365] [logger4] [debug] button:6 1
[2023-12-04 15:12:51.969] [logger4] [debug] button:6 0
[2023-12-04 15:12:52.070] [logger4] [debug] button:6 1
[2023-12-04 15:12:52.171] [logger4] [debug] button:6 0
[2023-12-04 15:12:52.876] [logger4] [debug] button:5 1
[2023-12-04 15:12:53.077] [logger4] [debug] button:5 0
[2023-12-04 15:12:53.783] [logger4] [debug] button:7 1
[2023-12-04 15:12:53.984] [logger4] [debug] button:7 0
[2023-12-04 15:12:54.488] [logger4] [debug] button:6 1
[2023-12-04 15:12:54.689] [logger4] [debug] button:6 0
[2023-12-04 15:12:55.293] [logger4] [debug] button:4 1
[2023-12-04 15:12:55.495] [logger4] [debug] button:4 0
[2023-12-04 15:12:55.998] [logger4] [debug] button:6 1
[2023-12-04 15:12:56.200] [logger4] [debug] button:6 0
[2023-12-04 15:12:56.502] [logger4] [debug] button:7 1
[2023-12-04 15:12:56.703] [logger4] [debug] button:7 0
[2023-12-04 15:12:57.711] [logger4] [debug] button:5 1
[2023-12-04 15:12:58.214] [logger4] [debug] button:5 0
[2023-12-04 15:12:58.315] [logger4] [debug] button:5 1
[2023-12-04 15:12:58.618] [logger4] [debug] button:5 0
[2023-12-04 15:12:59.524] [logger4] [debug] button:6 1
[2023-12-04 15:13:00.129] [logger4] [debug] button:6 0
[2023-12-04 15:13:00.330] [logger4] [debug] button:6 1
[2023-12-04 15:13:01.841] [logger4] [debug] button:6 0
[2023-12-04 15:13:03.957] [logger4] [debug] button:4 1
[2023-12-04 15:13:04.158] [logger4] [debug] button:4 0
[2023-12-04 15:13:05.668] [logger4] [debug] button:7 1
[2023-12-04 15:13:06.070] [logger4] [debug] button:7 0
[2023-12-04 15:13:06.473] [logger4] [debug] button:5 1
[2023-12-04 15:13:06.776] [logger4] [debug] button:5 0
[2023-12-04 15:13:07.078] [logger4] [debug] button:5 1
[2023-12-04 15:13:07.279] [logger4] [debug] button:5 0
[2023-12-04 15:13:07.783] [logger4] [debug] button:7 1
[2023-12-04 15:13:07.883] [logger4] [debug] button:7 0
[2023-12-04 15:13:08.388] [logger4] [debug] button:7 1
[2023-12-04 15:13:08.589] [logger4] [debug] button:7 0
[2023-12-04 15:13:08.891] [logger4] [debug] button:6 1
[2023-12-04 15:13:09.092] [logger4] [debug] button:6 0
[2023-12-04 15:17:07.620] [logger4] [debug] Invalid IP address: 192.168.9.111:50052
[2023-12-04 15:17:21.753] [logger4] [debug] button:7 1
[2023-12-04 15:17:21.879] [logger4] [debug] button:7 0
[2023-12-04 15:17:22.005] [logger4] [debug] button:7 1
[2023-12-04 15:17:22.130] [logger4] [debug] button:7 0
[2023-12-04 15:17:22.402] [logger4] [debug] button:6 1
[2023-12-04 15:17:22.569] [logger4] [debug] button:6 0
[2023-12-04 15:17:22.612] [logger4] [debug] button:6 1
[2023-12-04 15:17:22.779] [logger4] [debug] button:6 0
[2023-12-04 15:17:22.947] [logger4] [debug] button:4 1
[2023-12-04 15:17:23.072] [logger4] [debug] button:4 0
[2023-12-04 15:17:23.198] [logger4] [debug] button:4 1
[2023-12-04 15:17:23.324] [logger4] [debug] button:4 0
[2023-12-04 15:29:14.039] [logger4] [debug] Invalid IP address: 192.168.9.111:50052
[2023-12-04 16:51:41.864] [logger4] [debug] Invalid IP address: 192.168.9.111:50052
[2023-12-04 18:26:40.552] [logger4] [debug] [bulldozer]:_udp_socket port:18855
[2023-12-04 18:26:40.867] [logger4] [debug] Invalid IP address: 192.168.9.111:50052
[2023-12-04 18:34:39.913] [logger4] [debug] [bulldozer]:_udp_socket port:18855
[2023-12-04 18:34:40.201] [logger4] [debug] Invalid IP address: 192.168.9.111:50052
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论