PDA

View Full Version : ارسال پیامک فارسی با دستورات AT



Reza Safa
شنبه 23 مهر 1390, 10:30 صبح
با سلام
من ارسال پیامک به صورت فارسی را با استفاده از دستورات AT نیاز دارم
گفتنی است که در این سایت جستجو صورت گرفته و نتیجه برای حل این مساله نبوده است
لازم به ذکر است که از OCX , DLL معروف که در سایت ذکر شده نمی خواهم استفاده کنم
فقط وفقط دستورات AT

sina_saravi1
یک شنبه 24 مهر 1390, 00:10 صبح
اتفاقا منم نیاز دارم

sina_saravi1
دوشنبه 25 مهر 1390, 13:25 عصر
روش استفادش رو هم میگفتین خیلی خب بود

M.KH-SH
سه شنبه 26 مهر 1390, 17:11 عصر
میشه یک پروژه بدی
من الان چند وقت هست دنبال میگردم که هم بتونم اس ام اس بزنم و هم بگیرم از طریق کامپیوتر

Reza Safa
دوشنبه 09 آبان 1390, 10:29 صبح
خواهشن کسی در مورد این سوال کمک کنه

arash020
دوشنبه 09 آبان 1390, 23:33 عصر
سلام
باید با PDU emcoding , decoding آشنا بشی
یه کم درموردشون تو سایت های زبان اصلی و فارسی تحقیق کن
من هم دنبالش هستم ولی کار چنذلن راحتی نیست
اگه با قالب و انواع و روش های کدگذاری و گشایی pdu آشنا شی متوجه میشی
هیچی غیرممکن نیس اونم برای ایرانی
موافقی ابا هم اون ocx رو طراحی کنیم
یه سری به http://www.eaglevb.blogfa.com/ بزن
یه نمونه برنامه کوچیک همراه راهنمای کامل دستورات at هست گذاشتم شاید مفیدت باشه

sina_saravi1
دوشنبه 09 آبان 1390, 23:37 عصر
ولی من هر چی بیشتر پی گیر این موضوع شدم دیدم ارزش نداره وقتمون رو برای GSM Modem هدر بدیم
چون سرعتش خیلی پایینه و محدودیتش بالا!
به نظر من این گزینه رو باید بی خیال شیم و بریم دنبال گزینه های بهتر مثل وب سرویس ها

Reza Safa
یک شنبه 15 آبان 1390, 11:20 صبح
راه حل pdu کردن پیفام sms
البته باید از دوست عزیزم دانیال تشکر کنم که در این زمینه کمکم کرد
http://www.gsm-modem.de/sms-pdu-mode.html
Class pduss


Public Function IsValidPhone(ByVal PhoneNo As String) As Boolean
IsValidPhone = False

Dim S As String
S = PhoneNo
If Len(S) < 3 Or Len(S) > 20 Then Exit Function
Dim L As Integer
If Left(PhoneNo, 1) = "+" Then S = Right(PhoneNo, Len(PhoneNo) - 1)
For L = 1 To Len(S)
If Not ((IsNumeric(Mid(S, L, 1))) Or (Mid(S, L, 1) = "p")) Then Exit Function
Next
IsValidPhone = True

End Function
Public Function Is7Bit(ByVal Str As String) As Boolean
Dim S As String
Dim L As Integer
Dim L2 As Long
Dim B As Boolean


Is7Bit = False
If Str = "" Then Exit Function
If IsUTF8(Str) Then
B = False
For L = 1 To Len(Str)
If Not (B) Then
S = Mid(Str, L, 1)
L2 = (AscW(S) And &H80)
If L2 <> 0 Then B = True
End If ' if not b
Next
Is7Bit = Not (B)
End If
End Function

Public Function IsUTF8(ByVal Str As String) As Boolean
Dim S As String
Dim L As Integer
Dim L2 As Long
Dim B As Boolean


IsUTF8 = False
If Str = "" Then Exit Function
B = False
For L = 1 To Len(Str)
'If Not (B) Then
S = Mid(Str, L, 1)
If AscW(S) < 0 Then Exit Function
L2 = (AscW(S) And &HFF00) \ &H100
If L2 <> 0 Then Exit Function
'End If ' if not b
Next
IsUTF8 = True

End Function
Public Function IsHexDigit(ByVal Str As String) As Boolean
Dim S As String
Dim L As Integer
Dim B As Boolean
Dim B2 As Boolean

