### 前言

    前段时间把之前买的咕咕机从老姐那里要了回来(雾),准备对这个单机版打印机做一个扩展,根据官方给出的接口来把它扩展成一个可以让诸多网友给我发送小纸条的联机打印机。

 【肥宅捕获指南】快来给我写小纸条吧!_ web

 

 

    用了一早上把接口实现之后发给了群友,然后今天我收到了这些内容...

 

### 宪法

【肥宅捕获指南】快来给我写小纸条吧!_Java_02

 

### 发送了三遍的支付宝账号

【肥宅捕获指南】快来给我写小纸条吧!_ web_03

 

### 神秘链接

【肥宅捕获指南】快来给我写小纸条吧!_ web_04

 

### 叫我打游戏(我自己发的)

【肥宅捕获指南】快来给我写小纸条吧!_Java_05

 

### 敲一天代码也很累

【肥宅捕获指南】快来给我写小纸条吧!_Java_06

 

  这感觉就像是初中偷偷课桌间传递纸条一样温暖。

 

    但是!

 

    打印宪法真的很浪费纸张,分分钟一卷热敏纸就没了,虽然说热敏纸很便宜,但长长一条宪法下来还是难定。

    所以,为了防止有人打印宪法、课本、化学元素周期表、弟子规、三字经之类的东西,我...什么都没有做,只是把接口的POST请求换成了GET请求。这样浏览器就可以自动帮我把过长的GET请求pass掉了!除非有老六不用浏览器,用fidder这种工具来请求。

 

    解决了发文长度,还有一个问题就是关于匿名发送,虽然我提供了一个留下姓名或联系方式的框,但这并不是强制性的,所以在没有接入微博/QQ等第三方登录之前还暂不能公测。

 

    ​有兴趣的可以直接公众号回复【gugu】来获得测试地址,但是声明....不要搞花里胡哨的。

 

    如果你对咕机接口开发感兴趣,可以继续浏览下面的​内容了!​

 

### 接口开发文档

 

    如果要对咕机进行接口开发,需要先在他们官网申请开发者ak。

    http://open.memobird.cn/

    

    申请通过之后就可封装官方的API来使用了,主要用到的API有两个。一个是绑定请求,一个是打印请求。

 

1) 绑定请求 /setuserbind

    我们需要发送ak,memobirdID(设备号),useridentifying(用户Id)。之后会返回与服务器关联的userId。我们需要使用这个userId来进行打印。

 

    用fidder请求如下:

【肥宅捕获指南】快来给我写小纸条吧!_ web_07

   为了用代码实现,我们先封装一个Http请求发起的方法。

 1    private static String sendRequest(String url) {
 2         URL u ;
 3         HttpURLConnection httpURLConnection ;
 4         BufferedReader bf ;
 5         String response = "" ;
 6         String readLine  ;
 7         try{
 8             u = new URL(url) ;
 9             httpURLConnection = (HttpURLConnection)u.openConnection() ;
10             int responsecode = httpURLConnection.getResponseCode() ;  // 返回码
11             if(responsecode==200) {
12                 bf = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
13                 while ((readLine = bf.readLine()) != null) {
14                     response += readLine += "\r\n";
15                 }
16             }else{
17                 System.out.println("NOT  "+responsecode);
18             }
19         }catch(Exception e){
20             System.out.println("Exception->"+e);
21         }
22         return response ;
23     }
24

    这个方法最后返回请求体。

    当我们绑定用户时,只需要调用这个方法。

1   public static String setUserBind(){
2         String url = BASE_URL + "/setuserbind?ak=" + ak + "&timestamp=2019-08-31%14:22:39&memobirdID=" + memobirdID  + "&useridentifying=" + useridentifying;
3         return sendRequest(url) ; 
4     }

2)打印请求 printpaper

    这个请求需要的参数是ak,memobirdID(设备号),需要打印的内容,还有第一步绑定时返回的userId。

1     public static String printPaper(String content,String userId,String time) {
2         String url = BASE_URL + "/printpaper?ak=" + ak + "&timestamp="+time+"&printcontent=T:" + content + "&memobirdID=" + memobirdID + "&userId=" + userId ;
3         return sendRequest(url);
4     }

    fidder请求如下,printcontentid为本次打印的id编号。

【肥宅捕获指南】快来给我写小纸条吧!_ web_08

    这样就成功了!

 

    至于是否已经打印的接口,可以去咕机开发者文档中自行查看学习。

 

### 发送内容编码

 

    ​有一个问题是,发送打印的数据需要在GBK编码的基础上进行base64加密,所以我们自己封装还要有加密过程。

1    public static String toBase64(String str){
2         try{
3             byte[] encodeBase64 = Base64.encodeBase64(str.getBytes("GBK"));
4             return new String(encodeBase64);
5         } catch(UnsupportedEncodingException e){
6             e.printStackTrace();
7         }
8         return "";
9     }

    完成了这些关键的封装,我们只需要再搭建一个简单的页面,就可以了,使用最简单的servlet+jsp就可以了,用一个表单把内容发送到后台,然后调用后台来调用接口完成打印。

1 <form class="center-block" action="send" method="get">
2     Name:
3     <input type="text" class="form-control" placeholder="您的姓名或联系方式" name="name">
4     <br>
5     Content:
6     <textarea class="form-control" rows="6" placeholder="需要发送的内容" name="content"></textarea>
7     <br><br>
8     <input type="submit" style="margin: 0px auto;display: table;" class="btn btn-primary btn-lg btn-block" value="Submit">
9 </form>