快速开始

快速开始您的开发之旅

运行流程

开发者-->喵印开放平台-->设备

开发者通过喵印开放平台api获取对设备的获取和控制的能力,通过签名

连接设备

连接电源启动设备

使用12V-5A电源适配器连接电源接口,设备通电即会自动开机,电源按钮处LED灯将亮起。若没有自动开机,请手动按一下电源按钮。

若需要设置通电自动开机,请查看设置通电自动开机方法

连接网络

喵印打印盒需要互联网连接。

使用DHCP有线网络

使用网线将设备连接到DHCP的路由器/交换机,设备的网卡将会通过DHCP自动获取IP连接到互联网。

手动配置无线网络

  1. 把WiFi增强天线安装在设备两边的WiFi天线螺旋接头上。
  2. 准备USB鼠标、USB键盘、VGA/HDMI显示器,连接到设备相应到接口当中。
  3. 系统开启后,点击系统任务栏右下角的WiFi图标,点击需要连接的WiFi网络并点击“连接”,输入WiFi网络的密码,点击确认后连接到无线网络。

手动配置有线网络

  1. 准备USB鼠标、USB键盘、VGA/HDMI显示器,连接到设备相应到接口当中。
  2. 系统开启后,点击系统任务栏右下角的Wi-Fi图标,点击“打开网络和共享中心”,点击左边栏上的“更改适配器设置”,双击打开“本地连接”,点击选中“Internet协议版本4(TCP/IP)”,然后点击“属性”,点击选择“使用下面的IP地址”,输入IP地址、子网掩码、默认网关、DNS服务器地址等,点击确认后连接到互联网。

其它配置网络方法

对于不同的生产、生活环境会有不同的网络需求,网络环境会有与以上列出的不同,如有需要,请联系我们

接入流程

成为开发者

点击顶部导航栏右侧 控制台 或者底部 立即使用,将会跳转到注册界面,补充开发者信息后即可进入控制台页面。

创建应用

在控制台页面,您可在「应用」板块点击创建应用,填写应用的相关信息,完成应用的创建。

获取密钥

在您的应用创建完毕后,您可在应用详情中查看到此应用的接入凭证,主要为 app_idapp_secret。 以上两个字段信息是您应用实际开发的主要凭证,每个应用唯一标示,互不相同,请您妥善保管。

生成签名

您的应用在调用平台技术接口之前,首先需要获取接口鉴权签名。 您需要使用应用所分配到的 app_idapp_secret,进行接口鉴权签名的生成,方法详见接口鉴权

接口规范

接口采用RESTful开发规范,开发时全局的请求规范:

https://open.aimiaoyin.com/api/v1/device/...

固定请求header

Content-Type:application/x-www-form-urlencoded

固定请求data

app_id:xxxxxx (开发者申请的app_id)
time_stamp:1565247368 (当前时间戳)
nonce_str:zOMUwhgCvRzelgTE (随机生成)
sign:C2C0EEB6F28DCB8C012B6811C857A1E7 (按照实际key进行计算)

接口鉴权

简介

本文档主要针对需要集成HTTP API的技术研发工程师。

喵印开放平台HTTP API使用签名机制对每个接口请求进行权限校验,对于校验不通过的请求,API将拒绝处理,并返回鉴权失败错误。

接口调用者在调用API时必须带上接口请求签名,其中签名信息由接口 请求参数应用密钥 根据本文提供的签名算法生成。

签名算法

计算步骤

  1. 请求参数对按key进行 字典升序 排序,得到有序的参数对 列表N

  2. 将列表N中的参数对按 URL键值对的格式 拼接成字符串,得到 字符串T(如:key1=value1&key2=value2),URL键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8,而不是小写%e8

  3. 将应用密钥以app_secret为键名,组成URL键值拼接到字符串T末尾,得到 字符串S(如:key1=value1&key2=value2&app_secret=密钥)

  4. 对字符串S进行MD5运算,将得到的 MD5值所有字符转换成大写,得到接口 请求签名

注意事项

  • 不同接口要求的参数对不一样,计算签名使用的参数对也不一样

  • 参数名区分大小写,参数值为空不参与签名

  • URL键值拼接过程value部分需要URL编码

  • 签名有效期5分钟,需要请求接口时刻实时计算签名信息

  • 更多注意事项,请查看常见问题

参考代码

  • php
    public function sign($appId,$appSecret,$params){
        //0.补全基本参数
        $params['app_id']  = $appId;
        //1.字典升序排序
        ksort($params);
        //2.拼按URL键值对
        $str = '';

        foreach ($params as $key => $value)
        {
            if ($value !== '')
            {
                $str.= $key.'='.urlencode((string)$value).'&';
            }
        }
        //3.拼接app_secret
        $str.='app_secret='.$appSecret;
        //4.MD5运算+转换大写,得到请求签名
        $sign = strtoupper(md5($str));
        return $sign;
    }
  • python
import hashlib
import urllib
import urllib2
import base64
import json