IsHexDigit = False
If Str = "" Then Exit Function
B = False
For L = 1 To Len(Str)
If Not (B) Then
S = Mid(Str, L, 1)
B2 = False
If (Asc(S) >= Asc("0")) And (Asc(S) <= Asc("9")) Then B2 = True
If (Asc(UCase(S)) >= Asc("A")) And (Asc(UCase(S)) <= Asc("F")) Then B2 = True
B = Not (B2)
End If ' if not b
Next
IsHexDigit = Not (B)
End Function

Public Function HexChar(ByVal N As Long) As String
If (Len(Hex(N)) Mod 2 <> 0) Then HexChar = "0" & Hex(N) Else HexChar = Hex(N)
End Function

Public Function Char2Hex(ByVal Str As String) As String
Dim S As String

Dim hs As Long
Dim H As Long
Dim L As Long
Char2Hex = ""
If Str = "" Then Exit Function
S = Mid(Str, 1, 1)
hs = AscW(S)
If hs < 0 Then hs = &H10000 + hs
H = (hs And &HFF00) \ &H100
L = hs And &HFF
Char2Hex = HexChar(H) & HexChar(L)
'Char2Hex = HexChar(AscW(S))
End Function
Public Function Phone_IsUCS(ByVal S As String) As Boolean

If Len(S) < 10 Then
Phone_IsUCS = False
Exit Function
End If

If (Left(S, 2) = "80") And (UCase(Right(S, 4)) = "FFFF") Then
Phone_IsUCS = IsHexDigit(S)
Else
Phone_IsUCS = False
End If
End Function

Public Function Phone_Str2UCS(ByVal Str As String) As String
'add 80 & ffff
Dim S As String
Dim L As Integer
Phone_Str2UCS = ""
S = ""
If Str = "" Then Exit Function
For L = 1 To Len(Str)
S = S & Char2Hex(Mid(Str, L, 1))
Next
Phone_Str2UCS = "80" & S & "FFFF"

End Function

Public Function HexDigitVal(ByVal H As String) As Integer
HexDigitVal = 0
If (Len(H) > 1) Or (H = "") Then Exit Function
If Not IsHexDigit(H) Then Exit Function
Select Case H
Case "0" : HexDigitVal = 0
Case "1" : HexDigitVal = 1
Case "2" : HexDigitVal = 2
Case "3" : HexDigitVal = 3
Case "4" : HexDigitVal = 4
Case "5" : HexDigitVal = 5
Case "6" : HexDigitVal = 6
Case "7" : HexDigitVal = 7
Case "8" : HexDigitVal = 8
Case "9" : HexDigitVal = 9
Case "A" : HexDigitVal = 10
Case "B" : HexDigitVal = 11
Case "C" : HexDigitVal = 12
Case "D" : HexDigitVal = 13
Case "E" : HexDigitVal = 14
Case "F" : HexDigitVal = 15
End Select

End Function

Public Function HexChar2Char(ByVal H As String) As String
HexChar2Char = ""
Dim S As String
Dim L As Long
Dim Lp As Integer
If Not IsHexDigit(H) Then Exit Function
If Len(H) <> 4 Then Exit Function
L = 0
For Lp = 1 To 4
L = L * &H10
L = L + HexDigitVal(Mid(H, Lp, 1))
Next
HexChar2Char = ChrW(L)
End Function

Public Function Phone_UCS2Str(ByVal S As String) As String
'strip off 80 & ffff
Phone_UCS2Str = ""
If Not Phone_IsUCS(S) Then Exit Function
Dim St As String
St = Left(S, Len(S) - 4) 'strip ffff
St = Right(St, Len(St) - 2) 'strp 80
Dim L As Integer
Dim Done As Boolean
Dim Str As String
Done = False
L = 0
Str = ""
While Not Done
Str = Str & HexChar2Char(Mid(St, 1 + L, 4))
L = L + 4
If L > Len(St) Then Done = True
End While
Phone_UCS2Str = Str
End Function


'PDU Functions....
Public Function Make7Bit2Octet(ByVal Str As String) As String
Dim L As Integer
Dim NextChar As Integer
Dim S As String
Dim Res As String
Dim cd As Integer
Dim ch1 As Integer
Dim ch2 As Integer
Dim Lp As Integer
Dim cnt As Integer
Dim AndNum As Integer
Dim OrNum As Integer
Dim OredMask As Integer

Make7Bit2Octet = ""
If Str = "" Then Exit Function
AndNum = &H7F
OrNum = &H1
OredMask = 0
Res = ""
cnt = 1

For L = 1 To Len(Str)

If L = Len(Str) Then NextChar = 0 Else NextChar = AscW(Mid(Str, L + 1, 1))
S = Mid(Str, L, 1)


