2010-05-15 17:43 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)

* harbour.spec
  * contrib/Makefile
  + contrib/hbsms
  + contrib/hbsms/tests
  + contrib/hbsms/tests/send.prg
  + contrib/hbsms/tests/hbmk.hbm
  + contrib/hbsms/hbsms.prg
  + contrib/hbsms/hbsms.hbc
  + contrib/hbsms/Makefile
  * utils/hbmk2/examples/contribf.hbc
    + Readded hbsms lib.
    + Modified to use newly added core com functions
      via HBCT .prg level interface. (instead of hbtpathy)
    + Added disclaimer:
        EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES.
      The code well may be pure crap, so if you have problem
      with it, supply working patches. Pls note that the
      reader function uses locally implemented timeout
      functionality, which may or may not work at all,
      though you can fix it if you have better idea.
      I've only tested it using Mac OS X 10.6 + old Nokia "S40"
      phone and one bad SMS number to see it kicks off at
      all and that's also the end of my testing possibilities.
This commit is contained in:
Viktor Szakats
2010-05-15 15:47:11 +00:00
parent cafd33d5d9
commit 948023ab13
9 changed files with 390 additions and 2 deletions

View File

@@ -17,6 +17,31 @@
past entries belonging to author(s): Viktor Szakats.
*/
2010-05-15 17:43 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* harbour.spec
* contrib/Makefile
+ contrib/hbsms
+ contrib/hbsms/tests
+ contrib/hbsms/tests/send.prg
+ contrib/hbsms/tests/hbmk.hbm
+ contrib/hbsms/hbsms.prg
+ contrib/hbsms/hbsms.hbc
+ contrib/hbsms/Makefile
* utils/hbmk2/examples/contribf.hbc
+ Readded hbsms lib.
+ Modified to use newly added core com functions
via HBCT .prg level interface. (instead of hbtpathy)
+ Added disclaimer:
EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES.
The code well may be pure crap, so if you have problem
with it, supply working patches. Pls note that the
reader function uses locally implemented timeout
functionality, which may or may not work at all,
though you can fix it if you have better idea.
I've only tested it using Mac OS X 10.6 + old Nokia "S40"
phone and one bad SMS number to see it kicks off at
all and that's also the end of my testing possibilities.
2010-05-15 15:17 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* src/rtl/gtwvt/gtwvt.c
- Deleted notifierblock/fireevent support.

View File

@@ -21,6 +21,7 @@ DIRS := \
hbnetio \
hbnf \
hbodbc \
hbsms \
hbsqlit3 \
hbtip \
hbtpathy \

View File

@@ -0,0 +1,14 @@
#
# $Id: Makefile 12881 2009-11-15 04:31:21Z vszakats $
#
ROOT := ../../
include $(TOP)$(ROOT)config/global.mk
LIBNAME := hbsms
PRG_SOURCES := \
hbsms.prg \
include $(TOP)$(ROOT)config/lib.mk

View File

@@ -0,0 +1,9 @@
#
# $Id: hbsms.hbc 12881 2009-11-15 04:31:21Z vszakats $
#
incpaths=.
libs=hbsms
libs=../hbct/hbct.hbc

View File

