안 드 로 이 드 블 루 투 스 연결 ESC/POS 열 민감 프린터 인쇄 인 스 턴 스(블 루 투 스 연결 편)

12069 단어 androidescpos
회사 의 한 휴대 전화 단말기 의 CRM 프로젝트 는 최근 에 작은 표 인쇄 기능 을 추가 해 야 한다.바로 우리 가 배달 을 주문 할 때 자주 볼 수 있 는 작은 표 이다.여 기 는 주로 두 개의 큰 지식 과 관련된다.
  • 블 루 투 스 연결 및 데이터 전송
  • ESC/POS 인쇄 명령
  • 블 루 투 스 연결 은 말 할 것 도 없고 너무 흔 하 다.이 부분 은 주로 이 부분 을 소개 한다.그런데 ESC/POS 인쇄 지령 은 뭐야?쉽게 말 하면 우리 가 흔히 볼 수 있 는 열 민감 소 표 프린터 는 이러한 명령 을 지원 합 니 다.명령 의 형식 에 따라 프린터 에 명령 을 보 내 면 서로 다른 모델 의 프린터 라 도 같은 동작 을 수행 합 니 다.예 를 들 어 한 줄 의 텍스트 를 인쇄 하고 줄 을 바 꾸 며 굵게 하 는 등 모두 해당 하 는 명령 이 있 는데 이 부분 은 다음 소개 에 놓 여 있다.
    이 편 은 주로공식 문서을 바탕 으로 공식 문서 에 비해 큰 설명 을 줄 이 고 빠 른 속도 로 시작 할 수 있다.
    1.블 루 투 스 권한
    블 루 투 스 기능 을 사용 하려 면 먼저 AndroidManifest 설정 파일 에 블 루 투 스 권한 을 설명 해 야 합 니 다.
    
    <manifest> 
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
     ...
    </manifest>
    
    BLUETOOTH 권한 은 블 루 투 스 연결 및 데이터 전송 만 허용 되 지만 블 루 투 스 장치 발견 등 작업 을 하려 면 신청BLUETOOTH_ADMIN 권한 이 필요 합 니 다.
    2.초기 설정
    여 기 는 주로 한 종류BluetoothAdapter를 사용한다.사용법 이 간단 합 니 다.코드 를 직접 보 세 요.
    
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBluetoothAdapter == null) {
     // Device does not support Bluetooth
    }
    단일 모드,전역 에 하나의 인 스 턴 스 만 있 습 니 다.null 이면 장치 가 블 루 투 스 를 지원 하지 않 는 다 는 뜻 입 니 다.그러면 해당 하 는 처리 가 필요 합 니 다.
    장치 가 블 루 투 스 를 지원 한다 면 블 루 투 스 가 열 렸 는 지 확인 하 십시오.
    
    if (!mBluetoothAdapter.isEnabled()) {
     Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
     startActivityForResult(intent, REQUEST_ENABLE_BT);
    }
    블 루 투 스 가 열 리 지 않 으 면 실행 startActivityForResult() 후 블 루 투 스 를 열 것 인지 묻 는 대화 상자 가 팝 업 됩 니 다.'예'를 누 르 면 자동 으로 블 루 투 스 가 열 립 니 다.블 루 투 스 를 성공 적 으로 열 면 되 돌려 줍 니 다 onActivityResult()。블 루 투 스 를 주동 적 으로 켜 는 것 외 에 도 감청 할 수 있다BluetoothAdapter.ACTION_STATE_CHANGED
    방송,포함EXTRA_STATEEXTRA_PREVIOUS_STATE두 개의 extra 필드,가능 한 수치 포함STATE_TURNING_ON,STATEON, STATE_TURNING_OFF , and STATE_OFF 。뜻 이 명확 해서 설명 하지 않 는 다.
    3.장치 발견
    초기 화 완료 후 블 루 투 스 가 열 렸 습 니 다.다음은 근처에 있 는 장 치 를 스 캔 하 는 것 입 니 다.한 마디 만 필요 합 니 다.
    
    mBluetoothAdapter.startDiscovery();
    그러나 이렇게 해서 설 비 를 실행 하기 시 작 했 을 뿐 이것 은 분명 비동기 적 인 과정 이다.우 리 는 방송 을 등록 하고 장 치 를 발견 한 방송 을 감청 하 며 코드 를 직접 올 려 야 한다.
    
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
     public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
    
      //               action == BluetoothDevice.ACTION_FOUND    
      if (BluetoothDevice.ACTION_FOUND.equals(action)) {
    
       //    intent        BluetoothDevice   
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    
       //        ListView        ,         ,         adapter  
       mArrayAdapter.add(device.getName() + "
    " + device.getAddress()); } } }; // IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
    설명 은 이미 명확 하 게 썼 습 니 다.BluetoothDevice.EXTRA_DEVICE 을 제외 하고 extra 필드BluetoothDevice.EXTRA_CLASS가 있 습 니 다.BluetoothClass대상 을 얻 을 수 있 습 니 다.주로 장치 의 추가 설명 정 보 를 저장 하 는 데 사 용 됩 니 다.예 를 들 어 이것 이 오디 오 장치 인지 아 닌 지 알 수 있 습 니 다.
    설비 발견 에 대해 두 가지 주의해 야 할 것 이 있 습 니 다.startDiscovery() 발견 가능 한 장치 로 설 정 된 상태 만 스 캔 할 수 있 습 니 다.안 드 로 이 드 장 치 는 기본적으로 발견 할 수 없습니다.장 치 를 발견 할 수 있 는 상태 로 바 꾸 려 면 다음 과 같은 조작 이 필요 합 니 다.
    
    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    //         ,00s
    intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    startActivity(intent);
    실행 후 대화 창 이 팝 업 되 어 장치 가 발견 가능 한 상태 로 설정 되 었 는 지 물 어 봅 니 다.'예'를 누 르 면 장치 가 발견 가능 한 상태 로 설 정 됩 니 다.startDiscovery()은 자원 을 매우 소모 하 는 작업 이기 때문에 자원 을 신속하게 호출cancelDiscovery()해 야 한다.예 를 들 어 설비 연결 을 하기 전에 반드시 먼저 호출 해 야 한다cancelDiscovery()4.장치 짝 짓 기와 연결
    4.1 짝 짓 기
    한 장치 와 처음 연결 작업 을 할 때 화면 에 짝 짓 기 허용 여 부 를 묻 는 알림 상자 가 팝 업 됩 니 다.짝 짓 기 가 성공 한 후에 만 연결 을 만 들 수 있 습 니 다.
    시스템 은 성공 적 으로 맞 췄 던 모든 장치 정 보 를 저장 합 니 다.따라서 실행startDiscovery()하기 전에 짝 짓 기 장 치 를 찾 아 볼 수 있 습 니 다.이것 은 로 컬 정 보 를 읽 는 과정 이기 때문에startDiscovery()보다 훨씬 빠 르 고 너무 많은 자원 을 차지 하지 않도록 할 수 있 습 니 다.만약 장치 가 블 루 투 스 신호 의 커버 범위 내 에 있다 면,직접 연결 을 시작 할 수 있 을 것 이다.
    짝 짓 기 장치 의 코드 를 찾 으 려 면 다음 과 같 습 니 다.
    
    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    if (pairedDevices.size() > 0) {
     for (BluetoothDevice device : pairedDevices) {
      mArrayAdapter.add(device.getName() + "
    " + device.getAddress()); } }
    코드 는 간단 합 니 다.설명 하지 않 겠 습 니 다.호출BluetoothAdapter.getBondedDevices()에서 하나의 Set<BluetoothDevice> 을 얻 고 이미 맞 춘 장치 정 보 를 얻 는 것 입 니 다.
    4.2 연결
    블 루 투 스 장치 의 연결 은 네트워크 연결 모델 과 매우 비슷 하 며,모두 Client-server 모드 로 하나의 socket 을 통 해 데이터 전송 을 한다.그러면 Android 장치 로 서 세 가지 상황 이 존재 합 니 다.
  • 클 라 이언 트 엔 드 로 만 연결
  • 다른 사람 이 연결 을 요청 할 때 까지 서버 측 으로 만 기다 리 기
  • 클 라 이언 트 와 서버 로 동시에
  • 다음 편 에 서 는 열 에 민감 한 프린터 를 연결 하여 인쇄 하 는 것 을 소개 하기 위해 서 안 드 로 이 드 장치 가 클 라 이언 트 로 연결 되 는 상황 을 먼저 이야기 합 니 다.프린터 는 안 드 로 이 드 장치 와 자발적으로 연결 할 수 없 기 때문에 프린터 는 서버 로 연 결 될 수 밖 에 없다.
    4.2.1 클 라 이언 트 로 연결
  • 우선 하나의BluetoothDevice대상 을 획득 해 야 한다.가 져 오 는 방법 은 앞에서 이미 소개 되 었 습 니 다.startDiscovery()를 호출 하고 방송 을 감청 하여 얻 을 수 있 으 며,이미 설 치 된 장 치 를 조회 하여 얻 을 수 있 습 니 다.
  • BluetoothDevice.createrfcommSocketToServiceRecord(UUID)를 통 해BluetoothSocket대상
  • 획득
  • BluetoothSocket.connect()를 통 해 연결 구축
  • 이상 처리 및 연결 종료
  • 쓸데없는 말 은 그만 하고 코드 를 올 려 라.
    
    private class ConnectThread extends Thread {
     private final BluetoothSocket mmSocket;
     private final BluetoothDevice mmDevice;
    
     public ConnectThread(BluetoothDevice device) {
    
      BluetoothSocket tmp = null;
      mmDevice = device;
      try {
       //    BluetoothDevice    BluetoothSocket   
       tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
      } catch (IOException e) { }
      mmSocket = tmp;
     }
    
     @Override
     public void run() {
      //              
      mBluetoothAdapter.cancelDiscovery();
      try {
       //     ,            
       mmSocket.connect();
      } catch (IOException connectException) {
       //           
       try {
        mmSocket.close();
       } catch (IOException closeException) { }
       return;
      }
      doSomething(mmSocket);
     }
    
     //           
     public void cancel() {
      try {
       mmSocket.close();
      } catch (IOException e) { }
     }
    }
    
    
    device.createRfcommSocketToServiceRecord(MY_UUID) 여기 하나UUID가 들 어 와 야 하 는데 이것UUID 은 각별히 주의해 야 한다.간단 한 이 해 는 블 루 투 스 서 비 스 를 표시 하 는 데 사용 되 는 약 정 된 형식의 문자열 입 니 다.
    Client 가 연결 을 시작 할 때 들 어 오 는 UUID 는 서버 쪽 설정 과 같 아야 합 니 다!그렇지 않 으 면 잘못 보고 할 것 이다!
    열 에 민감 한 프린터 를 연결 하 는 경우 서버 측 에서 설정 한 UUID 가 무엇 인지 모 르 면 어떻게 합 니까?
    걱정 하지 마 세 요.흔히 볼 수 있 는 블 루 투 스 서비스 프로 토 콜 에 약 정 된 UUID 가 있 기 때 문 입 니 다.예 를 들 어 우리 가 열 민감 프린터 를 연결 하 는 것 은 SPP 직렬 통신 프로 토 콜 을 바탕 으로 하 는 것 이다.이에 대응 하 는 UUID 는'000011-0000-1000-0805 F9B34FB'이기 때문에 실제 호출 은 다음 과 같다.

    device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"))
    다른 흔 한 블 루 투 스 서비스의 UUID 는 여러분 이 직접 검색 할 수 있 습 니 다.자신의 애플 리 케 이 션 간 통신 에 만 사용 된다 면 이론 적 으로 UUID 를 마음대로 정의 할 수 있 으 며,server 와 client 양쪽 에서 사용 하 는 UUID 가 일치 하면 된다.
    4.2.2 서버 로 연결
  • 대상 을BluetoothAdapter.listenUsingRfcommWithServiceRecord(String, UUID)통 해 하나BluetoothServerSocket얻 기.여기 들 어 오 는 첫 번 째 매개 변 수 는 서비스의 이름 을 설정 하 는 데 사 용 됩 니 다.다른 장치 가 스 캔 할 때 이 이름 을 표시 합 니 다.UUID 앞에서 소 개 했 습 니 다.
  • 호출BluetoothServerSocket.accept()연결 요청 을 감청 하기 시작 했다.이것 은 차단 작업 이기 때문에 당연히 메 인 라인 밖 에 두 고 진행 해 야 한다.이 작업 이 성공 적 으로 실행 되 었 을 때 연결 이 생 겼 을 때 BluetoothSocket 대상 을 되 돌려 줍 니 다.
  • 호출BluetoothServerSocket.close() 은 연결 을 감청 하 는 서 비 스 를 닫 지만 현재 만들어 진 링크 는 영향 을 받 지 않 습 니 다.
  • 코드 를 보 세 요.
    
    private class AcceptThread extends Thread {
    
     private final BluetoothServerSocket mmServerSocket;
    
     public AcceptThread() {
    
      BluetoothServerSocket tmp = null;
      try {
       // client         UUID !!!
       tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
      } catch (IOException e) { }
      mmServerSocket = tmp;
     }
    
     @Override
     public void run() {
      BluetoothSocket socket = null;
      //    
      while (true) {
       try {
        socket = mmServerSocket.accept();
       } catch (IOException e) {
        break;
       }
       //        ,      
       if (socket != null) {
        //         ,       ,         
        doSomething(socket);
        mmServerSocket.close();
        break;
       }
      }
     }
    
     public void cancel() {
      try {
       mmServerSocket.close();
      } catch (IOException e) { }
     }
    }
    
    
    5.데이터 전송
    마침내 앞의 네 걸음 을 지나 모든 것 이 준비 되 었 는데 동풍 만 불 었 다.마지막 부분 은 가장 간단 하 다.InputStream OutputStream를 간단하게 이용 하여 데 이 터 를 송 수신 하 는 것 이기 때문이다.
    예제 코드:
    
    private class ConnectedThread extends Thread {
     private final BluetoothSocket mmSocket;
     private final InputStream mmInStream;
     private final OutputStream mmOutStream;
    
     public ConnectedThread(BluetoothSocket socket) {
      mmSocket = socket;
      InputStream tmpIn = null;
      OutputStream tmpOut = null;
      //   socket    InputStream   OutputStream
      try {
       tmpIn = socket.getInputStream();
       tmpOut = socket.getOutputStream();
      } catch (IOException e) { }
    
      mmInStream = tmpIn;
      mmOutStream = tmpOut;
     }
    
     public void run() {
      byte[] buffer = new byte[1024]; // buffer store for the stream
      int bytes; // bytes returned from read()
    
      //     InputStream    
      while (true) {
       try {
        bytes = mmInStream.read(buffer);
        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
          .sendToTarget();
       } catch (IOException e) {
        break;
       }
      }
     }
    
     //  Server     
     public void write(byte[] bytes) {
      try {
       mmOutStream.write(bytes);
      } catch (IOException e) { }
     }
    
     public void cancel() {
      try {
       mmSocket.close();
      } catch (IOException e) { }
     }
    }
    
    
    다음 소 개 는 모 바 일 로 열 민감 프린터 를 조작 해 인쇄 할 때 이 부분 을 사용 하기 때문에 더 이상 말 하지 않 겠 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기