-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathsms.py
More file actions
288 lines (237 loc) · 12.8 KB
/
sms.py
File metadata and controls
288 lines (237 loc) · 12.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
import threading
import dbus
from enum import Enum
import logging
dbus_name = 'org.freedesktop.ModemManager1'
modem_dbus_props_iface = 'org.freedesktop.DBus.Properties'
class SMS:
class MMSmsDeliveryState(Enum):
MM_SMS_DELIVERY_STATE_COMPLETED_RECEIVED = 0x00
MM_SMS_DELIVERY_STATE_COMPLETED_FORWARDED_UNCONFIRMED = 0x01
MM_SMS_DELIVERY_STATE_COMPLETED_REPLACED_BY_SC = 0x02
# Temporary failures */
MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_CONGESTION = 0x20
MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_SME_BUSY = 0x21
MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_NO_RESPONSE_FROM_SME = 0x22
MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_SERVICE_REJECTED = 0x23
MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_QOS_NOT_AVAILABLE = 0x24
MM_SMS_DELIVERY_STATE_TEMPORARY_ERROR_IN_SME = 0x25
# Permanent failures */
MM_SMS_DELIVERY_STATE_ERROR_REMOTE_PROCEDURE = 0x40
MM_SMS_DELIVERY_STATE_ERROR_INCOMPATIBLE_DESTINATION = 0x41
MM_SMS_DELIVERY_STATE_ERROR_CONNECTION_REJECTED = 0x42
MM_SMS_DELIVERY_STATE_ERROR_NOT_OBTAINABLE = 0x43
MM_SMS_DELIVERY_STATE_ERROR_QOS_NOT_AVAILABLE = 0x44
MM_SMS_DELIVERY_STATE_ERROR_NO_INTERWORKING_AVAILABLE = 0x45
MM_SMS_DELIVERY_STATE_ERROR_VALIDITY_PERIOD_EXPIRED = 0x46
MM_SMS_DELIVERY_STATE_ERROR_DELETED_BY_ORIGINATING_SME = 0x47
MM_SMS_DELIVERY_STATE_ERROR_DELETED_BY_SC_ADMINISTRATION = 0x48
MM_SMS_DELIVERY_STATE_ERROR_MESSAGE_DOES_NOT_EXIST = 0x49
# Temporary failures that became permanent */
MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_CONGESTION = 0x60
MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_SME_BUSY = 0x61
MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_NO_RESPONSE_FROM_SME = 0x62
MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_SERVICE_REJECTED = 0x63
MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_QOS_NOT_AVAILABLE = 0x64
MM_SMS_DELIVERY_STATE_TEMPORARY_FATAL_ERROR_IN_SME = 0x65
# Unknown out of any possible valid value [0x00-0xFF] */
MM_SMS_DELIVERY_STATE_UNKNOWN = 0x100
# --------------- 3GPP2 specific errors ---------------------- */
# Network problems */
MM_SMS_DELIVERY_STATE_NETWORK_PROBLEM_ADDRESS_VACANT = 0x200
MM_SMS_DELIVERY_STATE_NETWORK_PROBLEM_ADDRESS_TRANSLATION_FAILURE = 0x201
MM_SMS_DELIVERY_STATE_NETWORK_PROBLEM_NETWORK_RESOURCE_OUTAGE = 0x202
MM_SMS_DELIVERY_STATE_NETWORK_PROBLEM_NETWORK_FAILURE = 0x203
MM_SMS_DELIVERY_STATE_NETWORK_PROBLEM_INVALID_TELESERVICE_ID = 0x204
MM_SMS_DELIVERY_STATE_NETWORK_PROBLEM_OTHER = 0x205
# Terminal problems */
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_NO_PAGE_RESPONSE = 0x220
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_DESTINATION_BUSY = 0x221
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_NO_ACKNOWLEDGMENT = 0x222
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_DESTINATION_RESOURCE_SHORTAGE = 0x223
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_SMS_DELIVERY_POSTPONED = 0x224
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_DESTINATION_OUT_OF_SERVICE = 0x225
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_DESTINATION_NO_LONGER_AT_THIS_ADDRESS = 0x226
MM_SMS_DELIVERY_STATE_TERMINAL_PROBLEM_OTHER = 0x227
# Radio problems */
MM_SMS_DELIVERY_STATE_RADIO_INTERFACE_PROBLEM_RESOURCE_SHORTAGE = 0x240
MM_SMS_DELIVERY_STATE_RADIO_INTERFACE_PROBLEM_INCOMPATIBILITY = 0x241
MM_SMS_DELIVERY_STATE_RADIO_INTERFACE_PROBLEM_OTHER = 0x242
# General problems */
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_ENCODING = 0x260
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_SMS_ORIGINATION_DENIED = 0x261
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_SMS_TERMINATION_DENIED = 0x262
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_SUPPLEMENTARY_SERVICE_NOT_SUPPORTED = 0x263
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_SMS_NOT_SUPPORTED = 0x264
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_MISSING_EXPECTED_PARAMETER = 0x266
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_MISSING_MANDATORY_PARAMETER = 0x267
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_UNRECOGNIZED_PARAMETER_VALUE = 0x268
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_UNEXPECTED_PARAMETER_VALUE = 0x269
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_USER_DATA_SIZE_ERROR = 0x26A
MM_SMS_DELIVERY_STATE_GENERAL_PROBLEM_OTHER = 0x26B
# Temporary network problems */
MM_SMS_DELIVERY_STATE_TEMPORARY_NETWORK_PROBLEM_ADDRESS_VACANT = 0x300
MM_SMS_DELIVERY_STATE_TEMPORARY_NETWORK_PROBLEM_ADDRESS_TRANSLATION_FAILURE = 0x301
MM_SMS_DELIVERY_STATE_TEMPORARY_NETWORK_PROBLEM_NETWORK_RESOURCE_OUTAGE = 0x302
MM_SMS_DELIVERY_STATE_TEMPORARY_NETWORK_PROBLEM_NETWORK_FAILURE = 0x303
MM_SMS_DELIVERY_STATE_TEMPORARY_NETWORK_PROBLEM_INVALID_TELESERVICE_ID = 0x304
MM_SMS_DELIVERY_STATE_TEMPORARY_NETWORK_PROBLEM_OTHER = 0x305
# Temporary terminal problems */
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_NO_PAGE_RESPONSE = 0x320
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_DESTINATION_BUSY = 0x321
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_NO_ACKNOWLEDGMENT = 0x322
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_DESTINATION_RESOURCE_SHORTAGE = 0x323
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_SMS_DELIVERY_POSTPONED = 0x324
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_DESTINATION_OUT_OF_SERVICE = 0x325
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_DESTINATION_NO_LONGER_AT_THIS_ADDRESS = 0x326
MM_SMS_DELIVERY_STATE_TEMPORARY_TERMINAL_PROBLEM_OTHER = 0x327
# Temporary radio problems */
MM_SMS_DELIVERY_STATE_TEMPORARY_RADIO_INTERFACE_PROBLEM_RESOURCE_SHORTAGE = 0x340
MM_SMS_DELIVERY_STATE_TEMPORARY_RADIO_INTERFACE_PROBLEM_INCOMPATIBILITY = 0x341
MM_SMS_DELIVERY_STATE_TEMPORARY_RADIO_INTERFACE_PROBLEM_OTHER = 0x342
# Temporary general problems */
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_ENCODING = 0x360
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_SMS_ORIGINATION_DENIED = 0x361
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_SMS_TERMINATION_DENIED = 0x362
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_SUPPLEMENTARY_SERVICE_NOT_SUPPORTED = 0x363
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_SMS_NOT_SUPPORTED = 0x364
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_MISSING_EXPECTED_PARAMETER = 0x366
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_MISSING_MANDATORY_PARAMETER = 0x367
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_UNRECOGNIZED_PARAMETER_VALUE = 0x368
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_UNEXPECTED_PARAMETER_VALUE = 0x369
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_USER_DATA_SIZE_ERROR = 0x36A
MM_SMS_DELIVERY_STATE_TEMPORARY_GENERAL_PROBLEM_OTHER = 0x36B
class MMSmsState(Enum):
MM_SMS_STATE_UNKNOWN = 0
MM_SMS_STATE_STORED = 1
MM_SMS_STATE_RECEIVING = 2
MM_SMS_STATE_RECEIVED = 3
MM_SMS_STATE_SENDING = 4
MM_SMS_STATE_SENT = 5
class MMSmsPduType(Enum):
MM_SMS_PDU_TYPE_UNKNOWN = 0
MM_SMS_PDU_TYPE_DELIVER = 1
MM_SMS_PDU_TYPE_SUBMIT = 2
MM_SMS_PDU_TYPE_STATUS_REPORT = 3
MM_SMS_PDU_TYPE_CDMA_DELIVER = 32
MM_SMS_PDU_TYPE_CDMA_SUBMIT = 33
MM_SMS_PDU_TYPE_CDMA_CANCELLATION = 34
MM_SMS_PDU_TYPE_CDMA_DELIVERY_ACKNOWLEDGEMENT = 35
MM_SMS_PDU_TYPE_CDMA_USER_ACKNOWLEDGEMENT = 36
MM_SMS_PDU_TYPE_CDMA_READ_ACKNOWLEDGEMENT = 37
def __init__(self, message_path: str, messaging, *args) -> None:
"""
"""
self.messaging = messaging
self.message_path = message_path
bus = dbus.SystemBus()
self.dbus_message = bus.get_object(dbus_name, self.message_path, True)
self.props = dbus.Interface(
self.dbus_message, dbus_interface=modem_dbus_props_iface)
self.props.connect_to_signal(
"PropertiesChanged",
handler_function=self.__message_property_changed__,
path_keyword='path',
member_keyword='member',
interface_keyword='interface',
destination_keyword='destination',
sender_keyword='sender')
self.modem_dbus_sms_iface = "org.freedesktop.ModemManager1.Sms"
self.sms = dbus.Interface(
self.dbus_message, dbus_interface=self.modem_dbus_sms_iface)
def send(self, message_path: str) -> None:
"""
"""
try:
logging.debug("Sending sms: %s", self.message_path)
self.sms.Send()
except dbus.exceptions.DBusException as error:
raise error
except Exception as error:
raise error
def __message_property_changed__(self, *args, **kwargs) -> None:
"""
"""
logging.debug("Message property changed - %s", args)
member = args[0]
change_props = args[1]
if ('State' in change_props
and
self.MMSmsState(change_props['State']) == self.MMSmsState.MM_SMS_STATE_RECEIVED):
self.messaging.broadcast_new_message(self)
"""
if ('State' in change_props
and
self.MMSmsState(change_props['State']) == self.MMSmsState.MM_SMS_STATE_SENT):
logging.debug("Delivery state: %s",
self.MMSmsDeliveryState(self.get_property("DeliveryState")))
"""
def is_sent_message(self) -> bool:
"""
"""
return self.MMSmsState(self.get_property('State')) == self.MMSmsState.MM_SMS_STATE_SENT
def is_unknown_message(self) -> bool:
"""
"""
return self.MMSmsState(self.get_property('State')) == self.MMSmsState.MM_SMS_STATE_UNKNOWN
def is_send_message(self) -> bool:
"""
PduType = 2
State = 0
"""
return (
self.MMSmsState(self.get_property('State')) ==
self.MMSmsState.MM_SMS_STATE_UNKNOWN and
self.MMSmsState(self.get_property('PduType')) ==
self.MMSmsPduType.MM_SMS_PDU_TYPE_SUBMIT)
def is_delivery_report_message(self) -> bool:
"""
"""
return (
self.MMSmsState(self.get_property('State')) ==
self.MMSmsState.MM_SMS_STATE_RECEIVED and
(self.MMSmsState(self.get_property('PduType')) ==
self.MMSmsPduType.MM_SMS_PDU_TYPE_STATUS_REPORT))
def get_property(self, property_name: str) -> None:
"""
"""
try:
return self.props.Get(self.modem_dbus_sms_iface, property_name)
except Exception as error:
raise error
def set_property(self, property_name: str, value: str) -> None:
"""
"""
try:
return self.props.Set(self.modem_dbus_sms_iface, property_name, value)
except Exception as error:
raise error
def new_received_message(self) -> tuple:
"""
"""
try:
text = self.get_property("Text")
number = self.get_property("Number")
timestamp = self.get_property("Timestamp")
except Exception as error:
logging.exception(error)
else:
return text, number, timestamp
def __is_receiving_message__(self) -> bool:
"""
"""
return (
self.MMSmsState(self.get_property("State"))
==
self.MMSmsState.MM_SMS_STATE_RECEIVING )
def __is_received_message__(self) -> bool:
"""
"""
"""
state = self.get_property(message_path, "State")
logging.debug("message state: %s", state)
"""
return (
self.MMSmsState(self.get_property("State"))
==
self.MMSmsState.MM_SMS_STATE_RECEIVED )