@@ -0,0 +1,308 @@
/*
* $Id: hbsms.prg 13863 2010-02-13 17:32:18Z vszakats $
*/
/*
* Harbour Project source code:
* SMS library. EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES.
*
* Copyright 2009-2010 Viktor Szakats (harbour.01 syenar.hu)
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
/* TODO: - Unicode support */
/* TODO: - Receive support */
/* NOTE: Source of information:
http://www.smssolutions.net/tutorials/gsm/receivesmsat/
http://www.developershome.com/sms/readSmsByAtCommands.asp
[vszakats] */
#include "common.ch"
STATIC FUNCTION port_send( h, s )
RETURN com_send( h, s )
/* NOTE: EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES. */
STATIC FUNCTION port_rece( h, n, t )
LOCAL cString
LOCAL nEnd
IF ! ISNUMBER( n )
n := 64
ENDIF
IF ! ISNUMBER( t )
t := 5
ENDIF
cString := ""
nEnd := hb_milliSeconds() + ( t * 1000 )
DO WHILE Len( cString ) < t .AND. hb_milliSeconds() < nEnd
cString += com_read( h, n - Len( cString ) )
hb_idleSleep( 0.01 )
ENDDO
RETURN cString
FUNCTION sms_Send( cPort, cPhoneNo, cText, lNotification, cPIN )
LOCAL smsctx
LOCAL nRetVal
IF ! Empty( smsctx := smsctx_New( cPort ) )
smsctx_PIN( smsctx, cPIN )
nRetVal := smsctx_Send( smsctx, cPhoneNo, cText, lNotification )
smsctx_Close( smsctx )
ELSE
nRetVal := -99
ENDIF
RETURN nRetVal
FUNCTION sms_ReceiveAll( cPort, cPIN )
LOCAL smsctx
LOCAL aRetVal
IF ! Empty( smsctx := smsctx_New( cPort ) )
smsctx_PIN( smsctx, cPIN )
aRetVal := smsctx_Receive( smsctx )
smsctx_Close( smsctx )
ELSE
aRetVal := NIL
ENDIF
RETURN aRetVal
/* --------------------- */
#define _SMSCTX_xHnd 1
#define _SMSCTX_cPIN 2
#define _SMSCTX_cPrevName 3
#define _SMSCTX_MAX_ 3
FUNCTION smsctx_New( xPort )
LOCAL smsctx[ _SMSCTX_MAX_ ]
IF ISNUMBER( xPort )
smsctx[ _SMSCTX_xHnd ] := xPort
smsctx[ _SMSCTX_cPrevName ] := NIL
ELSEIF ISCHARACTER( xPort )
smsctx[ _SMSCTX_xHnd ] := 1
smsctx[ _SMSCTX_cPrevName ] := com_DevName( smsctx[ _SMSCTX_xHnd ], xPort )
ELSE
smsctx[ _SMSCTX_xHnd ] := NIL
ENDIF
IF smsctx[ _SMSCTX_xHnd ] != NIL
IF com_Open( smsctx[ _SMSCTX_xHnd ] )
IF com_Init( smsctx[ _SMSCTX_xHnd ], 9600, "N", 8, 1 )
RETURN smsctx
ELSE
com_Close( smsctx[ _SMSCTX_xHnd ] )
ENDIF
ENDIF
ENDIF
RETURN NIL
FUNCTION smsctx_Close( smsctx )
IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_
RETURN .F.
ENDIF
IF ! com_Close( smsctx[ _SMSCTX_xHnd ] )
RETURN .F.
ENDIF
/* Restore com port name */
IF smsctx[ _SMSCTX_cPrevName ] != NIL
com_DevName( smsctx[ _SMSCTX_xHnd ], smsctx[ _SMSCTX_cPrevName ] )
ENDIF
RETURN .T.
FUNCTION smsctx_Send( smsctx, cPhoneNo, cText, lNotification )
LOCAL tmp
IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_
RETURN -1
ENDIF
port_send( smsctx[ _SMSCTX_xHnd ], "ATE0V1Q0" + Chr( 13 ) )
IF IsOK( port_rece( smsctx[ _SMSCTX_xHnd ] ) )
port_send( smsctx[ _SMSCTX_xHnd ], "AT+CMGF=1" + Chr( 13 ) )
IF StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK"
IF ! Empty( smsctx[ _SMSCTX_cPIN ] )
port_send( smsctx[ _SMSCTX_xHnd ], 'AT+CPIN="' + smsctx[ _SMSCTX_cPIN ] + '"' + Chr( 13 ) )
IF !( StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK" )
RETURN -5
ENDIF
ENDIF
port_send( smsctx[ _SMSCTX_xHnd ], "AT+CMGF=1" + Chr( 13 ) )
IF StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK"
IF ISLOGICAL( lNotification )
port_send( smsctx[ _SMSCTX_xHnd ], "AT+CSMP?" + Chr( 13 ) )
tmp := GetLines( port_rece( smsctx[ _SMSCTX_xHnd ] ) )
IF Len( tmp ) < 2
RETURN -6
ENDIF
IF !( ATail( tmp ) == "OK" )
RETURN -7
ENDIF
IF !( Left( tmp[ 1 ], Len( "+CSMP: " ) ) == "+CSMP: " )
RETURN -8
ENDIF
tmp := GetList( SubStr( tmp[ 1 ], Len( "+CSMP: " ) + 1 ) )
IF Len( tmp ) > 1
IF lNotification
tmp[ 1 ] := hb_ntos( hb_bitSet( Val( tmp[ 1 ] ), 5 ) )
ELSE
tmp[ 1 ] := hb_ntos( hb_bitReset( Val( tmp[ 1 ] ), 5 ) )
ENDIF
port_send( smsctx[ _SMSCTX_xHnd ], "AT+CSMP=" + MakeList( tmp ) + Chr( 13 ) )
IF !( StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK" )
RETURN -9
ENDIF
ENDIF
ENDIF
port_send( smsctx[ _SMSCTX_xHnd ], 'AT+CMGS="' + cPhoneNo + '"' + Chr( 13 ) )
IF StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "> "
port_send( smsctx[ _SMSCTX_xHnd ], StrTran( cText, Chr( 13 ) ) + Chr( 26 ) )
tmp := StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) )
IF Left( tmp, Len( "+CMGS: " ) ) == "+CMGS: "
RETURN 0
ELSE
RETURN -10
ENDIF
ELSE
RETURN -11
ENDIF
ELSE
RETURN -12
ENDIF
ELSE
RETURN -4
ENDIF
ELSE
RETURN -3
ENDIF
RETURN -2
FUNCTION smsctx_Receive( smsctx )
IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_
RETURN NIL
ENDIF
// ...
RETURN {}
FUNCTION smsctx_PIN( smsctx, cPIN )
LOCAL cOldValue
IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_
RETURN NIL
ENDIF
cOldValue := smsctx[ _SMSCTX_cPIN ]
IF cPIN == NIL .OR. ( ISCHARACTER( cPIN ) .AND. Len( cPIN ) == 4 )
smsctx[ _SMSCTX_cPIN ] := cPIN
ENDIF
RETURN cOldValue
STATIC FUNCTION StripCR( cString )
RETURN StrTran( cString, Chr( 13 ) )
STATIC FUNCTION StripCRLF( cString )
RETURN StrTran( cString, Chr( 13 ) + Chr( 10 ) )
STATIC FUNCTION IsOK( cString )
LOCAL tmp := GetLines( cString )
RETURN ! Empty( tmp ) .AND. ATail( tmp ) == "OK"
STATIC FUNCTION GetLines( cString )
LOCAL aLine := {}
LOCAL tmp
IF Left( cString, 2 ) == Chr( 13 ) + Chr( 10 )
cString := SubStr( cString, Len( Chr( 13 ) + Chr( 10 ) ) + 1 )
ENDIF
IF Right( cString, 2 ) == Chr( 13 ) + Chr( 10 )
cString := hb_StrShrink( cString, Len( Chr( 13 ) + Chr( 10 ) ) )
ENDIF
FOR EACH tmp IN hb_ATokens( StrTran( cString, Chr( 13 ) ), Chr( 10 ) )
AAdd( aLine, tmp )
NEXT
RETURN aLine
STATIC FUNCTION GetList( cString )
LOCAL aList := {}
LOCAL tmp
FOR EACH tmp IN hb_ATokens( cString, "," )
AAdd( aList, tmp )
NEXT
RETURN aList
STATIC FUNCTION MakeList( aList )
LOCAL cString := ""
LOCAL tmp
FOR EACH tmp IN aList
cString += tmp + ","
NEXT
RETURN hb_StrShrink( cString, 1 )

