日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

基于藍牙的手機文件傳輸軟件

出處:syney11 發(fā)布于:2012-08-25 10:08:24

  摘 要:針對具有藍牙配置的手機,運用藍牙協(xié)議棧和J2ME 藍牙通信API 來實現(xiàn)手機文件數(shù)據(jù)的傳輸。在分析藍牙通信流程的基礎(chǔ)之上,研究C/S 模式下J2ME 藍牙通信的實現(xiàn)、手機內(nèi)文件的收發(fā)以及圖片處理等問題,并對關(guān)鍵實現(xiàn)技術(shù)及代碼進行詳細闡述。

  藍牙(Bluetooth)是由東芝、愛立信、IBM、Intel和諾基亞等公司等于1998 年5 月共同提出的近距離無線數(shù)據(jù)通信技術(shù)標準。它能夠在10 米的半徑范圍內(nèi)實現(xiàn)單點對多點的無線數(shù)據(jù)和聲音傳輸,其數(shù)據(jù)傳輸帶寬可達到1Mbps.本文利用藍牙技術(shù)開發(fā)一個用于手機文件數(shù)據(jù)傳輸?shù)能浖?,具有即建即連、使用靈活、安全高效等特點,避免傳統(tǒng)網(wǎng)絡(luò)文件傳輸軟件存在的問題。

  1 藍牙通信的關(guān)鍵技術(shù)

  藍牙無線電技術(shù)基于在工業(yè)、科學(xué)以及醫(yī)學(xué)(ISM)上公用的2.45GHz 開放頻段,這一頻段無需授權(quán)并通用。當藍牙設(shè)備互相連接時,他們將組成一個微微網(wǎng)(piconet),即以一個主設(shè)備和7 個從設(shè)備的形式動態(tài)創(chuàng)建網(wǎng)絡(luò)。其私有化和個性化特征表現(xiàn)得尤為突出。

  1.1 藍牙協(xié)議棧

  藍牙協(xié)議棧提供了一組的高層協(xié)議和API 以完成發(fā)現(xiàn)服務(wù)和模擬串行I/O,還有一個關(guān)于包分割和重組的低層協(xié)議以及多路技術(shù)協(xié)議和質(zhì)量服務(wù)。藍牙協(xié)議棧分為硬件和軟件兩部分,藍牙硬件協(xié)議棧由設(shè)備硬件提供,藍牙軟件協(xié)議棧則由軟件實現(xiàn)。

  藍牙軟件協(xié)議棧是程序開發(fā)中的關(guān)鍵部分,其層次從下至上依次是: 宿主控制器接口(HostController Interface,HCI) 是藍牙軟件協(xié)議棧的層,直接和宿主控制器接口固件(Host ControllerInterface Firmware)交互。邏輯鏈路控制和適配協(xié)議(Logical Link Control and Adaptation Protocol,L2CAP) 該層負責處理包分割重組,為上層協(xié)議提供了有保證的服務(wù)。服務(wù)發(fā)現(xiàn)協(xié)議(ServiceDiscovery Protocol,SDP)包含用于發(fā)現(xiàn)服務(wù)是否有效等操作。RFCOMM 位于L2CAP 之上,提供了模擬標準串口通信的能力。對象交換協(xié)議(Object Exchange Protocol,OBEX)用于實際程序中的對象數(shù)據(jù)交換。

圖1 藍牙協(xié)議棧

圖1 藍牙協(xié)議棧

  1.2 J2ME 對藍牙的支持

  早在JSR82 規(guī)范中就定義了javax.bluetooth 和javax.obex 兩個包,其中javax.bluetooth 定義了與藍牙通信相關(guān)的API , 而javax.obex(Object ExchangeProtocol)是建立在串口通信之上,實現(xiàn)以對象為單位的通信。在javax.bluetooth 中,Java 藍牙API 可以被分解為三個部分:發(fā)現(xiàn)服務(wù)、設(shè)備管理和藍牙通信,其主要類及接口有:本地藍牙管理器LocalDevice、遠程藍牙設(shè)備RemoteDevice、搜索代理DiscoveryAgent、搜索偵聽DiscoveryListener、描述藍牙服務(wù)的特征屬性ServiceRecord 及藍牙服務(wù)屬性的類型DataElement.

  1.3 J2ME 平臺下藍牙通信流程

圖2 藍牙通信流程圖