ch1 = (AndNum And AscW(S)) 'used asc earlier
For Lp = 1 To cnt - 1
ch1 = ch1 \ 2
Next
OredMask = OredMask Or OrNum
ch2 = OredMask And NextChar
For Lp = 1 To (8 - cnt)
ch2 = ch2 * 2
Next

cd = ch2 Or ch1
Res = Res & HexChar(cd) 'hexchar should convert number to hex

'AndNum = AndNum \ 2 ' integer divide instead of /
OrNum = OrNum * 2
cnt = cnt + 1
If cnt = 8 Then
'AndNum = &H7F
OrNum = &H1
OredMask = 0
cnt = 1
L = L + 1
End If
Next
Make7Bit2Octet = Res
End Function

Public Function GetSemiOctet(ByVal Str As String) As String
'assumes input is digits string only
Dim S As String
Dim L As Integer
Dim Res As String

GetSemiOctet = ""
If Str = "" Then Exit Function

S = Str
Res = ""
If (Len(Str) Mod 2) <> 0 Then S = S & "F"
For L = 1 To Len(S) Step 2
Res = Res & Mid(S, L + 1, 1) & Mid(S, L, 1)
Next
GetSemiOctet = Res
End Function

Public Function MakeOctetTo7Bit(ByVal Str As String) As String
Dim Res As String
Dim S As String
Dim PrevChar As Integer
Dim CurChar As Integer
Dim L As Integer
Dim ch1 As Integer
Dim ch2 As Integer
Dim AndNum As Integer
Dim cnt As Integer
Dim Lp As Integer


MakeOctetTo7Bit = ""
If (Str = "") Or (Len(Str) Mod 2 <> 0) Then Exit Function
S = ""
For L = 1 To Len(Str) Step 2
'make char string s of characters
S = S & ChrW(HexDigitVal(Mid(Str, L, 1)) * &H10 + HexDigitVal(Mid(Str, L + 1, 1)))
'previously used chr
Next

Res = ""
AndNum = &H7F
PrevChar = 0
cnt = 1
For L = 1 To Len(S)
ch1 = AscW(Mid(S, L, 1)) And AndNum
For Lp = 1 To cnt - 1
ch1 = ch1 * 2
Next
'Ormask = Ormask Or OrNum
If L = 1 Then PrevChar = 0 Else PrevChar = AscW(Mid(S, L - 1, 1))
If cnt = 1 Then
ch2 = 0
Else
ch2 = PrevChar And ((Not (AndNum)) * 2)
For Lp = 1 To (9 - cnt)
ch2 = ch2 \ 2
Next
End If
Res = Res & Chr(ch1 Or ch2)
AndNum = AndNum \ 2
cnt = cnt + 1
If AndNum = 0 Then
AndNum = &H7F
cnt = 1
Res = Res & ChrW(AscW(Mid(S, L, 1)) \ 2)
'previously used chr and asc
End If
'PrevChar = Asc(Mid(S, L, 1))
Next
MakeOctetTo7Bit = Res
End Function

Public Function MakeSubmitPDU(ByVal PhoneNo As String, ByVal MessageStr As String) As String
MakeSubmitPDU = ""
On Error GoTo er
If (Len(PhoneNo) < 3) Or (Len(PhoneNo) > 20) Or (MessageStr = "") Then Exit Function
' should check for phone number to be valid digits is assumed
Dim SMSC_Info_Len As String
SMSC_Info_Len = "00"

Dim FirstOctet As String
FirstOctet = "11"

Dim TP_MessageRef As String
TP_MessageRef = "00"

Dim NumberLen As String
NumberLen = HexChar(Len(PhoneNo))

Dim NumberType As String
Dim SemiOctetNumber As String
NumberType = "81" 'local number81
SemiOctetNumber = GetSemiOctet(PhoneNo)
If Left(PhoneNo, 1) = "+" Then
NumberType = "91" 'international number
SemiOctetNumber = GetSemiOctet(Right(PhoneNo, Len(PhoneNo) - 1))
NumberLen = HexChar(Len(PhoneNo) - 1)
ElseIf Left(PhoneNo, 2) = "00" Then
NumberType = "91"
SemiOctetNumber = GetSemiOctet(Right(PhoneNo, Len(PhoneNo) - 2))
NumberLen = HexChar(Len(PhoneNo) - 2)
End If

Dim Protocol_id As String
Protocol_id = "00"

Dim DCS As String 'data coding scheme
DCS = ""
If Is7Bit(MessageStr) Then DCS = "00" '7 bit
If DCS = "" And IsUTF8(MessageStr) Then DCS = "04" '8 bit
If DCS = "" Then DCS = "08" '16 bit

