PDA

View Full Version : ارسال Picture Message با AT Commands



reza6384
سه شنبه 07 آبان 1387, 12:07 عصر
سلام.
در تاپیک های این بخش به صورت جزئی و اشاره ای به ارسال پیام تصویری پرداخته شده بود و من گفتم بهتره در یک تاپیک مجزا و مخصوص این بحث رو مطرح کنیم و به نتیجه برسونیم و در نهایت هم یک مثال با پیاده سازی قرار بدیم تا سایر دوستان هم استفاده کنند.

خوب، من هم در این سایت و هم توی اینترنت خیلی جستجو کردم ، ولی به نتیجه کامل نرسیدم. چیزهایی که فهمیدم ایناست :
1- عکس باید به صورت Bitmap سیاه و سفید باشه با سایز 14*72 یا 28*72
2-باید به صورت یک رشته هگز کدهای Bitmap رو پشت سر هم قرار بدیم که احتمالا فایل OTA هم همینه، یعنی از پیکسل 0و0 (بالا سمت چپ) به صورت سطری تا آخرین پیکسل پایین سمت راست Bitmap رو بخونیم ، اگر رنگش سفید بود 0 و اگر رنگ دیگه ای بود 1 قرار بدیم.
3- در یک سایت دیدم که باید DataCodingScheme = F7 باشه.
4- UserDataHeader هم باید تنظیم بشه. ( نمیدونم چیه.)
5- جناب Noorsoft در تاپیک PDU Encoding/Decoding یک لینک از سایتشون قرار دادن که یک برنامه هست که فایل Bitmap رو میگیره و به OTA تبدیل میکنه.

در ضمن، یک برنامه از سایت CodeProject گرفتم به زبان #C که به VB.Net 2005 تبدیلش کردم، برای تبدیل Bitmap به OTA :



Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports System.Drawing
Imports System.Windows.Forms
Namespace OTAViewer
Public Class OTAFile
Public Const WIDTH As Integer = 72
Public Const HEIGHT As Integer = 28
Private Const DATASIZE As Integer = WIDTH / 8 * HEIGHT
Private m_Bitmap As Byte(,) = New Byte(WIDTH / 8 - 1, HEIGHT - 1) {}
Private Sub New()
End Sub
''' <summary>
''' Represents a (71, 27) Bitmap.
''' </summary>
''' <param name="x">X</param>
''' <param name="y">Y</param>
''' <returns>True if Pixel is set.</returns>
Default Public Property Item(ByVal x As Integer, ByVal y As Integer) As Boolean
Get
Dim b As Byte = m_Bitmap(x / 8, y)
Dim bit As Byte = CByte((7 - x Mod 8))
Dim t As Byte = CByte(Math.Pow(2, bit))
Return (b And t) = 0
End Get
Set(ByVal value As Boolean)
Dim xx As Integer = x / 8
Dim bit As Byte = CByte((7 - x Mod 8))
Dim t As Byte = CByte((1 << bit))
Dim i As Byte = CByte((Byte.MaxValue - t))
If value Then
m_Bitmap(xx, y) = m_Bitmap(xx, y) Or t
Else
m_Bitmap(xx, y) = m_Bitmap(xx, y) And i
End If
End Set
End Property
Public Function ToBitmap() As Bitmap
Dim bmp As New Bitmap(72, HEIGHT)
For i As Integer = 0 To 71
For j As Integer = 0 To HEIGHT - 1
If Me(i, j) Then
bmp.SetPixel(i, j, Color.White)
Else
bmp.SetPixel(i, j, Color.Black)
End If
Next
Next
Return bmp
End Function
Public ReadOnly Property Data() As Byte()
Get
Dim s As Byte() = New Byte(DATASIZE + 3) {}
s(0) = 0
s(1) = 72
s(2) = HEIGHT
s(3) = 1
Dim k As Integer = 4
For j As Integer = 0 To HEIGHT - 1
For i As Integer = 0 To 8
s(System.Math.Max(System.Threading.Interlocked.Inc rement(k), k - 1)) = m_Bitmap(i, j)
Next
Next
Return s
End Get
End Property
Public Shared Function FromBitmap(ByVal img As Image) As OTAFile
If img.Width <> 72 OrElse img.Height <> HEIGHT OrElse img.PixelFormat <> System.Drawing.Imaging.PixelFormat.Format1bppIndex ed Then
Throw New Exception(String.Format("A " + "72x{0} Pixel Black-and-White image Required.", HEIGHT))
End If
Dim bmp As New Bitmap(img)
Dim ota As New OTAFile()
For i As Integer = 0 To 71
For j As Integer = 0 To HEIGHT - 1
ota(i, j) = (bmp.GetPixel(i, j) <> Color.FromArgb(255, 255, 255))
Next
Next
Return ota
End Function
Public Shared Function FromFile(ByVal file__1 As String) As OTAFile
Dim ota As New OTAFile()
Dim buf As Byte() = New Byte(DATASIZE - 1) {}
Dim fs As Stream = File.OpenRead(file__1)
fs.Position = 4
fs.Read(buf, 0, DATASIZE)
fs.Close()
Dim x As Integer
Dim y As Integer
For i As Integer = 0 To DATASIZE - 1
x = i Mod 9
y = i / 9
ota.m_Bitmap(x, y) = buf(i)
Next
Return ota
End Function
End Class
End Namespace



حالا، دوستان لطف کنند با ارائه توضیحات یا معرفی لینک ها و ارائه مثال در تکمیل این تاپیک همکاری کنند.