def genSignString(parser):
    uri_str = ''
    for key in sorted(parser.keys()):
        if key == 'app_secret':
            continue
        uri_str += "%s=%s&" % (key, urllib.quote(str(parser[key]), safe = ''))
    sign_str = uri_str + 'app_secret=' + parser['app_secret']
    hash_md5 = hashlib.md5(sign_str)
    return hash_md5.hexdigest().upper()
  • Java
    public static String getSignature(Map<String, Object> params,String appSecret) throws IOException {
        Map<String, Object> sortedParams = new TreeMap<>(params);
        Set<Map.Entry<String, Object>> entrys = sortedParams.entrySet();
        StringBuilder baseString = new StringBuilder();
        for (Map.Entry<String, Object> param : entrys) {
            if (param.getValue() != null && !"".equals(param.getKey().trim()) &&
                    !"sign".equals(param.getKey().trim()) && !"".equals(param.getValue())) {
                baseString.append(param.getKey().trim()).append("=")
                        .append(URLEncoder.encode(param.getValue().toString(), "UTF-8")).append("&");
            }
        }
        if (baseString.length() > 0) {
            baseString.deleteCharAt(baseString.length() - 1).append("&app_secret=")
                    .append(appSecret);
        }
        try {
            String sign = MD5.md5(baseString.toString());
            System.out.println("sign:" + sign.toUpperCase());
            return sign.toUpperCase();
        } catch (Exception ex) {
            throw new IOException(ex);
        }
    }
  • js(小程序)
    const MD5 = require('./md5.min.js'); 

    /**
     * javascript实现PHP字典排序
     * @param {Object} vm 当前this
     * @param {Array} inputArr 规定要进行排序的数组
     * @param {String} sort_flags 规定如何排列数组的元素/项目
     */
    export function ksort(vm, inputArr, sort_flags) {
      var tmp_arr = {},
        keys = [],
        sorter, i, k, that = vm,
        strictForIn = false,
        populateArr = {};

      switch (sort_flags) {
        case 'SORT_STRING':
          // compare items as strings
          sorter = function (a, b) {
            return that.strnatcmp(a, b);
          };
          break;
        case 'SORT_LOCALE_STRING':
          // compare items as strings, original by the current locale (set with  i18n_loc_set_default() as of PHP6)
          var loc = vm.i18n_loc_get_default();
          sorter = vm.php_js.i18nLocales[loc].sorting;
          break;
        case 'SORT_NUMERIC':
          // compare items numerically
          sorter = function (a, b) {
            return ((a + 0) - (b + 0));
          };
          break;
        // case 'SORT_REGULAR': // compare items normally (don't change types)
        default:
          sorter = function (a, b) {
            var aFloat = parseFloat(a),
              bFloat = parseFloat(b),
              aNumeric = aFloat + '' === a,
              bNumeric = bFloat + '' === b;
            if (aNumeric && bNumeric) {
              return aFloat > bFloat ? 1 : aFloat < bFloat ? -1 : 0;
            } else if (aNumeric && !bNumeric) {
              return 1;
            } else if (!aNumeric && bNumeric) {
              return -1;
            }
            return a > b ? 1 : a < b ? -1 : 0;
          };
          break;
      }

      // Make a list of key names
      for (k in inputArr) {
        if (inputArr.hasOwnProperty(k)) {
          keys.push(k);
        }
      }
      keys.sort(sorter);
      // BEGIN REDUNDANT
      vm.php_js = vm.php_js || {};
      vm.php_js.ini = vm.php_js.ini || {};

      // END REDUNDANT
      strictForIn = vm.php_js.ini['phpjs.strictForIn'] && vm.php_js.ini['phpjs.strictForIn'].local_value && vm.php_js
        .ini['phpjs.strictForIn'].local_value !== 'off';
      populateArr = strictForIn ? inputArr : populateArr;

      // Rebuild array with sorted key names
      for (i = 0; i < keys.length; i++) {
        k = keys[i];
        tmp_arr[k] = inputArr[k];
        if (strictForIn) {
          delete inputArr[k];
        }
      }
      for (i in tmp_arr) {
        if (tmp_arr.hasOwnProperty(i)) {
          populateArr[i] = tmp_arr[i];
        }
      }

      return strictForIn || populateArr;
    }

    // 签名算法
    const createSign = (vm, params) => {

      let data = params ? params : {}
        let aa = ksort(vm, data)
        let bb = ''

        // 拼接url键值对
        Object.keys(aa).forEach((key, i) => {
          if(aa[key] !== '') {
            bb += key + '=' + encodeURIComponent(aa[key]) + '&'
          }
        })

        // 拼接app_key
        let cc = `${bb}app_secret=${params.app_secret}`

        // MD5运算
        let dd = MD5(cc)

        let ee = dd.toUpperCase()

        data.sign = ee
        return data
    }

    // 使用
    createSign(this, data)
  • goland
    敬请期待
  • .net core
    敬请期待

设备能力

更多设备接入能力正在开发中

设备能力 参数名 版本 时间
获取设备状态 getPrinterStatus v1 2019-08-06
添加打印任务 addPrintJob v1 2019-08-06
设置打印业务属性 setDeviceAttribute dev dev
设置打印设备信息 setDeviceInfo dev dev

results matching ""

    No results matching ""