Dim Validity As String
Validity = "AA" '4 days

Dim UDS As String 'user data size
If DCS <> "08" Then
UDS = HexChar(Len(MessageStr))
Else
UDS = HexChar(Len(MessageStr) * 2)
End If

Dim L As Integer
Dim UserData As String
UserData = ""
Select Case DCS
Case "00"
If Len(MessageStr) > 160 Then Exit Function
UserData = Make7Bit2Octet(MessageStr)
Case "04"
If Len(MessageStr) > 140 Then Exit Function
For L = 1 To Len(MessageStr)
UserData = UserData & HexChar(Asc(Mid(MessageStr, L, 1)))
Next
Case "08"
If Len(MessageStr) > 70 Then Exit Function
For L = 1 To Len(MessageStr)
UserData = UserData & Char2Hex(Mid(MessageStr, L, 1))
Next
End Select

MakeSubmitPDU = SMSC_Info_Len & FirstOctet & TP_MessageRef & _
NumberLen & NumberType & SemiOctetNumber & _
Protocol_id & DCS & Validity & _
UDS & UserData
Exit Function
er:
MakeSubmitPDU = ""
End Function

Public Function HexByteVal(ByVal HC As String) As Long
' was integer return type but causes overflow when convertion in charw long type
HexByteVal = 0
If Len(HC) <> 2 Then Exit Function
HexByteVal = HexDigitVal(Left(HC, 1)) * &H10 + HexDigitVal(Right(HC, 1))
End Function

Public Function GetHexByte(ByVal Str As String, ByVal Pos As Integer) As String
GetHexByte = ""
If Pos < 1 Or Pos >= Len(Str) Then Exit Function
GetHexByte = Mid(Str, Pos, 2)

End Function

Public Function DecodeDeliverPDU(ByVal PDU As String, ByVal HasSMSC As Boolean, ByRef Sender As String, ByRef dtTimeStamp As String) As String
Sender = ""
DecodeDeliverPDU = ""
dtTimeStamp = ""
On Error GoTo er
If PDU = "" Then Exit Function
If Not (IsHexDigit(PDU)) Then Exit Function
Dim Cur As Integer
Dim v As Integer
Dim S As String
Dim PDUlen As Integer

PDUlen = Len(PDU)

Cur = 1

If HasSMSC Then
S = GetHexByte(PDU, Cur)
v = HexByteVal(S)
Cur = Cur + 2 + v * 2 ' ignore smsc info
End If

Cur = Cur + 2 'ignore first octet

If Cur > PDUlen Then Exit Function

Dim NumLen As Integer

S = GetHexByte(PDU, Cur)
NumLen = HexByteVal(S)
Cur = Cur + 2 ' skip numlen to go to num type

If Cur > PDUlen Then Exit Function

S = GetHexByte(PDU, Cur)
If S = "91" Then Sender = "+"
Cur = Cur + 2 'skip num type to go to number

If Cur > PDUlen Then Exit Function

v = NumLen
If ((NumLen Mod 2) <> 0) Then v = NumLen + 1
S = GetSemiOctet(Mid(PDU, Cur, v))
Sender = Sender & Left(S, NumLen)
If UCase(Right(Sender, 1)) = "F" Then Sender = Left(Sender, Len(Sender) - 1)
Cur = Cur + v 'skip number

Cur = Cur + 2 'skip protocol id

If Cur > PDUlen Then Exit Function

Dim DCS As String
DCS = GetHexByte(PDU, Cur)
Cur = Cur + 2 'skip dcs

Cur = Cur + 14 'skip semi-octet time stamp

If Cur > PDUlen Then Exit Function
dtTimeStamp = GetSemiOctet(Mid(PDU, Cur - 14, 14))

Dim UDL As Integer 'user data length
S = GetHexByte(PDU, Cur)
UDL = HexByteVal(S)
Cur = Cur + 2 'skip udl & goto data

If Cur > PDUlen Then Exit Function

Dim L As Integer
Dim Lp As Integer
Dim UserData As String
Dim UserStr As String

UserData = ""
UserData = Right(PDU, Len(PDU) - Cur + 1)
UserStr = ""
'If DCS <> "04" And DCS <> "08" Then
If DCS = "00" Then
'coding scheme 7bit
UserStr = MakeOctetTo7Bit(UserData)

ElseIf DCS = "04" Then
'8 bit
For Lp = 1 To Len(UserData) Step 2
S = GetHexByte(UserData, Lp)
UserStr = UserStr & Chr(HexByteVal(S))
Next

