Comments (21)
Hi,
We made some changes to detect and raise an exception earlier for this, but it won't alter the fact that the len(PDU) is odd and we can't decode it currently. Can you post a valid sample PDU that is odd length, please? Perhaps then we can decode it manually and figure out just where we are going wrong.
Thanks,
Andrew
from python-messaging.
Hi Andrew,
thanks for your support. This is the one of the guilty PDUs.
0791933385280200040C9193335922759200000160012121138082416650DA0C8192649D7408938192ED725A37ABCD72371B2C46ABCD6A33DB0D444DB7CB3A192C0673C16CAE180C1483E962325D8C0632A6F13A1ACD65ABE56E33560CE6CAD96EB11B681AA6EB6EA0275C2793C96031D0B0CC66EB6C325B0D3
Tell me if I can help in any way.
Emiliano
from python-messaging.
Hi Emiliano,
Thanks, that's great, but it'll be a few days before I can pick this up, I've a deadline to meet on another project. Maybe if Pablo's available he might pick it up in the meantime.
Thanks,
Andrew
from python-messaging.
Hi Emiliano,
even though the GSM spec does not mention it, the PDU length (in chars) must be even. Why you might ask? Well, the PDU is made of octets right? And each octet is composed of two hexadecimal chars, thus the PDU must be a multiple of two. Look at this two examples of decoding a PDU:
Having said this, I fed PDUspy.exe with your PDU and was able to decode it. This however wasn't flawless, the User Data Length section reads: "130 septets (should be 108)". I really think there's something wrong with the PDUs that your modem produces, can yo reproduce that PDU with another modem/device and the very same text?
from python-messaging.
Hi Pablo,
for first, let me thank you for this incredible library, I am using it with great satisfacion (and I am also going to modify it to allow sending WAP push messages for my project, tell me something if you are interested).
About this issue, I feel you are completely right regarding the PDU length, it makes completely sense. I downloaded PDUspy and verified that it is able to decode it, but let me say that (knowing what the destination format should look like), the payload of the message is incomplete as it's missing something like 10 chars.
Thus, I diefinitely think that it's my modem fault, I will ask a replacement for a better modem.
However, wouldn't it be better that the library decodes the PDU even though the length is odd?
Thanks,
Emiliano
from python-messaging.
Hi Emiliano,
Thanks for the feedback. It would be good to know which make and model of modem you have so that we may note that it's not working correctly?
Thanks,
Andrew
from python-messaging.
Hi Andrew,
it would be a pleasure for me.
Producer: Digicom
Model: Pocket GPRS Micro
I want to specify that this is not a recurring error: yesterday I made a test run with more than 1200 messages, 8 per minutes, without seeing any error.
I will try the new one as soon as they send it and report the results here.
Emiliano
from python-messaging.
One more thing! Regarding PDU conversion, I also used this:
http://smartposition.nl/resources/sms_pdu.html
It includes an online converter, that gave me same results as PDUspy.
Emiliano
from python-messaging.
Hi Emiliano,
Is this the item, it looks like nice product, perhaps there is a firmware update available?
http://www.digicom.it/digisit/prodotti.nsf/ENProdottiIDX/PocketGPRSMicro
from python-messaging.
Hi Andrew,
the manufacturer is italian and we are in contact with the technical support chief, that is behaving very well on our behalf.
They already updated a firmware for us to fix a more annoying bug with this modem (it was stopping receiving sms after 250 SMS), but regarding this issue they told me they would prefer to move to another modem as they feel this would better manage the high amount of received messages that my project requires.
Emiliano
from python-messaging.
Hi Emiliano,
we would be very interested on those WAP changes, feel free to submit a patch (please include unittests :)
Regards,
Pablo
from python-messaging.
Oh by the way, I'm leaving this ticket open as I agree that it would be better to replicate PDUspy behaviour and try to decode as much as we can (perhaps printing a warning somewhere), thanks for the report Emiliano
from python-messaging.
Just wanted to inform you that manufacturer is sending me the other modem (should be a Pocket GPRS http://www.digicom.it/digisit/prodotti.nsf/79f0df8e243cd596c12564c0003de06b/c35603f5ace701c3c12574e300527e75?OpenDocument ).
About the issue, if I can suggest an hack for that, it would be enough to add a "0" or a "F" at the end of the PDU if length is odd.
from python-messaging.
Andrew, Emiliano: what do you think it would be the correct approach?
- Add a '0' to the PDU if odd-length: This adds a '@' at the end of the decoded text
- Add a 'F' to the PDU if odd-length: This adds a 'x' at the end of the decoded text
- pdu = pdu[0:-1](remove last char of the PDU and make it even)
I'm leaning towards 3), the other two approaches either return a character that wasn't there in the original text or complicates the code with a sentinel value that if true would remove the last character of the decoded text, thus logically equivalent to 3) albeit more complex. Thoughts?
Emiliano: Would you be cool if I add the PDU that you pasted some messages above to our unittest suite ?
from python-messaging.
The only problem of 3) is that it is likely that a legitimate original char disappears, am I wrong?
Well, it would be better to hide just the telephone numbers with fake ones like "12345678" converted in semi-octets, for the rest of the message no problem.
from python-messaging.
Pablo,
From my point of view I see what we have now as correct; to raise an exception, and let the caller decide what to do about the odd length packet. If we implement padding or trimming of the PDU, not only do we have to guess what to do, but we have to return an indication that possibly the message is truncated in some way. Also as these PDUs may be 7 bit encoded, are you sure that adding '0' or 'F' to the end always results in the same char being appended to the text? I can't remember exactly how the GSM seven bit encoding works, but adding or trimming possibly affects more than just the last char of the message(preceding one too?).
from python-messaging.
@Emiliano: the last char cannot be decoded anyway, so you either skip it or the last char of the decoded SMS will be garbage anyway. What is better? To decode ok 99% of the text or having that 99% OK + a random character?
@andrew: I also think that the current code is OK, but the fact that other decoders seem to be able to decode the PDU while we can't worries me a bit.
Regarding PDUspy decoder, it seems that it follows approach 3) as it does not add any garbage (it seems that the final char is decoded as ' ' thou). Regarding the smartposition.nl decoder, it seems it does something similar to approach 1) as the decoded SMS ends with "@¥"
Thinking about it, neither PDUspy nor the smartposition.nl are used as production decoders, they are just PDU "analyzers" for reference, thus they can return funky stuff as "length: 130 septets (should be 108)" or even making up the text as smartposition.nl, while we are a production encoder/decoder and we cannot return meaningless results.
What should we do then?
from python-messaging.
Pablo,
Maybe we have a 'strict=True' parameter to decode_pdu(), that callers can set to False to use your method 3. I see the caller doing:
try: msg = PDU.decode_pdu() except ValueError: msg = PDU.decode_pdu(strict=False)
Would that work?
from python-messaging.
I like the idea Andrew, @Emiliano thoughts ?
from python-messaging.
I like the idea of the "strict" parameters, it makes a lot of sense to me!
from python-messaging.
Thank you Emiliano and Andrew for your input, the fix has been pushed 936ab8f
from python-messaging.
Related Issues (20)
- decode multipart pdu message HOT 1
- Concatenating multi-part PDU HOT 3
- How send MMS from Modem Dongle USB?
- How get a MMS message? HOT 3
- Greek GSM chars to PDU example HOT 4
- sms.cnt and sms.seq HOT 4
- Multipart SMS with Huawei e220 HOT 3
- MMSEncoder has no attribute 'encode_boolean_value'
- installation instructions HOT 2
- utf-8' codec can't decode byte 0xff in position 0 HOT 1
- Solution to problems with Polish characters
- Issue in timestap HOT 1
- message with smiles HOT 6
- python-messaging Failed to handle HTTP request HOT 1
- sms.class = 0 invalid syntax
- MMSEncoder has no no Expiry Encoder HOT 2
- Cannot specify multiple recipients
- decode send .mms headers From Date error
- TypeError: super() argument 1 must be type, not classobj HOT 1
- How can to encode an MMS without smil and just img/txt dataparts?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from python-messaging.