/[projects]/smsdaemon/SmsPdu.cpp
ViewVC logotype

Contents of /smsdaemon/SmsPdu.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 61 - (show annotations) (download)
Thu Jun 12 11:05:18 2008 UTC (15 years, 11 months ago) by torben
File size: 3348 byte(s)
More work towards getting concatenated sms working - but not there yet !

1 /* using http://sourceforge.net/projects/libserial/
2 */
3
4
5 #include "SmsPdu.h"
6
7 #include <string>
8 #include <sstream>
9
10 #include <time.h>
11 #include <stdlib.h>
12
13
14 #include "util.h"
15
16
17 using namespace std;
18
19
20 namespace SmsPdu
21 {
22
23
24 vector<unsigned char> BcdEncode(string input)
25 {
26 char buf[2] = " ";
27 vector<unsigned char> result;
28
29 unsigned char current;
30 for (unsigned int i=0; i<input.length(); ++i)
31 {
32 buf[0] = input.at(i);
33 unsigned char tmp = atoi(buf);
34
35 if ( (i%2) == 0)
36 {
37 current = tmp;
38 }
39 else
40 {
41 current |= (tmp<<4);
42 result.push_back(current);
43 }
44 }
45
46 if ((input.length() % 2) == 1)
47 {
48 current |= 0xF0;
49 result.push_back(current);
50 }
51
52 return result;
53 }
54
55 string HexformatVector(vector<unsigned char> vec)
56 {
57 ostringstream os;
58
59 for (unsigned int i=0; i<vec.size(); ++i)
60 {
61 os.width(2);
62 os.fill('0');
63 os << hex << uppercase << static_cast<unsigned int>(vec.at(i));
64 }
65
66
67 return os.str();
68 }
69
70 std::string Encode8to7bit(vector<unsigned char> vec)
71 {
72 string result;
73
74 return result;
75 }
76
77 vector<unsigned char> Encode7to8bit(std::string str)
78 {
79 vector<unsigned char> buf;
80
81 int shift = 0;
82 for (unsigned int i=0; i<str.size(); ++i)
83 {
84 unsigned char current = str.at(i) & 0x7F;
85 unsigned char next = ( (i+1)<str.size()) ? str.at(i+1) : 0;
86 next &= 0x7F;
87
88 current >>= shift;
89 next <<= (7-shift);
90
91 unsigned char byte = current | next;
92 buf.push_back(byte);
93
94 if (shift == 6)
95 i++;
96
97 shift = (shift+1) % 7;
98
99 }
100
101 return buf;
102 }
103
104 vector<PduInfo> CreateSmsPdu(string to, string message, bool allowMultipart)
105 {
106 bool multipart = allowMultipart && message.length() > 160;
107
108 const unsigned char UDHI = multipart ? 0x40 : 0;
109
110 srand(time(0));
111 unsigned char csms_ref = rand() % 128;
112
113 int part_count;
114
115 const int PDU_LEN = 153;
116
117 if (multipart)
118 {
119 part_count = message.length() / PDU_LEN;
120 if (message.length() % PDU_LEN)
121 part_count++;
122 }
123 else
124 {
125 part_count = 1;
126 }
127
128 vector<PduInfo> result;
129 for (int partnr = 0; partnr < part_count; ++partnr)
130 {
131 vector<unsigned char> pdu;
132
133 pdu.push_back(0x00); // use SMSC from phone
134 pdu.push_back( 0x01|UDHI ); // first octet -- no timeout
135 pdu.push_back(0x00); // TP-MR message reference
136 pdu.push_back(to.length() ); //length of phone nr
137 pdu.push_back(0x91); // type of address (international nr + ISDN/telephone range) - else try 0x81
138
139 vector<unsigned char> phone = BcdEncode(to);
140 pdu.insert( pdu.end(), phone.begin(), phone.end());
141
142 pdu.push_back(0x00); // Protocol identifier
143 pdu.push_back(0x00); // Data coding scheme
144
145 string message_part;
146 if (multipart)
147 {
148 message_part = message.substr(0, PDU_LEN);
149 message.erase(0, PDU_LEN);
150
151 pdu.push_back( message_part.length()+ 6 ); //UserDataLength
152 pdu.push_back( 0x05 ); // UDH Len
153 pdu.push_back( 0x00 ); // UDH Element Identifier
154 pdu.push_back( 0x03 ); // UDH element length
155 pdu.push_back( csms_ref ); // csms_ref reference
156 pdu.push_back( part_count );
157 pdu.push_back( partnr+1 );
158
159 }
160 else
161 {
162 message_part = message.substr(0,160); //truncate to 160
163
164 pdu.push_back( message_part.length() ); //UserDataLength
165 }
166
167 vector<unsigned char> userData = Encode7to8bit(message_part);
168
169 pdu.insert( pdu.end(), userData.begin(), userData.end());
170
171 PduInfo info;
172 info.len = pdu.size()-1;
173 info.pdu = HexformatVector(pdu);
174 result.push_back(info);
175
176 }
177 return result;
178 }
179
180 }

  ViewVC Help
Powered by ViewVC 1.1.20