Author |
Post |
|
#1 Sun Jun 04, 2017 14:19, 93 months ago.
|
Member
Registered: Jun 2017
Location: Russian Federation
|
Operating system name and version: OpenWRT CHAOS CALMER (15.05, r46767) Version of smsd: 3.1.15 Smsd installed from: package repository Name and model of a modem / phone: Huawei E3276 Interface: USB First of all, keke, I think you've created a swiss-army knife for modem handling and would like to thank you for this! A lot! Awesome work! 2 keke and all: Smstool3 do helping me to solve my task, which is: notifying of incoming SMS messages and making USSD-request one per 24 hours to check a reminder of money on my SIM-car installed in Huawei E3276 modem connected to OpenWRT-driver router. My main problem is PDU or GSM-7 decoding of cyrillic text. Thanks to The Author, smstools3 do able to convert USSD messages by it's own means. According to teh documentation we've got two main ussd_convert options(2 and 4). When I'm using ussd_convert = 2, I cannot convert a result of this internal conversion by all power of iconv. When I'm using ussd_convert = 4, I'm successfully getting all digits in USSD message, but cannot decode text either. However, I'm successfully convert all cyrillic SMS from USC-2 to UTF-8 by iconv(see eventhandler below) I've tried a lot of combinations doing the same with smstool-decoded text, but failed at it. My last solution is to use ussd_convert = 4, then just to throw out all characters except first five, which contains only digits of my remaining balance. But this solution is kinda wierd and temporary, so the question is: what coding must I use as a source when passing smstool-decoded text to iconv? or what algorithm must I use to get from PDU message to readable UTF-8? please help! Here's my smsd.conf: devices = GSM1 outgoing = /var/spool/sms/outgoing checked = /var/spool/sms/checked incoming = /var/spool/sms/incoming logfile = /var/log/smsd.log loglevel = 5 infofile = /var/run/smstools/smsd.working pidfile = /var/run/smstools/smsd.pid outgoing = /var/spool/sms/outgoing checked = /var/spool/sms/checked failed = /var/spool/sms/failed incoming = /var/spool/sms/incoming sent = /var/spool/sms/sent #stats = /var/log/smsd_stats receive_before_send = no autosplit = 3 keep_filename = no #decode_unicode_text = yes #incoming_utf8 = yes
[GSM1] device = /dev/ttyUSB1 incoming = yes baudrate = 9600 loglevel_lac_ci = 8 check_memory_method = 4 init = ATZ #init2 = AT+CMSS="ME","ME","ME" #init2 = AT+CNMI=1,1,0,2 regular_run_cmd = AT+CUSD=1,"AA184C3602",15; regular_run_interval = 43200 ussd_convert = 4 eventhandler = /etc/smsd/smsdeh.sh eventhandler_ussd = /etc/smsd/smsdeh.sh 'smsdconf' Syntax Highlight powered by GeSHi And here's my eventhandler: #!/bin/sh status="$1" file="$2" msgbody="/var/log/sms.log" if [ -f "$msgbody" ] then rm -f $msgbody touch $msgbody fi
ussdbody="/var/log/ussd.log" if [ -f "$ussdbody" ] then rm -f $ussdbody fi
case "$1" in RECEIVED)
head -12 $file | grep -e "^From: " -e "^Sent: " -e "^Received: " >> $msgbody if grep "Alphabet: UCS2" $file >/dev/null; then tail +13 $file | iconv -f UCS-2 -t UTF-8 >> $msgbody else tail +13 $file >> $msgbody fi echo >> $msgbody mailsend -f --------- -t ---------- -smtp smtp.gmail.com -starttls \ -cs "utf-8" -user -------- -pass ------- -auth-plain -sub "SMS was received" -msg-body $msgbody ;; USSD)
ussd=$(head -5 $file | sed 's/^.*\/\///' | sed 's/ //' | cut -c-5) echo ".............. ............: "$ussd" ............" >> $ussdbody mailsend -f --------- -t ---------- -smtp smtp.gmail.com -starttls \ -cs "utf-8" -user -------- -pass ------- -auth-plain -sub "Balance check results" -msg-body $ussdbody
;; esac 'bash' Syntax Highlight powered by GeSHi
|
|
#2 Sun Jun 04, 2017 14:31, 93 months ago.
|
Member
Registered: Jun 2017
Location: Russian Federation
Topic owner
|
Very important notice! Here's a sample of a reply, received from my modem: When I'm using Smstool3 PDU converter http://smstools3.kekekasvi.com/topic.php?id=288 and tick "GSM 7bit packed" I'm getting the same(on my sight) result which I'm able to get with ussd_convert = 2. When I tick "UCS2" radiobutton - I'm getting exactly what I need! Ok, - I decided, - I'll use ussd_convert = 2, then I'll pass converted message to iconv -f USC-2 -t UTF-8 - and I was wrong in this suggestion, getting a garbage again. Dear keke, since you've programmed and have built this converter to your site, you know what exactly it does when I tick UCS-2 button before I press Convert. Please enlighten me!
|
|
#3 Sun Jun 04, 2017 15:12, 93 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
Thank you for choosing this software!
It looks like some operator has changed the answer for USSD, and therefore version 3.1.15 does not handle it properly.
You need to install smsd version 3.1.21. I do not know if it's available in the repository. Likely you need to compile it from sources.
With the version 3.1.21 use the setting ussd_convert = 1.
|
|
#4 Sun Jun 04, 2017 22:58, 93 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
If you cannot upgrade smsd on OpenWRT, you could try the following: Use ussd_convert = 4, so you can get eventhandler called. Also use regular_run_statfile = /var/log/ussd.stat. This file is created each time when USSD answer is received and it contains only the latest answer. The file exists when eventhandler is called, later it is deleted. In your eventhandler do the following: tmp=`cat /var/log/ussd.stat | awk -v FS="(CUSD: 0,\"|\",72)" '{print $2}' | sed 's/../\\\x&/g'` answer=`echo -n -e "$tmp" | iconv -f UCS-2BE -t UTF-8` 'bash' Syntax Highlight powered by GeSHi If this does not work, please show the /var/log/ussd.stat. My testing was (on Ubuntu, not on OpenWRT):
|
|
#5 Sun Jun 18, 2017 04:56, 93 months ago.
|
Member
Registered: Jun 2017
Location: Russian Federation
Topic owner
|
Thanks a lot, keke, it works! And you're a genius! However, you've probably mistyped when instructed me to use ussd_convert = 4. Your receipt works perfectly, but with ussd_convert = 2. With this parameter I've replicated your solution with success! Then I've commented out regular_run_statfile = /var/log/ussd.stat from smsd.conf and changed eventhandler script to the following: # now we don't need to use any additional files, so file="$2" argument to eventhandler is pretty enough tmp=$(head -5 $file | awk -v FS="(CUSD: 0,\"|\",72)" '{print $2}' | sed 's/../\\\x&/g') # or if we like sed as I do )) tmp=$(head -5 $file | sed 's/^.*+CUSD: 0,"//' | sed 's/",72.*//' | sed 's/../\\\x&/g') tmp2=$(echo -n -e $tmp | iconv -f UCS-2BE -t UTF-8) # the rest of USSD message is adevertising garbage so we don't need it to be redirected to our clean and shiny mailbox ussd=$(echo -n -e $tmp2 | cut -c-9) echo "Current reminder is: "$ussd >> $ussdbody mailsend -f --------- -t ---------- -smtp smtp.gmail.com -starttls \ -cs "utf-8" -user -------- -pass ------- -auth-plain -sub "Balance check results" -msg-body $ussdbody 'bash' Syntax Highlight powered by GeSHi
|
|
#6 Sun Jun 18, 2017 05:16, 93 months ago.
|
Member
Registered: Jun 2017
Location: Russian Federation
Topic owner
|
keke wrote Thank you for choosing this software!
It looks like some operator has changed the answer for USSD, and therefore version 3.1.15 does not handle it properly.
You need to install smsd version 3.1.21. I do not know if it's available in the repository. Likely you need to compile it from sources.
With the version 3.1.21 use the setting ussd_convert = 1.
Unfortunately, OpenWRT freshest repos does have smstools3 3.1.15 only. And, as you absolutely right, the only way is to build 3.1.21 from source. Once decided, we have two ways to do this: (1) - straight on our OpenWRT hardware and it's really-really hard if you even have powerful router (2) - cross-compiling, which is easy if you build your firmware right form a source. Fortunately, I've did it before and can do it again in a short time and post here a guide and package itself. But, I'm lazy, the problem is solved and I, in particular, don't need newer version. However, I can do this for the community here. What do you think, should I?
|
|
#7 Sun Jun 18, 2017 05:34, 93 months ago.
|
Member
Registered: Jun 2017
Location: Russian Federation
Topic owner
|
I'm unable to edit my prevoius post so I have to apology! keke you're not mistyped, we can use as ussd_convert = 4 so ussd_convert = 2. Moreover, we may not use smstools3 internal conversion at all, because once USSD received, we're dealing with PDU message itself.
|
|
#8 Sun Jun 18, 2017 23:17, 93 months ago.
|
Member
Registered: Jun 2017
Location: Russian Federation
Topic owner
|
Well, I made a cross-compilation of the pacakge while building a new firmware. Here's a Makefile: include $(TOPDIR)/rules.mk
PKG_NAME:=smstools3 PKG_VERSION:=3.1.21 PKG_RELEASE:=1
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/smstools3 SECTION:=utils CATEGORY:=Utilities TITLE:=Sms Server Tools 3 URL:=http://smstools3.kekekasvi.com DEPENDS:=+libiconv-full endef
define Package/smstools3/description The SMS Server Tools 3 is a SMS Gateway software which can send and receive short messages through GSM modems and mobile phones. endef
define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ # comment this out if you don't want to change anything in original smstools3 Makefile $(Build/Patch) endef
define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC=$(TARGET_CC) \ USER_CFLAGS='$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS) -I$(STAGING_DIR)/usr/lib/libiconv-full/include' \ USER_LDFLAGS='$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS) -L$(STAGING_DIR)/usr/lib/libiconv-full/lib' endef
define Package/smstools3/install $(INSTALL_DIR) $(1)/usr/local/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/smsd $(1)/usr/local/bin/ $(INSTALL_DATA) ./scripts/sendsms $(1)/usr/local/bin/ $(INSTALL_DATA) ./scripts/sms2unicode $(1)/usr/local/bin/ $(INSTALL_DATA) ./scripts/unicode2sms $(1)/usr/local/bin/ # $(INSTALL_DIR) $(1)/usr/share/smstools3/examples # $(INSTALL_DATA) ./examples/* $(1)/usr/share/smstools3/examples/ $(INSTALL_DIR) $(1)/etc/ $(INSTALL_DATA) ./examples/smsd.conf.non-root $(1)/etc/smsd.conf endef
$(eval $(call BuildPackage,smstools3)) 'make' Syntax Highlight powered by GeSHi A short HOWTO 2 all, whom it may concern: Download tarball from this site, and extract it as is to openwrt/packages/utils/smstool3 Create Makefile there with the contents above. Note, that every line cannot begin with a space(s), so substitute any leading spaces to Tab(s) after copy/paste. Since I've always wanted to use ussd_convert = 1, I added +CFLAGS += -D USE_ICONV to the project's Makefile( which is inside the ./src/) If you don't want to change any option at Makefile, pls comment out $(Build/Patch) string from openWRT Makefile. If you didn't do any changes in the project's Makefile, you may substitute Build/Compile section to the following: define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC="$(TARGET_CC)" \ CFLAGS="$(TARGET_CFLAGS) -Wall" \ LDFLAGS="$(TARGET_LDFLAGS)" endef 'make' Syntax Highlight powered by GeSHi 2 kekeIf you'd transfer your project to github, it can be possible to fully automate the process of compilation/integration of a new version using this(for ex.): PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=http://git.openwrt.org/project/smstools3.git ..... etc. Of course we may automate the build process with PKG_DATA_FILENAME:=, but in this case we need to manually edit Makefile each time new version is coming out. « Last edit by blakman on Sun Jun 18, 2017 23:20, 93 months ago. »
|