圖2 藍牙通信流程圖

  藍牙通信也是基于通用連接框架,與常見的C/S架構(gòu)類似,只是客戶端不知服務(wù)端的存在,需要通過無線搜索去發(fā)現(xiàn)。搜索到遠程設(shè)備后,還需要進行服務(wù)搜索去發(fā)現(xiàn)對方提供了哪些服務(wù)。

  其中,藍牙通信是基于通用連接框架,對不同客戶端而言,需要通過搜索來獲得與服務(wù)端的連接信息。

  藍牙服務(wù)端使用連接通知者對象,用于等待遠程設(shè)備的連接,類似于阻塞式socket 服務(wù)端,它將一直等待直到接收到客戶端的連接請求。對于藍牙客戶端的搜索服務(wù)分為設(shè)備搜索和服務(wù)搜索,后者需要基于指定的遠程設(shè)備才能進行??蛻舳撕?a target="_blank">服務(wù)器端在獲得藍牙協(xié)議連接后,通過連接創(chuàng)建輸入/輸出流來進行通信。

  2 手機文件傳輸軟件的實現(xiàn)

  2.1 藍牙服務(wù)端的實現(xiàn)

  2.1.1 獲得本地設(shè)備管理器

  獲得本地設(shè)備管理器會導(dǎo)致系統(tǒng)提示是否需要啟動藍牙服務(wù),該步驟是藍牙設(shè)備通信基本的初始化。

  通過LocalDevice 類的getLocalDevice 方法即可獲取本地設(shè)備管理器。

  try {

  localDevice = LocalDevice.getLocalDevice();

  } catch (BluetoothStateException init) {

  init.printStackTrace();

  }

  2.1.2 生成連接字符串

  藍牙通信協(xié)議的連接字符串有兩種:一種用于串口通信;一種用于藍牙鏈路通信(L2CAPConnection)。

  其中串口通信的連接字符串格式為:

  btspp://hostnAME:[CN|UUID];parameters.完整的藍牙通信鏈接字符串的構(gòu)造代碼如下:

  StringBuffer url = new StringBuffer("btspp://");

  url.append("localhost")。append(':');

  url.append(BTConfigure.FILES_SERVER_UUID.toString() ); //服務(wù)UUID

  url.append(";name=FileServer"); //服務(wù)名稱

  url.append(";authorize=false"); //安全參數(shù)

  2.1.3 通過連接字符串獲得連接通知者(Notifier)

  連接通知者類似阻塞式套接字的偵聽過程。該對象只有在接收到遠程設(shè)備請求時才會返回與該遠程設(shè)備的連接,否則一直等待下去。

  StreamConnectionNotifier notifier = null;

  try { notifier = (StreamConnectionNotifier)

  Connector.open(url.toString()); //獲取流連接通知者

  … … }

  2.1.4 設(shè)置本地設(shè)備的服務(wù)記錄屬性

  服務(wù)器向外界"暴露"本設(shè)備可提供的服務(wù)信息,客戶端才可能獲取到這些服務(wù),并向服務(wù)端提出請求。

  以下代碼描述了服務(wù)端如何設(shè)置本地設(shè)備的服務(wù)記錄。

  //獲取服務(wù)記錄(用于添加和編輯服務(wù)記錄)

  record = localDevice.getRecord(notifier);

  //設(shè)置服務(wù)記錄屬性(文件名)

  DataElement fileName = new

  DataElement(DataElement.STRING, FILE_NAME);

  record.setAttributeValue(BTConfigure.FILES_NAMES_ATTR_ID, fileName);

  2.1.5 通過Notifier 循環(huán)阻塞等待遠程設(shè)備的連接

  當有遠程設(shè)備進行連接后,通過連接通知者獲得連接對象。當接收到遠程客戶端設(shè)備的連接請求,首先獲取到該客戶端設(shè)備的地址信息,再啟動服務(wù)線程進行連接的處理。這樣對每一個客戶端連接啟用一個處理線程,可以避免多個客戶端排隊訪問服務(wù)端的情形。

  while(true) {

  StreamConnection conn = null;

  try { //等待接受客戶端的連接

  conn = notifier.acceptAndOpen();

  } catch (IOException e)

  { e.printStackTrace(); continue; }

  RemoteDevice remoteDevice = RemoteDevice.getRemoteDevice(conn); //獲取遠程設(shè)備

  //啟動服務(wù)線程

  new BTServerThread(mainPanel, conn)。start();

  }

  2.1.6 服務(wù)端和客戶端的通信

  藍牙服務(wù)端通信線程是整個服務(wù)端程序的。

  每接收到一個客戶端的請求,都將創(chuàng)建一個獨立的線程來進行處理。通過連接對象創(chuàng)建輸入/輸出流,實現(xiàn)服務(wù)端和客戶端的通信。當某一客戶端處理完畢,服務(wù)端將關(guān)閉與該客戶端的連接。

  public void run() {

  String fileName=readFileName(); //獲取請求

  sendFile(fileName); //發(fā)送答復(fù)

  uninit(); //關(guān)閉連接

  }

  //從客戶端讀取文件名

  private String readFileName() {

  String fileName = null;

  try { InputStream is = conn.openInputStream();

  int length = is.read();

  byte [] buffer = new byte[length];

  is.read(buffer, 0, length);

  fileName = new String(buffer); is.close();

  } catch (IOException e) {

  e.printStackTrace(); }

  return (fileName); }

  //發(fā)送文件數(shù)據(jù)

  private void sendFile(final String fileName) {

  InputStream is = null; byte [] buffer = null;

  try {

  is = getClass()。getResourceAsStream("/" +fileName); buffer = new byte[is.available() ];

  is.read(buffer); is.close();

  OutputStream os = conn.openOutputStream();

  os.write(buffer.length 》 8);

  os.write(buffer.length & 0xFF);

  os.write(buffer); os.flush(); os.close();

  } catch (IOException e) { e.printStackTrace(); }

  }

  //釋放連接流

  private void uninit() {

  try { conn.close(); } catch (IOException e)

  { e.printStackTrace(); }

  }

  2.2 藍牙客戶端的實現(xiàn)

  2.2.1 獲得本地設(shè)備管理器

  獲得本地設(shè)備管理器,設(shè)置本地設(shè)備管理器的搜索模式,獲取搜索代理實例,開始搜索遠程設(shè)備。

  public void run() { //設(shè)備搜索線程

  try {

  LocalDevice localDevice = LocalDevice. getLocal

  Device(); //獲取本地設(shè)備實例

  localDevice.setDiscoverable(DiscoveryAgent.GIAC);

  //得到搜索代理

  discoveryAgent = localDevice.getDiscoveryAgent();

  startDiscover(); //開始探索

  } catch (BluetoothStateException init) {

  init.printStackTrace(); } }

  public void startDiscover() { //開始搜索

  discoveryDevices.removeAllElements();

  try {

  discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this); } catch (BluetoothStateException e)

  { e.printStackTrace(); } }

  2.2.2 記錄設(shè)備搜索結(jié)果

  在搜索偵聽的設(shè)備搜索事件中記錄設(shè)備搜索結(jié)果。設(shè)備搜索事件是通過實現(xiàn)搜索偵聽(DiscoveryListener)的接口來完成回調(diào)處理。

 ?。―iscoveryListener)的接口來完成回調(diào)處理。

  //搜索到設(shè)備

  public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) //添加遠程設(shè)備

  { discoveryDevices.addElement(remoteDevice); }

  //設(shè)備搜索結(jié)束

  public void inquiryCompleted(int discType) {

  switch(discType) {

  case //查詢正常結(jié)束

  DiscoveryListener.INQUIRY_COMPLETED:{

  mainPanel.setDevices(discoveryDevices);

  break; }

  case //查詢被取消

  DiscoveryListener.INQUIRY_TERMINATED:

  break;

  case //查詢錯誤

  DiscoveryListener.INQUIRY_ERROR: {

  mainPanel.showMsg("Inquiry error!!");

  break; } } }

  2.2.3 記錄服務(wù)搜索結(jié)果

  對指定的遠程設(shè)備搜索其服務(wù),在搜索偵聽的服務(wù)搜索事件中記錄服務(wù)搜索結(jié)果。服務(wù)搜索事件的處理也是通過實現(xiàn)搜索偵聽接口來完成回調(diào)的。

  // 服務(wù)搜索線程執(zhí)行代碼

  public void run() { … …

  try {

  LocalDevice localDevice =LocalDevice.getLocalDevice(); //獲取本地設(shè)備實例

  localDevice.setDiscoverable(DiscoveryAgent.GIAC);

  //得到搜索代理

  discoveryAgent = localDevice.getDiscoveryAgent();

  //開始搜索服務(wù)

  discoveryAgent.searchServices(attrSet, uuidSet,remoteDevice, this);

  } catch (BluetoothStateException init){

  init.printStackTrace();

  } }

  // 搜索到服務(wù)

  public void servicesDiscovered(int transID,

  ServiceRecord[] servRecord) { //添加探索到的服務(wù)

  for(int i = 0; i < servRecord.length; ++i)

  serviceRecords.addElement(servRecord[i]);

  }

  2.2.4 建立與遠程設(shè)備的連接

  通過服務(wù)記錄來獲取連接字符串,并建立與遠程設(shè)備的連接??蛻舳送ㄟ^搜索到的服務(wù)記錄來獲取可供連接的URL,并與服務(wù)端進行連接。

  // 客戶端通信線程

  public void run() {

  //通過服務(wù)記錄來獲取建立連接的URL

  String url = serviceRecord.getConnectionURL(

  ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false); … …

  StreamConnection conn = null;

  try { // 通過URL 建立連接

  conn = (StreamConnection)Connector.open(url);

  } catch (IOException open)

  { open.printStackTrace(); } }

  2.2.5 實現(xiàn)服務(wù)端和客戶端的通信

  由連接對象獲取輸入/輸出流,實現(xiàn)服務(wù)端和客戶端的通信。請求處理完畢,關(guān)閉與該遠程設(shè)備的連接。

  客戶端發(fā)起與服務(wù)端進行通信并從服務(wù)器獲取圖片。

  // 發(fā)送文件名稱請求并文件

  sendFileName(conn, fileName);

  downloadFile(conn, fileName);

  try { conn.close(); }

  catch (IOException close)

  { close.printStackTrace(); }

  // 發(fā)送文件名請求

  private void sendFileName(StreamConnection conn,

  final String fileName) {

  try { OutputStream out = conn.openOutputStream();

  out.write(fileName.length() );

  out.write(fileName.getBytes() );

  out.flush(); out.close();

  } catch (IOException write)

  { write.printStackTrace(); } }

  // 文件

  public void downloadFile(StreamConnection conn,final String fileName) {

  byte [] buffer = null;

  try { InputStream is = conn.openInputStream();

  //頭兩個字節(jié)為數(shù)據(jù)長度

  int length = (is.read() 《 8); length |= is.read();

  buffer = new byte[length]; length = 0;

  while (length != buffer.length) {

  int n = is.read(buffer, length, buffer.length - length);

  if (n == -1) throw new IOException("Can't

  readdata");

  length += n; }

  is.close();

  } catch (IOException read)

  { read.printStackTrace(); }

  try { Image img = Image.createImage(buffer, 0,buffer.length);

  mainPanel.appendImage(img);

  } catch (Exception image) {

  image.printStackTrace();

  } }

  3 手機文件傳輸軟件的運行與測試

  對軟件打包后,利用手機安裝管理程序?qū)IDlet應(yīng)用程序從計算機到支持藍牙技術(shù)的手機上,然后執(zhí)行文件傳輸程序,在此可選擇執(zhí)行客戶端或服務(wù)器端應(yīng)用,如圖3 所示。用戶選擇BT Server 開啟服務(wù)器端程序,允許對藍牙進行連接。在另外一手機上執(zhí)行該程序,選擇BTClient,進入文件傳輸?shù)目蛻舳四J?,菜單中?zhí)行Search Devices 功能,進行本地藍牙設(shè)備的搜索,結(jié)果如圖4 所示。再執(zhí)行Search Service功能,即搜索服務(wù)器中提供的服務(wù),選中要的文件,執(zhí)行Transport 進行文件傳輸,如圖5 所示。

  當?shù)膱D像文件傳輸完畢,將其顯示出來,如圖6所示。

圖3 BTDemo 主界面

圖3 BTDemo 主界面

圖4 搜索藍牙服務(wù)。

圖4 搜索藍牙服務(wù)。

圖5 獲取Server 端資源。

圖5 獲取Server 端資源。

圖6 圖像文件并顯示

圖6 圖像文件并顯示。

  4 結(jié)束語

  支持JAVA 并具備藍牙功能的手機,給軟件業(yè)提供了新的機遇。本文開發(fā)一種以J2ME 為平臺的藍牙文件傳輸軟件,可以進行有效的文件傳輸。為建立微微網(wǎng)中文件服務(wù)做了一定的嘗試。在一定程度上拓展了手機的功能, 具有一定的應(yīng)用價值。

關(guān)鍵詞:基于藍牙的手機文件傳輸軟件藍牙 藍牙通信

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

OVC3860藍牙音響模塊非常適合藍牙音箱,是目前量產(chǎn)藍牙音響的不二選擇哦!
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!