안 드 로 이 드 블 루 투 스 연결 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_STATE
과EXTRA_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 클 라 이언 트 로 연결
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) { }
}
}
다음 소 개 는 모 바 일 로 열 민감 프린터 를 조작 해 인쇄 할 때 이 부분 을 사용 하기 때문에 더 이상 말 하지 않 겠 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.