View File

@@ -0,0 +1,7 @@
#
# $Id: hbmk.hbm 12880 2009-11-15 04:22:05Z vszakats $
#
../hbsms.hbc
-w3 -es2

View File

@@ -0,0 +1,24 @@
/*
* $Id: send.prg 12880 2009-11-15 04:22:05Z vszakats $
*/
/*
* Copyright 2009-2010 Viktor Szakats (harbour.01 syenar.hu)
* www - http://www.harbour-project.org
*/
#include "common.ch"
PROCEDURE Main( cPort )
#if defined( __PLATFORM__WINDOWS )
DEFAULT cPort TO "\\.\COM22"
#elif defined( __PLATFORM__DARWIN )
DEFAULT cPort TO "/dev/cu.myport-COM1-1"
#endif
? "start"
? sms_Send( cPort, "555555555", "test msg", .T. )
? "end"
RETURN

View File

@@ -69,7 +69,7 @@
%define hb_ldir export HB_LIB_INSTALL=%{_libdir}/%{name}
%define hb_edir export HB_ETC_INSTALL=%{hb_etcdir}
%define hb_cmrc export HB_BUILD_NOGPLLIB=%{?_without_gpllib:yes}
%define hb_ctrb export HB_CONTRIBLIBS="hbblink hbbtree hbclipsm hbct hbgt hbmisc hbmzip hbnetio hbtip hbtpathy hbhpdf hbziparc hbfoxpro hbfship hbxpp xhb rddbmcdx rddsql sddsqlt3 hbnf %{?_with_allegro:gtalleg} %{?_with_cairo:hbcairo} %{?_with_cups:hbcups} %{?_with_curl:hbcurl} %{?_with_firebird:hbfbird sddfb} %{?_with_freeimage:hbfimage} %{?_with_gd:hbgd} %{?_with_mysql:hbmysql sddmy} %{?_with_odbc:hbodbc sddodbc} %{?_with_pgsql:hbpgsql sddpg} %{?_with_qt:hbqt hbxbp} %{?_with_ads:rddads}"
%define hb_ctrb export HB_CONTRIBLIBS="hbblink hbbtree hbclipsm hbct hbgt hbmisc hbmzip hbnetio hbtip hbtpathy hbhpdf hbziparc hbfoxpro hbsms hbfship hbxpp xhb rddbmcdx rddsql sddsqlt3 hbnf %{?_with_allegro:gtalleg} %{?_with_cairo:hbcairo} %{?_with_cups:hbcups} %{?_with_curl:hbcurl} %{?_with_firebird:hbfbird sddfb} %{?_with_freeimage:hbfimage} %{?_with_gd:hbgd} %{?_with_mysql:hbmysql sddmy} %{?_with_odbc:hbodbc sddodbc} %{?_with_pgsql:hbpgsql sddpg} %{?_with_qt:hbqt hbxbp} %{?_with_ads:rddads}"
%define hb_env %{hb_plat} ; %{hb_cc} ; %{hb_cflag} ; %{hb_lflag} ; %{hb_dflag} ; %{hb_gpm} ; %{hb_crs} ; %{hb_sln} ; %{hb_x11} ; %{hb_local} ; %{hb_bdir} ; %{hb_idir} ; %{hb_ldir} ; %{hb_edir} ; %{hb_ctrb} ; %{hb_cmrc}
%define hb_host www.harbour-project.org
%define readme README.RPM

View File

@@ -6,7 +6,7 @@
# [ This should be kept in sync with local Makefile information. ]
# contribs portable, with no external dependencies:
libs=hbblink hbbtree hbclipsm hbct hbfoxpro hbfship hbgt hbmisc hbmzip minizip hbnf hbtpathy hbxpp hbziparc rddbmcdx rddsql xhb
libs=hbblink hbbtree hbclipsm hbct hbfoxpro hbfship hbgt hbmisc hbmzip minizip hbnf hbsms hbtpathy hbxpp hbziparc rddbmcdx rddsql xhb
# contribs portable, with external dependencies:
libs=hbcurl hbfbird hbgd hbhpdf hbmysql hbpgsql hbqt hbtip sddfb sddmy sddpg