line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# Device::Gsm::Pdu - PDU encoding/decoding functions for Device::Gsm class |
2
|
|
|
|
|
|
|
# Copyright (C) 2002-2011 Cosimo Streppone, cosimo@cpan.org |
3
|
|
|
|
|
|
|
# Copyright (C) 2006-2011 Grzegorz Wozniak, wozniakg@gmail.com |
4
|
|
|
|
|
|
|
# |
5
|
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify |
6
|
|
|
|
|
|
|
# it only under the terms of Perl itself. |
7
|
|
|
|
|
|
|
# |
8
|
|
|
|
|
|
|
# This program is distributed in the hope that it will be useful, |
9
|
|
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
10
|
|
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11
|
|
|
|
|
|
|
# Perl licensing terms for details. |
12
|
|
|
|
|
|
|
# |
13
|
|
|
|
|
|
|
# Commercial support is available. Write me if you are |
14
|
|
|
|
|
|
|
# interested in new features or software support. |
15
|
|
|
|
|
|
|
# |
16
|
|
|
|
|
|
|
# $Id$ |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
# TODO document decode_text8() |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
package Device::Gsm::Pdu; |
21
|
|
|
|
|
|
|
|
22
|
10
|
|
|
10
|
|
205488
|
use strict; |
|
10
|
|
|
|
|
18
|
|
|
10
|
|
|
|
|
382
|
|
23
|
10
|
|
|
10
|
|
7912
|
use Device::Gsm::Charset; |
|
10
|
|
|
|
|
26
|
|
|
10
|
|
|
|
|
322
|
|
24
|
10
|
|
|
10
|
|
7900
|
use Device::Gsm::Sms::Token::UDH; |
|
10
|
|
|
|
|
30
|
|
|
10
|
|
|
|
|
16001
|
|
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# decode a pdu encoded phone number into human readable format |
27
|
|
|
|
|
|
|
sub decode_address { |
28
|
12
|
50
|
|
12
|
1
|
490
|
my $address = shift or return; |
29
|
|
|
|
|
|
|
|
30
|
12
|
|
|
|
|
18
|
my $number; |
31
|
12
|
|
|
|
|
62
|
my ($length, $type, $bcd_digits) = unpack('A2 A2 A*', $address); |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
# XXX DEBUG |
34
|
|
|
|
|
|
|
#print STDERR "len=$length type=$type bcd=$bcd_digits\n"; |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
# Manage alphabetical addresses (as per TS 03.38 specs) |
37
|
|
|
|
|
|
|
# Alphabetical addresses begin with 'D0'. |
38
|
|
|
|
|
|
|
# Check also http://smslink.sourceforge.net/pdu.html |
39
|
|
|
|
|
|
|
# |
40
|
12
|
100
|
|
|
|
40
|
if ($type eq 'D0') { |
41
|
3
|
|
|
|
|
22
|
$number = decode_text7($length . $bcd_digits); |
42
|
3
|
|
|
|
|
16
|
return $number; |
43
|
|
|
|
|
|
|
} |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
# Reverse each pair of bcd digits |
46
|
9
|
|
|
|
|
23
|
while ($bcd_digits) { |
47
|
48
|
|
|
|
|
74
|
$number .= reverse substr($bcd_digits, 0, 2); |
48
|
48
|
|
|
|
|
132
|
$bcd_digits = substr $bcd_digits, 2; |
49
|
|
|
|
|
|
|
} |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
#print STDERR "num=$number - "; |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
# Truncate last `F' if found (XXX ???) |
54
|
|
|
|
|
|
|
#$number = substr( $number, 0, hex($length) ); |
55
|
9
|
100
|
|
|
|
35
|
chop $number if substr($number, -1) eq 'F'; |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
# Decode special characters for GPRS dialing |
58
|
9
|
|
|
|
|
21
|
$number =~ s/A/\*/; |
59
|
9
|
|
|
|
|
14
|
$number =~ s/B/#/; |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
# If number is international, put a '+' sign before |
62
|
9
|
100
|
66
|
|
|
62
|
if ($type == 91 && $number !~ /^\s*\+/) { |
63
|
5
|
|
|
|
|
14
|
$number = '+' . $number; |
64
|
|
|
|
|
|
|
} |
65
|
|
|
|
|
|
|
|
66
|
9
|
|
|
|
|
39
|
return $number; |
67
|
|
|
|
|
|
|
} |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
sub decode_text7 { |
70
|
21
|
|
|
21
|
0
|
803
|
pack '(b*)*', |
71
|
|
|
|
|
|
|
unpack 'C/(a7)', |
72
|
|
|
|
|
|
|
pack 'C a*', |
73
|
|
|
|
|
|
|
unpack 'C b*', |
74
|
|
|
|
|
|
|
pack 'H*', $_[0]; |
75
|
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
#remains for comatibility reasons with my production scripts :) |
78
|
|
|
|
|
|
|
sub decode_text7_udh1 { |
79
|
0
|
|
|
0
|
0
|
0
|
my $unpacked = join '', |
80
|
|
|
|
|
|
|
unpack 'C/(a7)', |
81
|
|
|
|
|
|
|
pack 'C a*', |
82
|
|
|
|
|
|
|
unpack 'C b*', |
83
|
|
|
|
|
|
|
pack 'H*', $_[0]; |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
#remove bit of padding from message |
86
|
0
|
|
|
|
|
0
|
$unpacked = substr($unpacked, 1, length($unpacked)); |
87
|
0
|
|
|
|
|
0
|
pack '(b*)*', ($unpacked =~ m/([01]{1,7})/gs); |
88
|
|
|
|
|
|
|
} |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
#decode text with padding |
91
|
|
|
|
|
|
|
sub decode_text7_udh { |
92
|
0
|
|
|
0
|
0
|
0
|
my ($encoded, $padding) = @_; |
93
|
0
|
0
|
|
|
|
0
|
$padding = 0 unless ($padding); |
94
|
0
|
|
|
|
|
0
|
my $unpacked = join '', |
95
|
|
|
|
|
|
|
unpack 'C/(a7)', |
96
|
|
|
|
|
|
|
pack 'C a*', |
97
|
|
|
|
|
|
|
unpack 'C b*', |
98
|
|
|
|
|
|
|
pack 'H*', $encoded; |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
#remove bits of padding from message |
101
|
0
|
|
|
|
|
0
|
$unpacked = substr($unpacked, $padding, length($unpacked)); |
102
|
0
|
|
|
|
|
0
|
pack '(b*)*', ($unpacked =~ m/([01]{7})/gs); |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
} |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
# decode 8-bit encoded text |
107
|
|
|
|
|
|
|
sub decode_text8($) { |
108
|
|
|
|
|
|
|
|
109
|
0
|
|
|
0
|
0
|
0
|
my $text8 = shift(); |
110
|
0
|
0
|
|
|
|
0
|
return unless $text8; |
111
|
|
|
|
|
|
|
|
112
|
0
|
|
|
|
|
0
|
my $str; |
113
|
0
|
|
|
|
|
0
|
while ($text8) { |
114
|
0
|
|
|
|
|
0
|
$str .= chr(hex(substr $text8, 0, 2)); |
115
|
0
|
0
|
|
|
|
0
|
if (length($text8) > 2) { |
116
|
0
|
|
|
|
|
0
|
$text8 = substr($text8, 2); |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
else { |
119
|
0
|
|
|
|
|
0
|
$text8 = ''; |
120
|
|
|
|
|
|
|
} |
121
|
|
|
|
|
|
|
} |
122
|
0
|
|
|
|
|
0
|
return $str; |
123
|
|
|
|
|
|
|
} |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
sub encode_address { |
126
|
5
|
|
|
5
|
1
|
18
|
my $num = shift; |
127
|
5
|
|
|
|
|
7
|
my $type = ''; |
128
|
5
|
|
|
|
|
7
|
my $len = 0; |
129
|
5
|
|
|
|
|
7
|
my $encoded = ''; |
130
|
|
|
|
|
|
|
|
131
|
5
|
|
|
|
|
11
|
$num =~ s/\s+//g; |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
#warn('encode_address('.$num.')'); |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
# Check for alphabetical addresses (TS 03.38) |
136
|
5
|
50
|
|
|
|
16
|
if ($num =~ /[A-Z][a-z]/) { |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
# Encode clear text in gsm0338 7-bit |
139
|
0
|
|
|
|
|
0
|
$type = 'D0'; |
140
|
0
|
|
|
|
|
0
|
$encoded = encode_text7($num); |
141
|
0
|
|
|
|
|
0
|
$len = unpack 'H2' => chr(length $encoded); |
142
|
|
|
|
|
|
|
} |
143
|
|
|
|
|
|
|
else { |
144
|
5
|
100
|
|
|
|
20
|
$type = index($num, '+') == 0 ? 91 : 81; |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
# Remove all non-numbers. Beware to GPRS dialing chars. |
147
|
5
|
|
|
|
|
18
|
$num =~ s/[^\d\*#]//g; |
148
|
5
|
|
|
|
|
7
|
$num =~ s/\*/A/g; # "*" maps to A |
149
|
5
|
|
|
|
|
9
|
$num =~ s/#/B/g; # "#" maps to B |
150
|
|
|
|
|
|
|
|
151
|
5
|
|
|
|
|
21
|
$len = unpack 'H2' => chr(length $num); |
152
|
5
|
|
|
|
|
10
|
$num .= 'F'; |
153
|
5
|
|
|
|
|
27
|
my @digit = split // => $num; |
154
|
|
|
|
|
|
|
|
155
|
5
|
|
|
|
|
17
|
while (@digit > 1) { |
156
|
28
|
|
|
|
|
70
|
$encoded .= join '', reverse splice @digit, 0, 2; |
157
|
|
|
|
|
|
|
} |
158
|
|
|
|
|
|
|
} |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
#warn(' [' . (uc $len . $type . $encoded ) . ']' ); |
161
|
|
|
|
|
|
|
|
162
|
5
|
|
|
|
|
26
|
return (uc $len . $type . $encoded); |
163
|
|
|
|
|
|
|
} |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
sub decode_text_UCS2 { |
166
|
5
|
|
|
5
|
0
|
18
|
my $encoded = shift; |
167
|
5
|
50
|
|
|
|
14
|
return undef unless $encoded; |
168
|
|
|
|
|
|
|
|
169
|
5
|
|
|
|
|
12
|
my $len = hex substr($encoded, 0, 2); |
170
|
5
|
|
|
|
|
8
|
$encoded = substr $encoded, 2; |
171
|
|
|
|
|
|
|
|
172
|
5
|
|
|
|
|
8
|
my $decoded = ""; |
173
|
5
|
|
|
|
|
15
|
while ($encoded) { |
174
|
5
|
|
|
|
|
20
|
$decoded .= pack("C0U", hex(substr($encoded, 0, 4))); |
175
|
5
|
|
|
|
|
15
|
$encoded = substr($encoded, 4); |
176
|
|
|
|
|
|
|
} |
177
|
5
|
|
|
|
|
22
|
return $decoded; |
178
|
|
|
|
|
|
|
} |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
sub encode_text7 { |
181
|
|
|
|
|
|
|
uc |
182
|
12
|
|
|
12
|
1
|
3694
|
unpack 'H*', |
183
|
|
|
|
|
|
|
pack 'C b*', |
184
|
|
|
|
|
|
|
length $_[0], |
185
|
|
|
|
|
|
|
join '', |
186
|
|
|
|
|
|
|
unpack '(b7)*', $_[0]; |
187
|
|
|
|
|
|
|
} |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
# |
190
|
|
|
|
|
|
|
#return complete ud with udh |
191
|
|
|
|
|
|
|
#remains for comatibility reasons with my production scripts :) |
192
|
|
|
|
|
|
|
# |
193
|
|
|
|
|
|
|
sub encode_text7_udh1 { |
194
|
0
|
|
|
0
|
0
|
0
|
my $decoded = shift; |
195
|
0
|
|
|
|
|
0
|
my $udh1 = shift; |
196
|
0
|
|
|
|
|
0
|
my $decoded_length = length($decoded); |
197
|
0
|
|
|
|
|
0
|
$decoded = Device::Gsm::Charset::iso8859_to_gsm0338($decoded); |
198
|
0
|
|
|
|
|
0
|
my $pdu_msg = uc |
199
|
|
|
|
|
|
|
unpack 'H*', |
200
|
|
|
|
|
|
|
pack 'b*', |
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
#add one bit of padding to align septet boundary |
203
|
|
|
|
|
|
|
'0' . join '', unpack '(b7)*', $decoded; |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
#below add 7 septets length for udh1 |
206
|
|
|
|
|
|
|
return |
207
|
0
|
|
|
|
|
0
|
sprintf("%02X", $decoded_length + Sms::Token::UDH::UDH1_LENGTH) |
208
|
|
|
|
|
|
|
. $udh1 |
209
|
|
|
|
|
|
|
. $pdu_msg; |
210
|
|
|
|
|
|
|
} |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
# |
213
|
|
|
|
|
|
|
#encode text with padding |
214
|
|
|
|
|
|
|
# |
215
|
|
|
|
|
|
|
sub encode_text7_udh { |
216
|
0
|
|
|
0
|
0
|
0
|
my $decoded = shift; |
217
|
0
|
|
|
|
|
0
|
my $padding = shift; |
218
|
0
|
0
|
|
|
|
0
|
$padding = 0 unless ($padding); |
219
|
0
|
|
|
|
|
0
|
my $decoded_length = length($decoded); |
220
|
0
|
|
|
|
|
0
|
$decoded = Device::Gsm::Charset::iso8859_to_gsm0338($decoded); |
221
|
0
|
|
|
|
|
0
|
my $pdu_msg = uc |
222
|
|
|
|
|
|
|
unpack 'H*', |
223
|
|
|
|
|
|
|
pack 'b*', |
224
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
#add bits of padding to align septet boundary |
226
|
|
|
|
|
|
|
'0' x $padding . join '', unpack '(b7)*', $decoded; |
227
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
#below add septets length of text |
229
|
0
|
|
|
|
|
0
|
my $len_hex = sprintf("%02X", $decoded_length); |
230
|
|
|
|
|
|
|
return |
231
|
|
|
|
|
|
|
wantarray |
232
|
0
|
0
|
|
|
|
0
|
? ($len_hex, $pdu_msg, $len_hex . $pdu_msg) |
233
|
|
|
|
|
|
|
: $len_hex . $pdu_msg; |
234
|
|
|
|
|
|
|
} |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
sub pdu_to_latin1 { |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
# Reattach a length octet. |
239
|
1
|
|
|
1
|
1
|
12
|
my $s = shift; |
240
|
1
|
|
|
|
|
5
|
my $len = length $s; |
241
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
#arn "len=$len, len/2=", $len/2, "\n"; |
243
|
1
|
|
|
|
|
13
|
my $l = uc unpack("H*", pack("C", int(length($s) / 2 * 8 / 7))); |
244
|
1
|
50
|
|
|
|
7
|
if (length($l) % 2 == 1) { $l = '0' . $l } |
|
0
|
|
|
|
|
0
|
|
245
|
1
|
|
|
|
|
7
|
my $pdu = $l . $s; |
246
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
#arn "l=$l, pdu=$pdu\n"; |
248
|
1
|
|
|
|
|
5
|
my $decoded = Device::Gsm::Pdu::decode_text7($pdu); |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
#arn "decoded_text7=$decoded\n"; |
251
|
1
|
|
|
|
|
16
|
my $latin1 = Device::Gsm::Charset::gsm0338_to_iso8859($decoded); |
252
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
#arn "latin1=$latin1\n"; |
254
|
1
|
|
|
|
|
14
|
return $latin1; |
255
|
|
|
|
|
|
|
} |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
sub latin1_to_pdu { |
258
|
1
|
|
|
1
|
1
|
32
|
my $latin1_text = $_[0]; |
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
#arn "latin1=$latin1_text\n"; |
261
|
1
|
|
|
|
|
6
|
my $gsm0338 = Device::Gsm::Charset::iso8859_to_gsm0338($latin1_text); |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
#arn "gsm0338=$gsm0338\n"; |
264
|
1
|
|
|
|
|
5
|
my $fullpdu = Device::Gsm::Pdu::encode_text7($gsm0338); |
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
#arn "pdu=$fullpdu\n"; |
267
|
1
|
|
|
|
|
16
|
return substr($fullpdu, 2); # strip off the length octet |
268
|
|
|
|
|
|
|
} |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
1; |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
=head1 NAME |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
Device::Gsm::Pdu - library to manage PDU encoded data for GSM messaging |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
=head1 WARNING |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
This is C software, still needs extensive testing and |
279
|
|
|
|
|
|
|
support for custom GSM commands, so use it at your own risk, |
280
|
|
|
|
|
|
|
and without C warranty! Have fun. |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
=head1 NOTICE |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
This module is meant to be used internally by C class, |
285
|
|
|
|
|
|
|
so you probably do not want to use it directly. |
286
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
=head1 SYNOPSIS |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
use Device::Gsm::Pdu; |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
# DA is destination address |
292
|
|
|
|
|
|
|
$DA = Device::Gsm::Pdu::encode_address('+39347101010'); |
293
|
|
|
|
|
|
|
$number = Device::Gsm::Pdu::decode_address( $DA ); |
294
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
# Encode 7 bit text to send messages |
296
|
|
|
|
|
|
|
$text = Device::Gsm::Pdu::encode_text7('hello'); |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
=head1 DESCRIPTION |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
C module includes a few basic functions to deal with SMS in PDU mode, |
301
|
|
|
|
|
|
|
such as encoding GSM addresses (phone numbers) and, for now only, 7 bit text. |
302
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
=head1 FUNCTIONS |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
=head2 decode_address( pdu_encoded_address ) |
306
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
Takes a PDU encoded address and decodes into human-readable mobile number. |
308
|
|
|
|
|
|
|
If number type is international, result will be prepended with a `+' sign. |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
Clearly, it is intended as an internal function. |
311
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
=head3 Example |
313
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
print Device::Gsm::Pdu::decode_address( '0B919343171010F0' ); |
315
|
|
|
|
|
|
|
# prints `+39347101010'; |
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
=head2 encode_address( mobile_number ) |
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
Takes a mobile number and encodes it as DA (destination address). |
320
|
|
|
|
|
|
|
If it begins with a `+', as in `+39328101010', it is treated as an international |
321
|
|
|
|
|
|
|
number. |
322
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
=head3 Example |
324
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
print Device::Gsm::Pdu::encode_address( '+39347101010' ); |
326
|
|
|
|
|
|
|
# prints `0B919343171010F0' |
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
=head2 encode_text7( text_string ) |
329
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
Encodes some text ASCII string in 7 bits PDU format, including a header byte |
331
|
|
|
|
|
|
|
which tells the length is septets. This is the only 100% supported mode to |
332
|
|
|
|
|
|
|
encode text. |
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
=head3 Example |
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
print Device::Gsm::Pdu::encode_text7( 'hellohello' ); |
337
|
|
|
|
|
|
|
# prints `0AE832...' |
338
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
=head2 pdu_to_latin1($pdu) |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
Converts a PDU (without the initial length octet) into a latin1 string. |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=head3 Example |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
my $pdu = 'CAFA9C0E0ABBDF7474590E8296E56C103A3C5E97E5'; |
346
|
|
|
|
|
|
|
print Device::Gsm::Pdu::pdu_to_latin1($pdu); |
347
|
|
|
|
|
|
|
# prints `Just another Perl hacker' |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
=head2 latin1_to_pdu($text) |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
Converts a text string in latin1 encoding (ISO-8859-1) into a PDU string. |
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
=head3 Example |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
my $text = "Just another Perl hacker"; |
356
|
|
|
|
|
|
|
print Device::Gsm::Pdu::latin1_to_pdu($text); |
357
|
|
|
|
|
|
|
# prints `CAFA9C0E0ABBDF7474590E8296E56C103A3C5E97E5' |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
=head1 AUTHOR |
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
Cosimo Streppone, cosimo@cpan.org |
362
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
=head1 COPYRIGHT |
364
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or modify |
366
|
|
|
|
|
|
|
it only under the terms of Perl itself. |
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
=head1 SEE ALSO |
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
Device::Gsm(3), perl(1) |
371
|
|
|
|
|
|
|
|