ElseIf DCS = "08" Then
'16 bit
Dim s1 As String
Dim s2 As String
For Lp = 1 To Len(UserData) Step 4
s1 = GetHexByte(UserData, Lp)
s2 = GetHexByte(UserData, Lp + 2)
UserStr = UserStr & ChrW(HexByteVal(s1) * &H100 + HexByteVal(s2))
Next
End If

DecodeDeliverPDU = UserStr
Exit Function
er:
DecodeDeliverPDU = ""
End Function

Public Function SubmitPDU2Str(ByVal PDU As String, ByRef Receiver As String) As String
'i'm not sure this will work as i'm not properly checking first octet for validity byte presence

Receiver = ""
SubmitPDU2Str = ""
On Error GoTo er
If PDU = "" Then Exit Function
If Not (IsHexDigit(PDU)) Then Exit Function
Dim Cur As Integer
Dim v As Integer
Dim S As String
Dim PDUlen As Integer

PDUlen = Len(PDU)

Cur = 1


S = GetHexByte(PDU, Cur)
v = HexByteVal(S)
Cur = Cur + 2 + v * 2 ' ignore smsc info

If Cur > PDUlen Then Exit Function

'if first octet=01 then no validity period
Dim FirstOctet As Integer
S = GetHexByte(PDU, Cur)
FirstOctet = HexByteVal(S)
Cur = Cur + 2 'skip first octet

Cur = Cur + 2 'skip tp message ref

If Cur > PDUlen Then Exit Function

Dim NumLen As Integer

S = GetHexByte(PDU, Cur)
NumLen = HexByteVal(S)
Cur = Cur + 2 ' skip numlen to go to num type

If Cur > PDUlen Then Exit Function

S = GetHexByte(PDU, Cur)
If S = "91" Then Receiver = "+"
Cur = Cur + 2 'skip num type to go to number

If Cur > PDUlen Then Exit Function

v = NumLen
If ((NumLen Mod 2) <> 0) Then v = NumLen + 1
S = GetSemiOctet(Mid(PDU, Cur, v))
Receiver = Receiver & Left(S, NumLen)
If UCase(Right(Receiver, 1)) = "F" Then Receiver = Left(Receiver, Len(Receiver) - 1)
Cur = Cur + v 'skip number

Cur = Cur + 2 'skip protocol id

If Cur > PDUlen Then Exit Function

Dim DCS As String
DCS = GetHexByte(PDU, Cur)
Cur = Cur + 2 'skip dcs

If (FirstOctet And &H18) = &H10 Then
Cur = Cur + 2 'skip validity
ElseIf (FirstOctet And &H18) <> 0 Then
Cur = Cur + 14 '7 octet validity
End If

If Cur > PDUlen Then Exit Function

Dim UDL As Integer 'user data length
S = GetHexByte(PDU, Cur)
UDL = HexByteVal(S)
Cur = Cur + 2 'skip udl & goto data

If Cur > PDUlen Then Exit Function

Dim L As Integer
Dim Lp As Integer
Dim UserData As String
Dim UserStr As String

UserData = ""
UserData = Right(PDU, Len(PDU) - Cur + 1)
UserStr = ""
'If DCS <> "04" And DCS <> "08" Then
If DCS = "00" Then
'coding scheme 7bit
UserStr = MakeOctetTo7Bit(UserData)

ElseIf DCS = "04" Then
'8 bit
For Lp = 1 To Len(UserData) Step 2
S = GetHexByte(UserData, Lp)
UserStr = UserStr & Chr(HexByteVal(S))
Next

ElseIf DCS = "08" Then
'16 bit
Dim s1 As String
Dim s2 As String
For Lp = 1 To Len(UserData) Step 4
s1 = GetHexByte(UserData, Lp)
s2 = GetHexByte(UserData, Lp + 2)
UserStr = UserStr & ChrW(HexByteVal(s1) * &H100 + HexByteVal(s2))
Next
End If

SubmitPDU2Str = UserStr
Exit Function
er:
SubmitPDU2Str = ""
End Function

End Class
باید این نکته را متذکر شوم که فقط باید از تابع MakeSubmitPDU استفاده کنید

ahp_online
یک شنبه 24 دی 1391, 22:17 عصر
با سلام
در مورد نحوه کار این کد نمیشه توضیح بدید؟؟آخه چیزی ازش نفهمیدم؟میشه بگید چطوری یک اس ام اس فارسی با فرمت پی دی یو ارسال میشه؟؟چطور باید تو برنامه توابع رو فراخوانی کرد(منظورم ترتیبشه)؟