Android 의 POS 프린터 호출 이 간단 합 니 다.
Android 에서 의 설비 디 버 깅 은 만약 에 설비 가 구동 을 제공 하면 공장 의 구동 에 따라 디 버 깅 하면 됩 니 다.장치 가 구동 을 제공 하지 않 아 일반적인 방법 에 따라 디 버 깅 할 수 밖 에 없다.프린터 출력 을 제어 하기 위해 USB 인 터 페 이 스 를 사용 합 니 다.
1.우선 USB 관리자 가 져 오기
public UsbAdmin(Context context) {
mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
context.registerReceiver(mUsbReceiver, filter);
}
지연 의 도 를 사용 하여 usb 접속 시의 방송 을 받 습 니 다.방송 이 수신 되면 새로운 장치 가 접속 되 었 음 을 설명 합 니 다.boardcast action 추가
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
setDevice(device);
} else {
Closeusb();
// mDevice = device;
}
} else {
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
};
usb 장치 의 인용 을 가 져 오 면 안 드 로 이 드 시스템 은 장치 접근 을 허용 하 는 지 물 어 볼 것 입 니 다.기본 값 은 false 입 니 다.접근 이 허용 되면 USB 의 인용 이 null 인지 여 부 를 판단 하고 비어 있 지 않 으 면 setDevice 를 사용 하여 Connection 을 만 듭 니 다.그렇지 않 으 면 이번 연결 을 닫 습 니 다.setDevice 에서 우 리 는 장치 의 기능 집합(UsbInterface)을 가 져 올 수 있 고 통신 채널(UsbEndpoint)도 가 져 올 수 있 으 며 host 와 device 의 연결 을 만들어 데 이 터 를 전송 할 수 있 습 니 다.
private void setDevice(UsbDevice device) {
if (device != null) {
UsbInterface intf = null;
UsbEndpoint ep = null;
int InterfaceCount = device.getInterfaceCount();
int j;
mDevice = device;
for (j = 0; j < InterfaceCount; j++) {
int i;
intf = device.getInterface(j);
Log.i(TAG, " :" + j + " :" + intf.getInterfaceClass());
if (intf.getInterfaceClass() == 7) {
int UsbEndpointCount = intf.getEndpointCount();
for (i = 0; i < UsbEndpointCount; i++) {
ep = intf.getEndpoint(i);
Log.i(TAG, " :" + i + " :" + ep.getDirection() + " :" + ep.getType());
if (ep.getDirection() == 0 && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
Log.i(TAG, " :" + j + " :" + i);
break;
}
}
if (i != UsbEndpointCount) {
break;
}
}
}
if (j == InterfaceCount) {
Log.i(TAG, " ");
return;
}
mEndpointIntr = ep;
UsbDeviceConnection connection = mUsbManager.openDevice(device);
if (connection != null && connection.claimInterface(intf, true)) {
Log.i(TAG, " ! ");
mConnection = connection;
} else {
Log.i(TAG, " ! ");
mConnection = null;
}
}
}
2.관련 클래스 에 UsbAdmin 을 새로 만 들 고 openUsb 를 호출 합 니 다.여 기 는 먼저 위의 setDevice()방법 으로 장치 의 인용 을 얻 었 습 니 다.연결 채널 이 만들어 질 때 모든 USB 장 치 를 보 여 줍 니 다.장치 의 인용 이 존재 하지 않 을 때 모든 USB 장 치 를 보 여 주 며 USB 권한 을 요청 합 니 다.
public void openUsb() {
if (mDevice != null) {
setDevice(mDevice);
if (mConnection == null) {
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
mUsbManager.requestPermission(device, mPermissionIntent);
}
}
} else {
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
mUsbManager.requestPermission(device, mPermissionIntent);
}
}
}
3.위의 두 부분 이 다 간 후에 우 리 는 연결 되 어 있 는 프린터 를 제어 하 는 명령 을 보 낼 수 있 습 니 다.여기 서 우 리 는 표준 ESC/POS 명령 집합 을 사용 하고 하드웨어 의 기본 값 으로 코드 를 붙 일 수 있 습 니 다.이곳 의 명령 집합 은 10 진법 표시 형식 을 사용 하고 16 진법 으로 바 꿀 수 있 습 니 다.
public class printerCmdUtils {
/**
* , POS
*/
public static final byte ESC = 27;//
public static final byte FS = 28;//
public static final byte GS = 29;//
public static final byte DLE = 16;//
public static final byte EOT = 4;//
public static final byte ENQ = 5;//
public static final byte SP = 32;//
public static final byte HT = 9;//
public static final byte LF = 10;// ( )
public static final byte CR = 13;//
public static final byte FF = 12;// ( ( ) )
public static final byte CAN = 24;// ( )
//------------------------ -----------------------------
/**
*
* @return
*/
public static byte[] init_printer()
{
byte[] result = new byte[2];
result[0] = ESC;
result[1] = 64;
return result;
}
//------------------------ -----------------------------
/**
*
* @param lineNum
* @return
*/
public static byte[] nextLine(int lineNum)
{
byte[] result = new byte[lineNum];
for(int i=0;i<lineNum;i++)
{
result[i] = LF;
}
return result;
}
//------------------------ -----------------------------
/**
* (1 )
* @return
*/
public static byte[] underlineWithOneDotWidthOn()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 45;
result[2] = 1;
return result;
}
/**
* (2 )
* @return
*/
public static byte[] underlineWithTwoDotWidthOn()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 45;
result[2] = 2;
return result;
}
/**
*
* @return
*/
public static byte[] underlineOff()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 45;
result[2] = 0;
return result;
}
//------------------------ -----------------------------
/**
*
* @return
*/
public static byte[] boldOn()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 69;
result[2] = 0xF;
return result;
}
/**
*
* @return
*/
public static byte[] boldOff()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 69;
result[2] = 0;
return result;
}
//------------------------ -----------------------------
/**
*
* @return
*/
public static byte[] alignLeft()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 97;
result[2] = 0;
return result;
}
/**
*
* @return
*/
public static byte[] alignCenter()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 97;
result[2] = 1;
return result;
}
/**
*
* @return
*/
public static byte[] alignRight()
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 97;
result[2] = 2;
return result;
}
/**
* col
* @param col
* @return
*/
public static byte[] set_HT_position( byte col )
{
byte[] result = new byte[4];
result[0] = ESC;
result[1] = 68;
result[2] = col;
result[3] = 0;
return result;
}
//------------------------ -----------------------------
/**
* n
* @param num
* @return
*/
public static byte[] fontSizeSetBig(int num)
{
byte realSize = 0;
switch (num)
{
case 1:
realSize = 0;break;
case 2:
realSize = 17;break;
case 3:
realSize = 34;break;
case 4:
realSize = 51;break;
case 5:
realSize = 68;break;
case 6:
realSize = 85;break;
case 7:
realSize = 102;break;
case 8:
realSize = 119;break;
}
byte[] result = new byte[3];
result[0] = 29;
result[1] = 33;
result[2] = realSize;
return result;
}
//------------------------ -----------------------------
/**
*
* @param num
* @return
*/
public static byte[] fontSizeSetSmall(int num)
{
byte[] result = new byte[3];
result[0] = ESC;
result[1] = 33;
return result;
}
//------------------------ -----------------------------
/**
*
* @return
*/
public static byte[] feedPaperCutAll()
{
byte[] result = new byte[4];
result[0] = GS;
result[1] = 86;
result[2] = 65;
result[3] = 0;
return result;
}
/**
* ( )
* @return
*/
public static byte[] feedPaperCutPartial()
{
byte[] result = new byte[4];
result[0] = GS;
result[1] = 86;
result[2] = 66;
result[3] = 0;
return result;
}
//------------------------ -----------------------------
public static byte[] byteMerger(byte[] byte_1, byte[] byte_2){
byte[] byte_3 = new byte[byte_1.length+byte_2.length];
System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
return byte_3;
}
public static byte[] byteMerger(byte[][] byteList){
int length = 0;
for(int i=0;i<byteList.length;i++)
{
length += byteList[i].length;
}
byte[] result = new byte[length];
int index = 0;
for(int i=0;i<byteList.length;i++)
{
byte[] nowByte = byteList[i];
for(int k=0;k<byteList[i].length;k++)
{
result[index] = nowByte[k];
index++;
}
}
return result;
}
}
4.위 에서 다 완성 한 후에 필요 한 문자열 을 byte 배열 로 변환 하고 sendmand 방법 으로 인쇄 할 수 있 습 니 다.
@SuppressLint("NewApi")
public boolean sendCommand(byte[] Content) {
boolean Result;
synchronized (this) {
int len = -1;
if (mConnection != null) {
len = mConnection.bulkTransfer(mEndpointIntr, Content, Content.length, 10000);
}
if (len < 0) {
Result = false;
Log.i(TAG, " ! " + len);
} else {
Result = true;
Log.i(TAG, " " + len + " ");
}
}
return Result;
len = mConnection.bulkTransfer(mEndpointIntr, Content, Content.length, 10000);
이 단 계 는 동기 화 잠 금 만 추 가 했 을 뿐 새로운 스 레 드 를 켜 서 처리 하지 않 았 습 니 다.이 컴퓨터 에 문제 가 없 지만 위의 USB 통신 체제 의 글 은 비동기 스 레 드 에 두 어야 한 다 는 언급 이 있 습 니 다.여기 서 주의해 야 합 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.