提交 a3d350f5 authored 作者: 陈泽健's avatar 陈泽健

feat(Mqtt): 增加客户端 ID 并优化连接逻辑 增加批量更新模拟脚本- 在 Mqtt 类的构造函数中添加 client_id 参数

- 在连接 MQTT 服务器时指定客户端 ID
- 设置 will 消息,当客户端断连时自动发送 disconnect 消息
- 优化异常处理和日志记录
上级 3ff00d54
topic,clientId,appToken,companyNumber,cnum,conferenceId,macAddress,authCode,clientId,deviceId
rebootResponseTopic,48134e6047a19a0001,AND-518-0001,CN-518-UBAINS,,101,20:59:20:00:28:01,AND-518-0001,48134e6047a19a0001,aa44e258a4e1e0001
rebootResponseTopic,48134e6047a19a0002,AND-518-0002,CN-518-UBAINS,,102,20:59:20:00:28:01,AND-518-0002,48134e6047a19a0002,aa44e258a4e1e0002
rebootResponseTopic,48134e6047a19a0003,AND-518-0003,CN-518-UBAINS,,103,20:59:20:00:28:01,AND-518-0003,48134e6047a19a0003,aa44e258a4e1e0003
rebootResponseTopic,48134e6047a19a0004,AND-518-0004,CN-518-UBAINS,,104,20:59:20:00:28:01,AND-518-0004,48134e6047a19a0004,aa44e258a4e1e0004
rebootResponseTopic,48134e6047a19a0005,AND-518-0005,CN-518-UBAINS,,105,20:59:20:00:28:01,AND-518-0005,48134e6047a19a0005,aa44e258a4e1e0005
rebootResponseTopic,48134e6047a19a0006,AND-518-0006,CN-518-UBAINS,,106,20:59:20:00:28:01,AND-518-0006,48134e6047a19a0006,aa44e258a4e1e0006
rebootResponseTopic,48134e6047a19a0007,AND-518-0007,CN-518-UBAINS,,107,20:59:20:00:28:01,AND-518-0007,48134e6047a19a0007,aa44e258a4e1e0007
rebootResponseTopic,48134e6047a19a0008,AND-518-0008,CN-518-UBAINS,,108,20:59:20:00:28:01,AND-518-0008,48134e6047a19a0008,aa44e258a4e1e0008
rebootResponseTopic,48134e6047a19a0009,AND-518-0009,CN-518-UBAINS,,109,20:59:20:00:28:01,AND-518-0009,48134e6047a19a0009,aa44e258a4e1e0009
rebootResponseTopic,48134e6047a19a0010,AND-518-0010,CN-518-UBAINS,,110,20:59:20:00:28:01,AND-518-0010,48134e6047a19a0010,aa44e258a4e1e0010
rebootResponseTopic,48134e6047a19a0011,AND-518-0011,CN-518-UBAINS,,111,20:59:20:00:28:01,AND-518-0011,48134e6047a19a0011,aa44e258a4e1e0011
rebootResponseTopic,48134e6047a19a0012,AND-518-0012,CN-518-UBAINS,,112,20:59:20:00:28:01,AND-518-0012,48134e6047a19a0012,aa44e258a4e1e0012
rebootResponseTopic,48134e6047a19a0013,AND-518-0013,CN-518-UBAINS,,113,20:59:20:00:28:01,AND-518-0013,48134e6047a19a0013,aa44e258a4e1e0013
rebootResponseTopic,48134e6047a19a0014,AND-518-0014,CN-518-UBAINS,,114,20:59:20:00:28:01,AND-518-0014,48134e6047a19a0014,aa44e258a4e1e0014
rebootResponseTopic,48134e6047a19a0015,AND-518-0015,CN-518-UBAINS,,115,20:59:20:00:28:01,AND-518-0015,48134e6047a19a0015,aa44e258a4e1e0015
rebootResponseTopic,48134e6047a19a0016,AND-518-0016,CN-518-UBAINS,,116,20:59:20:00:28:01,AND-518-0016,48134e6047a19a0016,aa44e258a4e1e0016
rebootResponseTopic,48134e6047a19a0017,AND-518-0017,CN-518-UBAINS,,117,20:59:20:00:28:01,AND-518-0017,48134e6047a19a0017,aa44e258a4e1e0017
rebootResponseTopic,48134e6047a19a0018,AND-518-0018,CN-518-UBAINS,,118,20:59:20:00:28:01,AND-518-0018,48134e6047a19a0018,aa44e258a4e1e0018
rebootResponseTopic,48134e6047a19a0019,AND-518-0019,CN-518-UBAINS,,119,20:59:20:00:28:01,AND-518-0019,48134e6047a19a0019,aa44e258a4e1e0019
rebootResponseTopic,48134e6047a19a0020,AND-518-0020,CN-518-UBAINS,,120,20:59:20:00:28:01,AND-518-0020,48134e6047a19a0020,aa44e258a4e1e0020
rebootResponseTopic,48134e6047a19a0021,AND-518-0021,CN-518-UBAINS,,121,20:59:20:00:28:01,AND-518-0021,48134e6047a19a0021,aa44e258a4e1e0021
rebootResponseTopic,48134e6047a19a0022,AND-518-0022,CN-518-UBAINS,,122,20:59:20:00:28:01,AND-518-0022,48134e6047a19a0022,aa44e258a4e1e0022
rebootResponseTopic,48134e6047a19a0023,AND-518-0023,CN-518-UBAINS,,123,20:59:20:00:28:01,AND-518-0023,48134e6047a19a0023,aa44e258a4e1e0023
rebootResponseTopic,48134e6047a19a0024,AND-518-0024,CN-518-UBAINS,,124,20:59:20:00:28:01,AND-518-0024,48134e6047a19a0024,aa44e258a4e1e0024
rebootResponseTopic,48134e6047a19a0025,AND-518-0025,CN-518-UBAINS,,125,20:59:20:00:28:01,AND-518-0025,48134e6047a19a0025,aa44e258a4e1e0025
rebootResponseTopic,48134e6047a19a0026,AND-518-0026,CN-518-UBAINS,,126,20:59:20:00:28:01,AND-518-0026,48134e6047a19a0026,aa44e258a4e1e0026
rebootResponseTopic,48134e6047a19a0027,AND-518-0027,CN-518-UBAINS,,127,20:59:20:00:28:01,AND-518-0027,48134e6047a19a0027,aa44e258a4e1e0027
rebootResponseTopic,48134e6047a19a0028,AND-518-0028,CN-518-UBAINS,,128,20:59:20:00:28:01,AND-518-0028,48134e6047a19a0028,aa44e258a4e1e0028
rebootResponseTopic,48134e6047a19a0029,AND-518-0029,CN-518-UBAINS,,129,20:59:20:00:28:01,AND-518-0029,48134e6047a19a0029,aa44e258a4e1e0029
rebootResponseTopic,48134e6047a19a0030,AND-518-0030,CN-518-UBAINS,,130,20:59:20:00:28:01,AND-518-0030,48134e6047a19a0030,aa44e258a4e1e0030
rebootResponseTopic,48134e6047a19a0031,AND-518-0031,CN-518-UBAINS,,131,20:59:20:00:28:01,AND-518-0031,48134e6047a19a0031,aa44e258a4e1e0031
rebootResponseTopic,48134e6047a19a0032,AND-518-0032,CN-518-UBAINS,,132,20:59:20:00:28:01,AND-518-0032,48134e6047a19a0032,aa44e258a4e1e0032
rebootResponseTopic,48134e6047a19a0033,AND-518-0033,CN-518-UBAINS,,133,20:59:20:00:28:01,AND-518-0033,48134e6047a19a0033,aa44e258a4e1e0033
rebootResponseTopic,48134e6047a19a0034,AND-518-0034,CN-518-UBAINS,,134,20:59:20:00:28:01,AND-518-0034,48134e6047a19a0034,aa44e258a4e1e0034
rebootResponseTopic,48134e6047a19a0035,AND-518-0035,CN-518-UBAINS,,135,20:59:20:00:28:01,AND-518-0035,48134e6047a19a0035,aa44e258a4e1e0035
rebootResponseTopic,48134e6047a19a0036,AND-518-0036,CN-518-UBAINS,,136,20:59:20:00:28:01,AND-518-0036,48134e6047a19a0036,aa44e258a4e1e0036
rebootResponseTopic,48134e6047a19a0037,AND-518-0037,CN-518-UBAINS,,137,20:59:20:00:28:01,AND-518-0037,48134e6047a19a0037,aa44e258a4e1e0037
rebootResponseTopic,48134e6047a19a0038,AND-518-0038,CN-518-UBAINS,,138,20:59:20:00:28:01,AND-518-0038,48134e6047a19a0038,aa44e258a4e1e0038
rebootResponseTopic,48134e6047a19a0039,AND-518-0039,CN-518-UBAINS,,139,20:59:20:00:28:01,AND-518-0039,48134e6047a19a0039,aa44e258a4e1e0039
rebootResponseTopic,48134e6047a19a0040,AND-518-0040,CN-518-UBAINS,,140,20:59:20:00:28:01,AND-518-0040,48134e6047a19a0040,aa44e258a4e1e0040
rebootResponseTopic,48134e6047a19a0041,AND-518-0041,CN-518-UBAINS,,141,20:59:20:00:28:01,AND-518-0041,48134e6047a19a0041,aa44e258a4e1e0041
rebootResponseTopic,48134e6047a19a0042,AND-518-0042,CN-518-UBAINS,,142,20:59:20:00:28:01,AND-518-0042,48134e6047a19a0042,aa44e258a4e1e0042
rebootResponseTopic,48134e6047a19a0043,AND-518-0043,CN-518-UBAINS,,143,20:59:20:00:28:01,AND-518-0043,48134e6047a19a0043,aa44e258a4e1e0043
rebootResponseTopic,48134e6047a19a0044,AND-518-0044,CN-518-UBAINS,,144,20:59:20:00:28:01,AND-518-0044,48134e6047a19a0044,aa44e258a4e1e0044
rebootResponseTopic,48134e6047a19a0045,AND-518-0045,CN-518-UBAINS,,145,20:59:20:00:28:01,AND-518-0045,48134e6047a19a0045,aa44e258a4e1e0045
rebootResponseTopic,48134e6047a19a0046,AND-518-0046,CN-518-UBAINS,,146,20:59:20:00:28:01,AND-518-0046,48134e6047a19a0046,aa44e258a4e1e0046
rebootResponseTopic,48134e6047a19a0047,AND-518-0047,CN-518-UBAINS,,147,20:59:20:00:28:01,AND-518-0047,48134e6047a19a0047,aa44e258a4e1e0047
rebootResponseTopic,48134e6047a19a0048,AND-518-0048,CN-518-UBAINS,,148,20:59:20:00:28:01,AND-518-0048,48134e6047a19a0048,aa44e258a4e1e0048
rebootResponseTopic,48134e6047a19a0049,AND-518-0049,CN-518-UBAINS,,149,20:59:20:00:28:01,AND-518-0049,48134e6047a19a0049,aa44e258a4e1e0049
rebootResponseTopic,48134e6047a19a0050,AND-518-0050,CN-518-UBAINS,,150,20:59:20:00:28:01,AND-518-0050,48134e6047a19a0050,aa44e258a4e1e0050
rebootResponseTopic,48134e6047a19a0051,AND-518-0051,CN-518-UBAINS,,151,20:59:20:00:28:01,AND-518-0051,48134e6047a19a0051,aa44e258a4e1e0051
rebootResponseTopic,48134e6047a19a0052,AND-518-0052,CN-518-UBAINS,,152,20:59:20:00:28:01,AND-518-0052,48134e6047a19a0052,aa44e258a4e1e0052
rebootResponseTopic,48134e6047a19a0053,AND-518-0053,CN-518-UBAINS,,153,20:59:20:00:28:01,AND-518-0053,48134e6047a19a0053,aa44e258a4e1e0053
rebootResponseTopic,48134e6047a19a0054,AND-518-0054,CN-518-UBAINS,,154,20:59:20:00:28:01,AND-518-0054,48134e6047a19a0054,aa44e258a4e1e0054
rebootResponseTopic,48134e6047a19a0055,AND-518-0055,CN-518-UBAINS,,155,20:59:20:00:28:01,AND-518-0055,48134e6047a19a0055,aa44e258a4e1e0055
rebootResponseTopic,48134e6047a19a0056,AND-518-0056,CN-518-UBAINS,,156,20:59:20:00:28:01,AND-518-0056,48134e6047a19a0056,aa44e258a4e1e0056
rebootResponseTopic,48134e6047a19a0057,AND-518-0057,CN-518-UBAINS,,157,20:59:20:00:28:01,AND-518-0057,48134e6047a19a0057,aa44e258a4e1e0057
rebootResponseTopic,48134e6047a19a0058,AND-518-0058,CN-518-UBAINS,,158,20:59:20:00:28:01,AND-518-0058,48134e6047a19a0058,aa44e258a4e1e0058
rebootResponseTopic,48134e6047a19a0059,AND-518-0059,CN-518-UBAINS,,159,20:59:20:00:28:01,AND-518-0059,48134e6047a19a0059,aa44e258a4e1e0059
rebootResponseTopic,48134e6047a19a0060,AND-518-0060,CN-518-UBAINS,,160,20:59:20:00:28:01,AND-518-0060,48134e6047a19a0060,aa44e258a4e1e0060
rebootResponseTopic,48134e6047a19a0061,AND-518-0061,CN-518-UBAINS,,161,20:59:20:00:28:01,AND-518-0061,48134e6047a19a0061,aa44e258a4e1e0061
rebootResponseTopic,48134e6047a19a0062,AND-518-0062,CN-518-UBAINS,,162,20:59:20:00:28:01,AND-518-0062,48134e6047a19a0062,aa44e258a4e1e0062
rebootResponseTopic,48134e6047a19a0063,AND-518-0063,CN-518-UBAINS,,163,20:59:20:00:28:01,AND-518-0063,48134e6047a19a0063,aa44e258a4e1e0063
rebootResponseTopic,48134e6047a19a0064,AND-518-0064,CN-518-UBAINS,,164,20:59:20:00:28:01,AND-518-0064,48134e6047a19a0064,aa44e258a4e1e0064
rebootResponseTopic,48134e6047a19a0065,AND-518-0065,CN-518-UBAINS,,165,20:59:20:00:28:01,AND-518-0065,48134e6047a19a0065,aa44e258a4e1e0065
rebootResponseTopic,48134e6047a19a0066,AND-518-0066,CN-518-UBAINS,,166,20:59:20:00:28:01,AND-518-0066,48134e6047a19a0066,aa44e258a4e1e0066
rebootResponseTopic,48134e6047a19a0067,AND-518-0067,CN-518-UBAINS,,167,20:59:20:00:28:01,AND-518-0067,48134e6047a19a0067,aa44e258a4e1e0067
rebootResponseTopic,48134e6047a19a0068,AND-518-0068,CN-518-UBAINS,,168,20:59:20:00:28:01,AND-518-0068,48134e6047a19a0068,aa44e258a4e1e0068
rebootResponseTopic,48134e6047a19a0069,AND-518-0069,CN-518-UBAINS,,169,20:59:20:00:28:01,AND-518-0069,48134e6047a19a0069,aa44e258a4e1e0069
rebootResponseTopic,48134e6047a19a0070,AND-518-0070,CN-518-UBAINS,,170,20:59:20:00:28:01,AND-518-0070,48134e6047a19a0070,aa44e258a4e1e0070
rebootResponseTopic,48134e6047a19a0071,AND-518-0071,CN-518-UBAINS,,171,20:59:20:00:28:01,AND-518-0071,48134e6047a19a0071,aa44e258a4e1e0071
rebootResponseTopic,48134e6047a19a0072,AND-518-0072,CN-518-UBAINS,,172,20:59:20:00:28:01,AND-518-0072,48134e6047a19a0072,aa44e258a4e1e0072
rebootResponseTopic,48134e6047a19a0073,AND-518-0073,CN-518-UBAINS,,173,20:59:20:00:28:01,AND-518-0073,48134e6047a19a0073,aa44e258a4e1e0073
rebootResponseTopic,48134e6047a19a0074,AND-518-0074,CN-518-UBAINS,,174,20:59:20:00:28:01,AND-518-0074,48134e6047a19a0074,aa44e258a4e1e0074
rebootResponseTopic,48134e6047a19a0075,AND-518-0075,CN-518-UBAINS,,175,20:59:20:00:28:01,AND-518-0075,48134e6047a19a0075,aa44e258a4e1e0075
rebootResponseTopic,48134e6047a19a0076,AND-518-0076,CN-518-UBAINS,,176,20:59:20:00:28:01,AND-518-0076,48134e6047a19a0076,aa44e258a4e1e0076
rebootResponseTopic,48134e6047a19a0077,AND-518-0077,CN-518-UBAINS,,177,20:59:20:00:28:01,AND-518-0077,48134e6047a19a0077,aa44e258a4e1e0077
rebootResponseTopic,48134e6047a19a0078,AND-518-0078,CN-518-UBAINS,,178,20:59:20:00:28:01,AND-518-0078,48134e6047a19a0078,aa44e258a4e1e0078
rebootResponseTopic,48134e6047a19a0079,AND-518-0079,CN-518-UBAINS,,179,20:59:20:00:28:01,AND-518-0079,48134e6047a19a0079,aa44e258a4e1e0079
rebootResponseTopic,48134e6047a19a0080,AND-518-0080,CN-518-UBAINS,,180,20:59:20:00:28:01,AND-518-0080,48134e6047a19a0080,aa44e258a4e1e0080
rebootResponseTopic,48134e6047a19a0081,AND-518-0081,CN-518-UBAINS,,181,20:59:20:00:28:01,AND-518-0081,48134e6047a19a0081,aa44e258a4e1e0081
rebootResponseTopic,48134e6047a19a0082,AND-518-0082,CN-518-UBAINS,,182,20:59:20:00:28:01,AND-518-0082,48134e6047a19a0082,aa44e258a4e1e0082
rebootResponseTopic,48134e6047a19a0083,AND-518-0083,CN-518-UBAINS,,183,20:59:20:00:28:01,AND-518-0083,48134e6047a19a0083,aa44e258a4e1e0083
rebootResponseTopic,48134e6047a19a0084,AND-518-0084,CN-518-UBAINS,,184,20:59:20:00:28:01,AND-518-0084,48134e6047a19a0084,aa44e258a4e1e0084
rebootResponseTopic,48134e6047a19a0085,AND-518-0085,CN-518-UBAINS,,185,20:59:20:00:28:01,AND-518-0085,48134e6047a19a0085,aa44e258a4e1e0085
rebootResponseTopic,48134e6047a19a0086,AND-518-0086,CN-518-UBAINS,,186,20:59:20:00:28:01,AND-518-0086,48134e6047a19a0086,aa44e258a4e1e0086
rebootResponseTopic,48134e6047a19a0087,AND-518-0087,CN-518-UBAINS,,187,20:59:20:00:28:01,AND-518-0087,48134e6047a19a0087,aa44e258a4e1e0087
rebootResponseTopic,48134e6047a19a0088,AND-518-0088,CN-518-UBAINS,,188,20:59:20:00:28:01,AND-518-0088,48134e6047a19a0088,aa44e258a4e1e0088
rebootResponseTopic,48134e6047a19a0089,AND-518-0089,CN-518-UBAINS,,189,20:59:20:00:28:01,AND-518-0089,48134e6047a19a0089,aa44e258a4e1e0089
rebootResponseTopic,48134e6047a19a0090,AND-518-0090,CN-518-UBAINS,,190,20:59:20:00:28:01,AND-518-0090,48134e6047a19a0090,aa44e258a4e1e0090
rebootResponseTopic,48134e6047a19a0091,AND-518-0091,CN-518-UBAINS,,191,20:59:20:00:28:01,AND-518-0091,48134e6047a19a0091,aa44e258a4e1e0091
rebootResponseTopic,48134e6047a19a0092,AND-518-0092,CN-518-UBAINS,,192,20:59:20:00:28:01,AND-518-0092,48134e6047a19a0092,aa44e258a4e1e0092
rebootResponseTopic,48134e6047a19a0093,AND-518-0093,CN-518-UBAINS,,193,20:59:20:00:28:01,AND-518-0093,48134e6047a19a0093,aa44e258a4e1e0093
rebootResponseTopic,48134e6047a19a0094,AND-518-0094,CN-518-UBAINS,,194,20:59:20:00:28:01,AND-518-0094,48134e6047a19a0094,aa44e258a4e1e0094
rebootResponseTopic,48134e6047a19a0095,AND-518-0095,CN-518-UBAINS,,195,20:59:20:00:28:01,AND-518-0095,48134e6047a19a0095,aa44e258a4e1e0095
rebootResponseTopic,48134e6047a19a0096,AND-518-0096,CN-518-UBAINS,,196,20:59:20:00:28:01,AND-518-0096,48134e6047a19a0096,aa44e258a4e1e0096
rebootResponseTopic,48134e6047a19a0097,AND-518-0097,CN-518-UBAINS,,197,20:59:20:00:28:01,AND-518-0097,48134e6047a19a0097,aa44e258a4e1e0097
rebootResponseTopic,48134e6047a19a0098,AND-518-0098,CN-518-UBAINS,,198,20:59:20:00:28:01,AND-518-0098,48134e6047a19a0098,aa44e258a4e1e0098
rebootResponseTopic,48134e6047a19a0099,AND-518-0099,CN-518-UBAINS,,199,20:59:20:00:28:01,AND-518-0099,48134e6047a19a0099,aa44e258a4e1e0099
rebootResponseTopic,48134e6047a19a0100,AND-518-0100,CN-518-UBAINS,,200,20:59:20:00:28:01,AND-518-0100,48134e6047a19a0100,aa44e258a4e1e0100
rebootResponseTopic,48134e6047a19a0101,AND-518-0101,CN-518-UBAINS,,201,20:59:20:00:28:01,AND-518-0101,48134e6047a19a0101,aa44e258a4e1e0101
\ No newline at end of file
topic,clientId,appToken,companyNumber,cnum,conferenceId,macAddress,authCode,clientId,deviceId
/uams/android/broadcast,,,,,,,,48134e6047a19a0001,aa44e258a4e1e0001
/uams/android/broadcast,,,,,,,,48134e6047a19a0002,aa44e258a4e1e0002
/uams/android/broadcast,,,,,,,,48134e6047a19a0003,aa44e258a4e1e0003
/uams/android/broadcast,,,,,,,,48134e6047a19a0004,aa44e258a4e1e0004
/uams/android/broadcast,,,,,,,,48134e6047a19a0005,aa44e258a4e1e0005
/uams/android/broadcast,,,,,,,,48134e6047a19a0006,aa44e258a4e1e0006
/uams/android/broadcast,,,,,,,,48134e6047a19a0007,aa44e258a4e1e0007
/uams/android/broadcast,,,,,,,,48134e6047a19a0008,aa44e258a4e1e0008
/uams/android/broadcast,,,,,,,,48134e6047a19a0009,aa44e258a4e1e0009
/uams/android/broadcast,,,,,,,,48134e6047a19a0010,aa44e258a4e1e0010
/uams/android/broadcast,,,,,,,,48134e6047a19a0011,aa44e258a4e1e0011
/uams/android/broadcast,,,,,,,,48134e6047a19a0012,aa44e258a4e1e0012
/uams/android/broadcast,,,,,,,,48134e6047a19a0013,aa44e258a4e1e0013
/uams/android/broadcast,,,,,,,,48134e6047a19a0014,aa44e258a4e1e0014
/uams/android/broadcast,,,,,,,,48134e6047a19a0015,aa44e258a4e1e0015
/uams/android/broadcast,,,,,,,,48134e6047a19a0016,aa44e258a4e1e0016
/uams/android/broadcast,,,,,,,,48134e6047a19a0017,aa44e258a4e1e0017
/uams/android/broadcast,,,,,,,,48134e6047a19a0018,aa44e258a4e1e0018
/uams/android/broadcast,,,,,,,,48134e6047a19a0019,aa44e258a4e1e0019
/uams/android/broadcast,,,,,,,,48134e6047a19a0020,aa44e258a4e1e0020
/uams/android/broadcast,,,,,,,,48134e6047a19a0021,aa44e258a4e1e0021
/uams/android/broadcast,,,,,,,,48134e6047a19a0022,aa44e258a4e1e0022
/uams/android/broadcast,,,,,,,,48134e6047a19a0023,aa44e258a4e1e0023
/uams/android/broadcast,,,,,,,,48134e6047a19a0024,aa44e258a4e1e0024
/uams/android/broadcast,,,,,,,,48134e6047a19a0025,aa44e258a4e1e0025
/uams/android/broadcast,,,,,,,,48134e6047a19a0026,aa44e258a4e1e0026
/uams/android/broadcast,,,,,,,,48134e6047a19a0027,aa44e258a4e1e0027
/uams/android/broadcast,,,,,,,,48134e6047a19a0028,aa44e258a4e1e0028
/uams/android/broadcast,,,,,,,,48134e6047a19a0029,aa44e258a4e1e0029
/uams/android/broadcast,,,,,,,,48134e6047a19a0030,aa44e258a4e1e0030
/uams/android/broadcast,,,,,,,,48134e6047a19a0031,aa44e258a4e1e0031
/uams/android/broadcast,,,,,,,,48134e6047a19a0032,aa44e258a4e1e0032
/uams/android/broadcast,,,,,,,,48134e6047a19a0033,aa44e258a4e1e0033
/uams/android/broadcast,,,,,,,,48134e6047a19a0034,aa44e258a4e1e0034
/uams/android/broadcast,,,,,,,,48134e6047a19a0035,aa44e258a4e1e0035
/uams/android/broadcast,,,,,,,,48134e6047a19a0036,aa44e258a4e1e0036
/uams/android/broadcast,,,,,,,,48134e6047a19a0037,aa44e258a4e1e0037
/uams/android/broadcast,,,,,,,,48134e6047a19a0038,aa44e258a4e1e0038
/uams/android/broadcast,,,,,,,,48134e6047a19a0039,aa44e258a4e1e0039
/uams/android/broadcast,,,,,,,,48134e6047a19a0040,aa44e258a4e1e0040
/uams/android/broadcast,,,,,,,,48134e6047a19a0041,aa44e258a4e1e0041
/uams/android/broadcast,,,,,,,,48134e6047a19a0042,aa44e258a4e1e0042
/uams/android/broadcast,,,,,,,,48134e6047a19a0043,aa44e258a4e1e0043
/uams/android/broadcast,,,,,,,,48134e6047a19a0044,aa44e258a4e1e0044
/uams/android/broadcast,,,,,,,,48134e6047a19a0045,aa44e258a4e1e0045
/uams/android/broadcast,,,,,,,,48134e6047a19a0046,aa44e258a4e1e0046
/uams/android/broadcast,,,,,,,,48134e6047a19a0047,aa44e258a4e1e0047
/uams/android/broadcast,,,,,,,,48134e6047a19a0048,aa44e258a4e1e0048
/uams/android/broadcast,,,,,,,,48134e6047a19a0049,aa44e258a4e1e0049
/uams/android/broadcast,,,,,,,,48134e6047a19a0050,aa44e258a4e1e0050
/uams/android/broadcast,,,,,,,,48134e6047a19a0051,aa44e258a4e1e0051
/uams/android/broadcast,,,,,,,,48134e6047a19a0052,aa44e258a4e1e0052
/uams/android/broadcast,,,,,,,,48134e6047a19a0053,aa44e258a4e1e0053
/uams/android/broadcast,,,,,,,,48134e6047a19a0054,aa44e258a4e1e0054
/uams/android/broadcast,,,,,,,,48134e6047a19a0055,aa44e258a4e1e0055
/uams/android/broadcast,,,,,,,,48134e6047a19a0056,aa44e258a4e1e0056
/uams/android/broadcast,,,,,,,,48134e6047a19a0057,aa44e258a4e1e0057
/uams/android/broadcast,,,,,,,,48134e6047a19a0058,aa44e258a4e1e0058
/uams/android/broadcast,,,,,,,,48134e6047a19a0059,aa44e258a4e1e0059
/uams/android/broadcast,,,,,,,,48134e6047a19a0060,aa44e258a4e1e0060
/uams/android/broadcast,,,,,,,,48134e6047a19a0061,aa44e258a4e1e0061
/uams/android/broadcast,,,,,,,,48134e6047a19a0062,aa44e258a4e1e0062
/uams/android/broadcast,,,,,,,,48134e6047a19a0063,aa44e258a4e1e0063
/uams/android/broadcast,,,,,,,,48134e6047a19a0064,aa44e258a4e1e0064
/uams/android/broadcast,,,,,,,,48134e6047a19a0065,aa44e258a4e1e0065
/uams/android/broadcast,,,,,,,,48134e6047a19a0066,aa44e258a4e1e0066
/uams/android/broadcast,,,,,,,,48134e6047a19a0067,aa44e258a4e1e0067
/uams/android/broadcast,,,,,,,,48134e6047a19a0068,aa44e258a4e1e0068
/uams/android/broadcast,,,,,,,,48134e6047a19a0069,aa44e258a4e1e0069
/uams/android/broadcast,,,,,,,,48134e6047a19a0070,aa44e258a4e1e0070
/uams/android/broadcast,,,,,,,,48134e6047a19a0071,aa44e258a4e1e0071
/uams/android/broadcast,,,,,,,,48134e6047a19a0072,aa44e258a4e1e0072
/uams/android/broadcast,,,,,,,,48134e6047a19a0073,aa44e258a4e1e0073
/uams/android/broadcast,,,,,,,,48134e6047a19a0074,aa44e258a4e1e0074
/uams/android/broadcast,,,,,,,,48134e6047a19a0075,aa44e258a4e1e0075
/uams/android/broadcast,,,,,,,,48134e6047a19a0076,aa44e258a4e1e0076
/uams/android/broadcast,,,,,,,,48134e6047a19a0077,aa44e258a4e1e0077
/uams/android/broadcast,,,,,,,,48134e6047a19a0078,aa44e258a4e1e0078
/uams/android/broadcast,,,,,,,,48134e6047a19a0079,aa44e258a4e1e0079
/uams/android/broadcast,,,,,,,,48134e6047a19a0080,aa44e258a4e1e0080
/uams/android/broadcast,,,,,,,,48134e6047a19a0081,aa44e258a4e1e0081
/uams/android/broadcast,,,,,,,,48134e6047a19a0082,aa44e258a4e1e0082
/uams/android/broadcast,,,,,,,,48134e6047a19a0083,aa44e258a4e1e0083
/uams/android/broadcast,,,,,,,,48134e6047a19a0084,aa44e258a4e1e0084
/uams/android/broadcast,,,,,,,,48134e6047a19a0085,aa44e258a4e1e0085
/uams/android/broadcast,,,,,,,,48134e6047a19a0086,aa44e258a4e1e0086
/uams/android/broadcast,,,,,,,,48134e6047a19a0087,aa44e258a4e1e0087
/uams/android/broadcast,,,,,,,,48134e6047a19a0088,aa44e258a4e1e0088
/uams/android/broadcast,,,,,,,,48134e6047a19a0089,aa44e258a4e1e0089
/uams/android/broadcast,,,,,,,,48134e6047a19a0090,aa44e258a4e1e0090
/uams/android/broadcast,,,,,,,,48134e6047a19a0091,aa44e258a4e1e0091
/uams/android/broadcast,,,,,,,,48134e6047a19a0092,aa44e258a4e1e0092
/uams/android/broadcast,,,,,,,,48134e6047a19a0093,aa44e258a4e1e0093
/uams/android/broadcast,,,,,,,,48134e6047a19a0094,aa44e258a4e1e0094
/uams/android/broadcast,,,,,,,,48134e6047a19a0095,aa44e258a4e1e0095
/uams/android/broadcast,,,,,,,,48134e6047a19a0096,aa44e258a4e1e0096
/uams/android/broadcast,,,,,,,,48134e6047a19a0097,aa44e258a4e1e0097
/uams/android/broadcast,,,,,,,,48134e6047a19a0098,aa44e258a4e1e0098
/uams/android/broadcast,,,,,,,,48134e6047a19a0099,aa44e258a4e1e0099
/uams/android/broadcast,,,,,,,,48134e6047a19a0100,aa44e258a4e1e0100
/uams/android/broadcast,,,,,,,,48134e6047a19a0101,aa44e258a4e1e0101
\ No newline at end of file
import paho.mqtt.client as mqtt
import logging
import threading
import requests
import json
import os
import time
from queue import Queue
from tqdm.auto import tqdm # 使用auto版本自动适配环境
import urllib3
# 禁用SSL警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 确保日志级别设置为INFO或更低
logging.basicConfig(
level=logging.INFO, # 确保不是 logging.WARNING 或更高
format='%(asctime)s - %(levelname)s - %(message)s'
)
# 全局配置
message_queue = Queue()
THREAD_COUNT = 5 # 减少线程数量便于观察进度
DOWNLOAD_DIR = "downloads"
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
def test_progress():
"""测试进度显示"""
logging.info("\n=== 进度测试 ===")
for i in range(1, 11):
time.sleep(0.2)
logging.info(f"测试进度: {i * 10}%")
logging.info("=== 测试完成 ===\n")
def on_connect(client, userdata, flags, rc):
logging.info("MQTT连接成功")
client.subscribe("/androidPanel/")
def on_message(client, userdata, msg):
try:
payload = json.loads(msg.payload.decode())
message_queue.put(payload)
logging.info(f"消息已加入队列: UDID={payload['udid'][0]}")
except Exception as e:
logging.error(f"消息解析失败: {e}")
def download_file(url, save_path, desc="Downloading", max_retries=3, retry_delay=5):
"""增强版文件下载,支持断点续传和重试"""
for attempt in range(max_retries):
try:
# 断点续传处理
file_size = 0
if os.path.exists(save_path):
file_size = os.path.getsize(save_path)
logging.info(f"发现未完成下载文件,尝试续传: {save_path} (已下载: {file_size / 1024 / 1024:.2f}MB)")
headers = {'Range': f'bytes={file_size}-'} if file_size else {}
# 打印调试信息
logging.info(f"\n开始下载: {url}")
logging.info(f"保存路径: {os.path.abspath(save_path)}")
logging.info(f"已下载: {file_size / 1024 / 1024:.2f}MB")
with requests.get(
url,
headers=headers,
stream=True,
verify=False,
timeout=(30, 300)
) as r:
r.raise_for_status()
# 获取文件总大小
total_size = int(r.headers.get('content-length', 0)) + file_size
if total_size == 0:
raise ValueError("无法获取文件总大小")
logging.info(f"总大小: {total_size / 1024 / 1024:.2f}MB")
logging.info(f"创建时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
mode = 'ab' if file_size else 'wb'
downloaded = file_size
last_update = time.time()
with open(save_path, mode) as f:
# 测试文件可写性
test_data = b"file_header_test"
f.write(test_data)
f.flush()
os.fsync(f.fileno())
logging.info(f"文件写入测试成功,当前大小: {os.path.getsize(save_path)} bytes")
for chunk in r.iter_content(chunk_size=8192):
if chunk:
# 写入文件并立即同步到磁盘
f.write(chunk)
f.flush()
os.fsync(f.fileno())
downloaded += len(chunk)
# 实时打印文件状态
current_size = os.path.getsize(save_path)
logging.info(f"\r当前文件大小: {current_size} bytes ({current_size / 1024 / 1024:.2f}MB)", end="",
flush=True)
# 进度显示
if time.time() - last_update >= 0.1:
percent = (downloaded / total_size) * 100
speed = (downloaded - file_size) / (time.time() - last_update) / 1024
logging.info(f"\n{desc} 进度: {percent:.1f}% | 速度: {speed:.1f}KB/s")
last_update = time.time()
# 最终验证
final_size = os.path.getsize(save_path)
logging.info(f"\n下载完成! 最终文件大小: {final_size} bytes")
if final_size != total_size:
raise ValueError(f"文件大小不匹配: {final_size} != {total_size}")
return True
except Exception as e:
logging.exception(f"下载失败 (尝试 {attempt + 1}/{max_retries}): {str(e)}")
if attempt < max_retries - 1:
time.sleep(retry_delay * (attempt + 1))
continue
return False
def worker_thread():
"""工作线程函数"""
while True:
payload = message_queue.get()
try:
# 从MQTT消息获取动态参数
actual_auth = payload["headers"]["Authorization"]
udid = payload["udid"][0]
# 构建请求参数
url = "http://192.168.5.229:8999/androidPanel/pack/download?id=30"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization': actual_auth,
'RandomCode': 'KuYKL30nDA6QmIKeysgbM6qpali4YB1EqklwuOhAtS5Hzoc4fvkvAiTRtcuz',
'X-SIGN': 'xjcyiFmPtQNNrU6uGxSLeQQWM7+PW9Q445EPAeaU6EH07V3KKvTigeCg5visZaI3IavQhMIhVMLiJEUyPDEfAIyPfNZGPex1C+8fSYoAk9Q=',
'X-TIMESTAMP': '1717749773',
'X-RANDOM': 'TbSyCQyC5efAT5dRNs7RxWMg'
}
# 确定保存路径
file_name = f"{udid}_downloaded_file.bin" # 可根据需要修改扩展名
save_path = os.path.abspath(os.path.join(DOWNLOAD_DIR, file_name))
# 打印请求信息
logging.info("\n" + "=" * 50 + " 请求信息 " + "=" * 50)
logging.info(f"线程: {threading.current_thread().name}")
logging.info(f"UDID: {udid}")
logging.info(f"请求URL: {url}")
logging.info(f"保存路径: {save_path}")
logging.info("请求头:")
logging.info(json.dumps(headers, indent=2, ensure_ascii=False))
logging.info("=" * 100 + "\n")
# 创建会话并设置重试机制
session = requests.Session()
adapter = requests.adapters.HTTPAdapter(
max_retries=3,
pool_connections=THREAD_COUNT,
pool_maxsize=THREAD_COUNT
)
session.mount('http://', adapter)
session.mount('https://', adapter)
max_retries = 3
for attempt in range(max_retries):
try:
with session.post(
url,
headers=headers,
stream=True, # 关键:启用流式下载
verify=False,
timeout=(30, 300)
) as response:
response.raise_for_status()
# 获取文件总大小
total_size = int(response.headers.get('content-length', 0))
if total_size == 0:
raise ValueError("无法获取文件总大小")
logging.info(f"开始下载文件,总大小: {total_size / 1024 / 1024:.2f}MB")
# 创建下载目录
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
# 写入文件
downloaded = 0
start_time = time.time()
last_update = start_time
last_log = ""
with open(save_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
f.flush()
os.fsync(f.fileno())
downloaded += len(chunk)
# 显示进度(改用日志记录方式)
if time.time() - last_update >= 0.1:
percent = (downloaded / total_size) * 100
speed = downloaded / (time.time() - start_time) / 1024
current_log = (
f"进度: {percent:.1f}% | "
f"速度: {speed:.1f}KB/s | "
f"{downloaded / 1024 / 1024:.1f}MB/{total_size / 1024 / 1024:.1f}MB"
)
if current_log != last_log:
logging.info(current_log)
last_log = current_log
last_update = time.time()
logging.info("进度: 100.0% | 下载完成!")
logging.info("文件下载完成!")
# 验证文件大小
final_size = os.path.getsize(save_path)
if final_size != total_size:
raise ValueError(f"文件大小不匹配: {final_size} != {total_size}")
logging.info(f"文件保存成功: {save_path}")
logging.info(f"文件大小: {final_size} bytes")
break
except (requests.exceptions.RequestException, ValueError) as e:
if attempt == max_retries - 1:
logging.error(f"下载最终失败: {str(e)}")
raise
wait_time = (attempt + 1) * 5
logging.warning(f"下载失败,{wait_time}秒后重试... ({attempt + 1}/{max_retries})")
time.sleep(wait_time)
except Exception as e:
logging.exception(f"线程处理异常: {str(e)}")
finally:
message_queue.task_done()
if __name__ == "__main__":
logging.info("=== 程序启动 ===")
logging.info(f"当前工作目录: {os.getcwd()}")
logging.info(f"下载目录: {os.path.abspath(DOWNLOAD_DIR)}")
# 测试日志系统
logging.info("日志系统测试 - INFO级别")
logging.warning("日志系统测试 - WARNING级别")
# 先测试进度条功能
test_progress()
# 启动线程池
for i in range(THREAD_COUNT):
threading.Thread(
target=worker_thread,
name=f"Worker-{i + 1}",
daemon=True
).start()
logging.info(f"已启动 {THREAD_COUNT} 个工作线程")
# MQTT客户端
client = mqtt.Client()
client.username_pw_set("mqtt@cmdb", "mqtt@webpassw0RD")
client.on_connect = on_connect
client.on_message = on_message
try:
client.connect("192.168.5.229", 1883)
logging.info("MQTT客户端已启动,等待消息...")
client.loop_forever()
except KeyboardInterrupt:
logging.info("程序终止")
finally:
client.disconnect()
from hytest import *
import os
import sys
import json
import logging
import threading
from datetime import datetime
from queue import Queue
# 获取当前脚本的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建预定系统的绝对路径
预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..'))
预定系统_path = os.path.abspath(os.path.join(current_dir, '..', '..', '..'))
# 添加路径
sys.path.append(预定系统_path)
# 导入模块
......@@ -13,60 +21,89 @@ except ModuleNotFoundError as e:
print("尝试使用绝对路径导入")
from 预定系统.Base.Mqtt_Send import *
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# 获取当前脚本所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
print("当前脚本所在的目录:", current_dir)
# 构建CSV文件的绝对路径
csv_file_path = os.path.join(current_dir, '../../测试数据/MQTT模块/MQTT安卓上报_2000条.csv')
# csv_file_path = os.path.join(current_dir, '../../测试数据/MQTT模块/MQTT心跳上报_2000条.csv')
csv_file_path = os.path.join(current_dir, '../测试数据/预定系统-门口屏/MQTT心跳上报_100条.csv')
# 工作线程函数
def worker(mqtt_client, config_queue, interval):
while True:
config = config_queue.get()
try:
topic = config["topic"]
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
message = Mqtt.build_message(config, current_time, topic)
mqtt_client.publish(topic, message)
time.sleep(interval)
except Exception as e:
logging.error(f"线程 {threading.current_thread().name} 发送消息失败: {e}")
finally:
config_queue.task_done()
if __name__ == "__main__":
# 读取配置文件
configs = Mqtt.read_config_from_csv(csv_file_path)
broker_address = "192.168.5.218"
username = "mqtt@cmdb" # 你的MQTT用户名
password = "mqtt@webpassw0RD" # 你的MQTT密码
broker_address = "192.168.5.229"
username = "mqtt@cmdb"
password = "mqtt@webpassw0RD"
port = 1883
num_repeats = 200 # 重复执行的次数
interval_between_repeats = 1 # 每次重复之间的间隔时间(秒)
num_repeats = 200
interval_between_repeats = 1
num_threads = 100 # 线程数量
# 创建 MQTT 客户端实例
mqtt_client = Mqtt(broker_address, port, username, password)
# 创建配置队列
config_queue = Queue()
# 设置 MQTT 服务器的用户名和密码
mqtt_client.connect()
# 创建MQTT客户端列表 (每个线程一个客户端)
mqtt_clients = []
for i, config in enumerate(configs):
client_id = config.get("clientId", f"python_client_{i}")
mqtt_client = Mqtt(broker_address, port, username, password, client_id)
mqtt_client.set_message_type("json")
mqtt_clients.append(mqtt_client)
try:
# 连接到 MQTT 服务器
mqtt_client.connect()
# 连接所有MQTT客户端
for client in mqtt_clients:
client.connect()
logging.info(f"连接成功,Client ID: {client.client_id}")
print('连接成功')
# 创建工作线程
for i in range(num_threads):
t = threading.Thread(
target=worker,
args=(mqtt_clients[i % len(mqtt_clients)], config_queue, interval_between_repeats),
name=f"Worker-{i + 1}",
daemon=True
)
t.start()
# 主循环
for repeat in range(num_repeats):
logging.info(f"开始第 {repeat + 1} 次上报")
# 遍历配置文件中的每一行数据
# 将配置放入队列
for config in configs:
#打印当前MQTT消息配置信息
Mqtt.print_current_config(config)
# 构建消息内容
topic = config["topic"]
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(config)
message = Mqtt.build_message(config, current_time, topic)
# 发送消息
mqtt_client.publish(topic, message)
config_queue.put(config)
# 每次发送之间可以设置一个间隔时间
time.sleep(interval_between_repeats)
# 每次重复之间设置一个间隔时间
config_queue.join() # 等待所有任务完成
time.sleep(interval_between_repeats)
except Exception as e:
logging.error(f"发送消息时发生错误: {e}")
logging.error(f"发生错误: {e}", exc_info=True)
finally:
# 断开与 MQTT 服务器的连接
mqtt_client.disconnect()
\ No newline at end of file
# 断开所有MQTT连接
for client in mqtt_clients:
client.disconnect()
......@@ -12,44 +12,52 @@ import paho.mqtt.client as mqtt
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
class Mqtt:
def __init__(self, broker_address, port, username=None, password=None):
def __init__(self, broker_address, port, username=None, password=None, client_id=None):
"""
初始化 MQTT 客户端
:param broker_address: MQTT 代理地址
:param port: MQTT 代理端口
:param username: MQTT 登录用户名(可选)
:param password: MQTT 登录密码(可选)
:param password: MQTT 登录密码(可选)
:param client_id: 客户端ID(可选)
"""
self.lock = None
self.broker_address = broker_address
self.port = port
self.username = username
self.password = password
self.client_id = client_id or f"python_client_{os.getpid()}_{time.time()}"
self.client = None
self._received_message_lock = threading.Lock()
self.received_message = None
self.message_type = None
self.username = username
self.password = password
self.message_type = None # 初始化message_type属性
def connect(self):
"""
连接到 MQTT 服务器,并支持账号密码登录
"""
"""连接到 MQTT 服务器"""
try:
self.client = mqtt.Client()
# 创建客户端时指定client_id
self.client = mqtt.Client(client_id=self.client_id)
# 如果提供了用户名和密码,则设置认证信息
if self.username and self.password:
self.client.username_pw_set(self.username, self.password)
self.client.on_connect = self.on_connect # 设置连接回调
self.client.on_message = self.on_message # 设置消息回调
self.client.connect(self.broker_address, self.port) # 连接到代理
self.client.loop_start() # 启动网络循环
logging.info("MQTT 客户端连接成功")
self.client.on_connect = self.on_connect
self.client.on_message = self.on_message
# 设置will消息
self.client.will_set(topic="/client/disconnect",
payload=json.dumps({"client_id": self.client_id}),
qos=1,
retain=False)
self.client.connect(self.broker_address, self.port, keepalive=60)
self.client.loop_start()
logging.info(f"MQTT连接成功,Client ID: {self.client_id}")
except Exception as e:
logging.error(f"连接到MQTT服务器时发生错误: {e}")
logging.error(f"连接失败: {str(e)}")
raise
def print_current_config(config):
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论