13
13
14
14
namespace Simps \MQTT \Packet ;
15
15
16
+ use Simps \MQTT \Tools \PackTool ;
16
17
use Simps \MQTT \Types ;
17
18
18
19
class Pack
19
20
{
20
21
public static function connect (array $ array ): string
21
22
{
22
- $ body = static ::string ($ array ['protocol_name ' ]) . chr ($ array ['protocol_level ' ]);
23
+ $ body = PackTool ::string ($ array ['protocol_name ' ]) . chr ($ array ['protocol_level ' ]);
23
24
$ connect_flags = 0 ;
24
25
if (!empty ($ array ['clean_session ' ])) {
25
26
$ connect_flags |= 1 << 1 ;
@@ -40,20 +41,20 @@ public static function connect(array $array): string
40
41
$ body .= chr ($ connect_flags );
41
42
42
43
$ keepAlive = !empty ($ array ['keep_alive ' ]) && (int ) $ array ['keep_alive ' ] >= 0 ? (int ) $ array ['keep_alive ' ] : 0 ;
43
- $ body .= pack ( ' n ' , $ keepAlive );
44
+ $ body .= PackTool:: shortInt ( $ keepAlive );
44
45
45
- $ body .= static ::string ($ array ['client_id ' ]);
46
+ $ body .= PackTool ::string ($ array ['client_id ' ]);
46
47
if (!empty ($ array ['will ' ])) {
47
- $ body .= static ::string ($ array ['will ' ]['topic ' ]);
48
- $ body .= static ::string ($ array ['will ' ]['message ' ]);
48
+ $ body .= PackTool ::string ($ array ['will ' ]['topic ' ]);
49
+ $ body .= PackTool ::string ($ array ['will ' ]['message ' ]);
49
50
}
50
51
if (!empty ($ array ['user_name ' ])) {
51
- $ body .= static ::string ($ array ['user_name ' ]);
52
+ $ body .= PackTool ::string ($ array ['user_name ' ]);
52
53
}
53
54
if (!empty ($ array ['password ' ])) {
54
- $ body .= static ::string ($ array ['password ' ]);
55
+ $ body .= PackTool ::string ($ array ['password ' ]);
55
56
}
56
- $ head = static ::packHeader (Types::CONNECT , strlen ($ body ));
57
+ $ head = PackTool ::packHeader (Types::CONNECT , strlen ($ body ));
57
58
58
59
return $ head . $ body ;
59
60
}
@@ -63,97 +64,59 @@ public static function connAck(array $array): string
63
64
$ body = !empty ($ array ['session_present ' ]) ? chr (1 ) : chr (0 );
64
65
$ code = !empty ($ array ['code ' ]) ? $ array ['code ' ] : 0 ;
65
66
$ body .= chr ($ code );
66
- $ head = static ::packHeader (Types::CONNACK , strlen ($ body ));
67
+ $ head = PackTool ::packHeader (Types::CONNACK , strlen ($ body ));
67
68
68
69
return $ head . $ body ;
69
70
}
70
71
71
72
public static function publish (array $ array ): string
72
73
{
73
- $ body = static ::string ($ array ['topic ' ]);
74
+ $ body = PackTool ::string ($ array ['topic ' ]);
74
75
$ qos = $ array ['qos ' ] ?? 0 ;
75
76
if ($ qos ) {
76
- $ body .= pack ( ' n ' , $ array ['message_id ' ]);
77
+ $ body .= PackTool:: shortInt ( $ array ['message_id ' ]);
77
78
}
78
79
$ body .= $ array ['message ' ];
79
80
$ dup = $ array ['dup ' ] ?? 0 ;
80
81
$ retain = $ array ['retain ' ] ?? 0 ;
81
- $ head = static ::packHeader (Types::PUBLISH , strlen ($ body ), $ dup , $ qos , $ retain );
82
+ $ head = PackTool ::packHeader (Types::PUBLISH , strlen ($ body ), $ dup , $ qos , $ retain );
82
83
83
84
return $ head . $ body ;
84
85
}
85
86
86
87
public static function subscribe (array $ array ): string
87
88
{
88
89
$ id = $ array ['message_id ' ];
89
- $ body = pack ( ' n ' , $ id );
90
+ $ body = PackTool:: shortInt ( $ id );
90
91
foreach ($ array ['topics ' ] as $ topic => $ qos ) {
91
- $ body .= static ::string ($ topic );
92
+ $ body .= PackTool ::string ($ topic );
92
93
$ body .= chr ($ qos );
93
94
}
94
- $ head = static ::packHeader (Types::SUBSCRIBE , strlen ($ body ), 0 , 1 );
95
+ $ head = PackTool ::packHeader (Types::SUBSCRIBE , strlen ($ body ), 0 , 1 );
95
96
96
97
return $ head . $ body ;
97
98
}
98
99
99
100
public static function subAck (array $ array ): string
100
101
{
101
102
$ payload = $ array ['payload ' ];
102
- $ body = pack ( ' n ' , $ array ['message_id ' ]) . call_user_func_array (
103
+ $ body = PackTool:: shortInt ( $ array ['message_id ' ]) . call_user_func_array (
103
104
'pack ' ,
104
105
array_merge (['C* ' ], $ payload )
105
106
);
106
- $ head = static ::packHeader (Types::SUBACK , strlen ($ body ));
107
+ $ head = PackTool ::packHeader (Types::SUBACK , strlen ($ body ));
107
108
108
109
return $ head . $ body ;
109
110
}
110
111
111
112
public static function unSubscribe (array $ array ): string
112
113
{
113
- $ body = pack ( ' n ' , $ array ['message_id ' ]);
114
+ $ body = PackTool:: shortInt ( $ array ['message_id ' ]);
114
115
foreach ($ array ['topics ' ] as $ topic ) {
115
- $ body .= static ::string ($ topic );
116
+ $ body .= PackTool ::string ($ topic );
116
117
}
117
- $ head = static ::packHeader (Types::UNSUBSCRIBE , strlen ($ body ), 0 , 1 );
118
+ $ head = PackTool ::packHeader (Types::UNSUBSCRIBE , strlen ($ body ), 0 , 1 );
118
119
119
120
return $ head . $ body ;
120
121
}
121
-
122
- private static function string (string $ str )
123
- {
124
- $ len = strlen ($ str );
125
-
126
- return pack ('n ' , $ len ) . $ str ;
127
- }
128
-
129
- public static function packHeader (int $ type , int $ bodyLength , int $ dup = 0 , int $ qos = 0 , int $ retain = 0 ): string
130
- {
131
- $ type = $ type << 4 ;
132
- if ($ dup ) {
133
- $ type |= 1 << 3 ;
134
- }
135
- if ($ qos ) {
136
- $ type |= $ qos << 1 ;
137
- }
138
- if ($ retain ) {
139
- $ type |= 1 ;
140
- }
141
-
142
- return chr ($ type ) . static ::packRemainingLength ($ bodyLength );
143
- }
144
-
145
- private static function packRemainingLength (int $ bodyLength )
146
- {
147
- $ string = '' ;
148
- do {
149
- $ digit = $ bodyLength % 128 ;
150
- $ bodyLength = $ bodyLength >> 7 ;
151
- if ($ bodyLength > 0 ) {
152
- $ digit = ($ digit | 0x80 );
153
- }
154
- $ string .= chr ($ digit );
155
- } while ($ bodyLength > 0 );
156
-
157
- return $ string ;
158
- }
159
122
}
0 commit comments