Windows Mobile 5.0下藍牙移動打印測試
項目硬件:針式移動便攜式打印機(含藍牙模塊),一臺手機(多普達S1)
項目原理:首先讓手機和打印機藍牙連接后,在手機端為打印機建立一個發送端口,默認為 COM6,然后通過C#操作串口,向串口發送打印的數據(含打印機廠商內置的指令集)
項目步驟:
1.首先讓手機和打印機藍牙連接上,并建立發送端口,下面是轉載的圖:

進入藍牙設備管理界面,點擊新建,用ppc搜索附近的藍牙設備

這時ppc便能搜索到處于待機狀態的藍牙打印適配器。

接下來要做的工作大家十分熟悉,就是輸入密匙進行匹配

由于藍牙打印適配器是通過虛擬串口與ppc之間建立連接的,所以ppc端會提示是否為打印適配器產生一個藍牙串行端口
智能手機無線打印完全攻略(三)
輸入藍牙設備的名稱后,整個匹配過程完成。

然后我們要詳細地設置藍牙串口的傳入和傳出端口,對于打印,我們只要設置傳出端口就行了,我就點擊新建傳出端口

然后選擇綁定到該端口的設備,當然就是我們前面剛剛匹配的藍牙打印適配器了

設置ppc上的傳出端口為com6,當然你也可以設置成其他的端口號,只要你自己記得就行了。是不是安全連接倒不是很重要,可選可不選。

設置完成后我們就在藍牙com口的管理窗口中看到已經綁定在com6上的藍牙打印適配器了
2.接下來就是程序了,使用.net2.0 cf 里自帶的一個類SerialPort,接下來是操作的串口的類了(下面有部分代碼是打印機廠商提供的指令,不同廠商有不同的指令吧?):
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.IO.Ports;
namespace BluetoothTest
{
public class Printer
{
SerialPort server = new SerialPort();
private string _portName = "COM6";//藍牙一般默認為com6
/// <summary>
/// 獲取或設置端口名稱
/// </summary>
public string PortName
{
get
{
_portName = server.PortName;
return _portName;
}
set
{
_portName = value;
server.PortName = _portName;
}
}
/// <summary>
/// 端口是否已經打開
/// </summary>
public bool IsOpen
{
get
{
return server.IsOpen;
}
}
/// <summary>
/// 構造方法初始化串口參數
/// </summary>
public Printer()
{//初始化各個參數
server.BaudRate = 9600;//波特率
server.Parity = 0;//校檢位
server.DataBits = 8;//數據位
server.StopBits = StopBits.One;//停止位
server.PortName = _portName;//端口名稱
server.WriteTimeout = -1;//超時時間
server.ReadTimeout = -1;//超時時間
}
/// <summary>
/// 打開端口
/// </summary>
/// <returns></returns>
public bool OpenPort()
{
try
{
if (!server.IsOpen)
{//關閉的
server.Open();
}
else
{//打開的
//server.Close();
//server.Open();
}
return true;
}
catch(Exception ex)
{ return false; }
}
/// <summary>
/// 發送數據
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public bool SendDataToPort(string str,out string mes)
{
try
{
byte[] OutBuffer;//數據
int BufferSize;
Encoding targetEncoding;
//將[UNICODE編碼]轉換為[GB碼],僅使用于簡體中文版mobile
targetEncoding = Encoding.GetEncoding(0); //得到簡體中文字碼頁的編碼方式,因為是簡體中文操作系統,參數用0就可以,用936也行。
BufferSize = targetEncoding.GetByteCount(str); //計算對指定字符數組中的所有字符進行編碼所產生的字節數
OutBuffer = new byte[BufferSize];
OutBuffer = targetEncoding.GetBytes(str); //將指定字符數組中的所有字符編碼為一個字節序列,完成后outbufer里面即為簡體中文編碼
byte[] cmdData = new byte[BufferSize+100];
//初始化打印機
cmdData[0] = 0x1B;
cmdData[1] = 0x40;
//設置字符順時旋轉180度
cmdData[2] = 0x1B;
cmdData[3] = 0x56;
cmdData[4] = 0;
for (int i = 0; i < BufferSize; i++)
{
cmdData[5 + i] = OutBuffer[i];
}
//向打印機發送[GB碼]數據
server.Write(cmdData, 0, BufferSize + 5);
//server.WriteLine(str);
//初始化指令1B 40
cmdData[0] = 0x1B;
cmdData[1] = 0x40;
//打印并走紙指令
cmdData[2] = 0x1B;
cmdData[3] = 0x64;
cmdData[4] = 0x02;
server.Write(cmdData, 0, 5);
mes = "";
return true;
}
catch(Exception ex)
{
mes = ex.Message;
return false;
}
}
/// <summary>
/// 十六進制轉換字節數組
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}
/// <summary>
/// 字節數組轉換十六進制
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private string ByteArrayToHexString(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
return sb.ToString().ToUpper();
}
public void ClosePort()
{
server.Close();
}
}
}
3.接下在項目窗體上的使用,看看下面的代碼:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BluetoothTest
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
Printer printer = new Printer();
private void menuItem4_Click(object sender, EventArgs e)
{
//退出
printer.ClosePort();
Application.Exit();
}
private void menuItem2_Click(object sender, EventArgs e)
{
//打印
if (tbxBody.Text.Length == 0)
return;
setEnabled(false);
if (!printer.IsOpen)//只有在端口關閉的時候才能設置
printer.PortName = drpPort.GetItemText(drpPort.SelectedItem);
if (!printer.OpenPort())
{
MessageBox.Show("無法打開端口" + drpPort.GetItemText(drpPort.SelectedItem));
}
string mes = "";
if (!printer.SendDataToPort(tbxBody.Text,out mes))
{
MessageBox.Show("發送數據失敗" + drpPort.GetItemText(drpPort.SelectedItem) + " " + mes);
}
setEnabled(true);
}
private void setEnabled(bool b)
{
menuItem1.Enabled = b;
menuItem3.Enabled = b;
}
private void frmMain_Load(object sender, EventArgs e)
{
//初始化
drpPort.SelectedIndex = 1;
}
}
}
4.好了,在模擬器里生成,復制到手機里去,測試下。。。格式還要調試,郁悶,指令集都是以0x開通的,看起來頭昏眼花的,等待下一步吧.....
浙公網安備 33010602011771號