AndroidでBluetooth関係のAPIを使ってPAPERANGに接続してみる

# はじめに

正月に秋葉原行ってじゃんぱらでPAPERANGを購入。
で、PAPERANGのAPIないかなと探したけど、Cordovaのプラグインしか見つからなかったので、プラグインのソースをAndroidStudioで普通にアプリに使えないか試してみる。
もし、もっと良い方法を知ってる方がいたらコメントください。

うまく使えたら、Androidの会で何か作るときや、ハッカソンなんかで使ってみたい。

CordovaのPAPERANG pluginを見つけて、その中のjarを使ってできないか試したが、なんか、メーカーからIDとかもらわないとできそうもないのであきらめ、別の方法を模索。
Androidの会 浜松支部の定例会で、話をしていたところ、よさげなページを見つたので、そこを参考に紙送りができるところまで確認できた。

良さげなページは以下のサイト
[M5StickC(ESP32)からBluetooth小型ポータブルレシートプリンタ「PAPERANG」を制御する](https://lang-ship.com/blog/?p=1318)
[Bluetooth小型ポータブルレシートプリンタ「PAPERANG」](https://lang-ship.com/blog/?p=1305)
[miaomiaoji-tool](https://github.com/ihciah/miaomiaoji-tool)
ちゃんと使っていくためには、miaomiaoji-toolのコードを確認していかないといけない。

## AndroidManifest.xml

こんな感じ

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="krohigewagma.jp.paperangsample">
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
```


## コード

とりあえずのお試し適当コード。
接続履歴を使って、PAPERANGを探して接続するダサいコード。
本当は、Bluetoothで接続されているデバイスの中から選ばないといけない
ボタンを押すと、紙送りされます。

```java

public class MainActivity extends AppCompatActivity {

    // CRC
    private static byte[] crc = new byte[]{
            (byte)0x02, (byte)0x18, (byte)0x00, (byte)0x04,
            (byte)0x00, (byte)0x78, (byte)0x7A, (byte)0xCE,
            (byte)0x33, (byte)0x2C, (byte)0x89, (byte)0x80,
            (byte)0xF0, (byte)0x03
    };

    // 紙送り
    byte[] data = new byte[]{
            (byte)0x02,										//
            (byte)0x1a, (byte)0x00,							// 制御コード
            (byte)0x02, (byte)0x00,							// データ長さ
            (byte)',' , (byte)0x01,							// 紙送り量
            (byte)0x8b, (byte)'V', (byte)'#', (byte)'T',	// CRC
            (byte)0x03										//
    };

    private static String SPP = "00001101-0000-1000-8000-00805F9B34FB";

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button btn = findViewById(R.id.btnInit);
        btn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Context appContext = getApplicationContext();
/*
                // Cordovaのプラグインのjarを使ってやったコード。
                // ダメだったけど。とりあえず記念の残しておくけど後で消す
                String packageName = appContext.getPackageName();
                    PaperangApi.init(appContext, packageName, new OnInitStatusListener() {
                        @Override
                        public void initStatus(boolean b) {
                            Log.e("PAPERANG", "b = " + b);
                        }
                    });
                    PaperangApi.registerBT(appContext);
                    scan();
//                PaperangApi.unregisterBT(appContext);
//                    if(register()){
//                        Log.i("PAPERANG", "register success");
//                        scan();
//                        disconnect();
//                    }else{
//                        Log.i("PAPERANG", "register faild");
//                    }
 */
                // お試しなので、イケてないコードになってしまった・・・
                BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
                if(bt.equals(null)){
                    Log.i("PAPERANG", "Bluetooth not support");
                   return false;
                }
                if(!bt.isEnabled()){
                    Log.i("PAPERANG", "disable bluetooth");
                    return false;
                }

                Set<BluetoothDevice> devices = bt.getBondedDevices();
                List<String> macAddressList = new ArrayList<String>();
                for(BluetoothDevice device : devices){
                    Log.i("PAPERANG", device.getAddress() + device.getName());
                    if(!"Paperang".equals(device.getName())){
                        continue;
                    }
                    macAddressList.add(device.getAddress());
                    BluetoothSocket socket = null;
                    try{
                        socket = device.createRfcommSocketToServiceRecord(UUID.fromString(SPP));
                        socket.connect();
                        Log.i("PAPERANG", "connected.");

                        OutputStream outst = socket.getOutputStream();
                        outst.write(crc);
                        outst.write(data);
                    }catch(IOException e){
                        Log.e("PAPERANG", e.getMessage());
                    }finally {
                        try{
                            if(socket != null){
                                socket.close();
                            }
                        }catch(IOException e2){
                            Log.e("PAPERANG", e2.getMessage());
                        }
                    }
                    return false;
                }
                return false;
            }
        });
    }
}
```

# おわり
次は印刷したい！