Code Monkey home page Code Monkey logo

miaomiaoji-tool's Introduction

喵喵机蓝牙API By ihciah

依赖

pybluez 蓝牙API需要(树莓派上折腾这东西踩了挺多坑

twisted, pyopenssl 微信接口脚本需要

cv2, numpy 图像转换工具需要

建立连接

BtManager() 参数留空会搜索附近可用的喵喵机并连接

BtManager("69:68:63:69:61:68") 附加指定MAC会跳过搜索过程直接连接设备,更省时间

打印图像

从API看该机器只能输入二值图像进行打印,所以文本转图片是在客户端完成的。

打印的图像格式为二进制数据,每一位表示黑(1)或白(0),每行384个点。

mmj = BtManager()
mmj.sendImageToBt(img)
mmj.disconnect()

其他杂项

registerCrcKeyToBt(key=123456) 更改通信CRC32 KEY(不太懂这么做是为了啥,讲道理监听到这个包就能拿到key的)

sendPaperTypeToBt(paperType=0) 更改纸张类型(疯狂卖纸呢)

sendPowerOffTimeToBt(poweroff_time=0) 更改自动关机时间

sendSelfTestToBt() 打印自检页面

sendDensityToBt(density) 设置打印密度

sendFeedLineToBt(length) 控制打印完后的padding

queryBatteryStatus() 查询剩余电量

queryDensity() 查询打印密度

sendFeedToHeadLineToBt(length) 不太懂和 sendFeedLineToBt 有什么区别,但是看起来都是在打印后调用的。

queryPowerOffTime() 查询自动关机时间

querySNFromBt() 查询设备SN

其实还有挺多操作的,有兴趣的看着const.py猜一猜好了。

图像工具

ImageConverter.image2bmp(path) 任意图像到可供打印的二进制数据转换

TextConverter.text2bmp(text) 指定文字到可供打印的二进制数据转换

微信公众平台工具

两个小脚本,用来实现发送图片给微信公众号后自动打印。

wechat.php 用于VPS接收腾讯数据,默认只允许指定用户打印。

printer_server.py 放置于树莓派等有蓝牙的靠近喵喵机的机器上运行,可以使用tinc等建立VPN以供VPS直接访问。

吐槽

这玩意就不能增加一个多次打印的功能吗?以较低温度多次打印再走纸,应该可以实现打印灰度图的。

逆了好久的固件也没搞出来啥东西,真是菜。希望有大佬能告诉我一点人生的经验。

顺便丢两个芯片型号: NUC123LD4BN0, STM32F071CBU6,似乎是Cortex-M0。

PS: 本代码仅供非盈利用途,如用于商业用途请另请高明。

miaomiaoji-tool's People

Contributors

ihciah avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

miaomiaoji-tool's Issues

Broken output when max_send_msg_length is set to 2016

It just printed the last part of the images when I tried to put something that more than 2016 bytes, and I sent mmj.sendImageToBt(ImageConverter.frombits([1]*2016*8)) but the miaomiao had no action.

Then I set max_send_msg_length to (2016-48) and it seems to work well. Maybe there are some differences on miaomiao. My miaomiao firmware is "1.02.24 B" and the program runs on python2.7.

Paperang是否只支持RFCOMM协议交互数据

我研究了好几个github上的喵喵机代码,与我之前做的BLE项目很大不同。喵喵机的并没有像一般的通过名称查找设备,连接,然后遍历特征值,订阅,然后向特定的特征值里读写数据。看您的项目突然发现是RFCOMM协议传输。其他人的代码也是如此。
我尝试将代码写成swift在iPhone上运行。如果是只支持RFCOMM协议,而根据苹果规定要做认证,就基本没有可能了。所以想问问。谢谢

Reverse engineering for Paperang P2 ?

Hello,

Can you explain how you did the reverse engineering for Paperang P1 ?

I bought a Paperang P2 and with your program I can only display one black line (with the 300 black lines example) . I think it's just due to a small difference in the settings.

Thanks.

关于CRC32

我尝试把项目做成iOS的,但是发现CRC32这一步不太明白,无论怎么操作,最终都跟Python计算结果不同,从而导致无法进行下去,iOS中swift语言自带有zlib.crc32函数,这里面有三个参数,分别是uLong, 字节数字,无符号整型。但是看你的代码中,crc32函数里面只有两个参数。我在网上查阅了,关于crc32还需要定义一个table数组查找。

希望能关于这个指点一二。

数据泄露问题

我还是之前那位,由于注册telegram比较麻烦,我就单独写在issue里了。我看了你的博客,有点厉害,不过,里面写的东西太过隐私,包括注入和key,容易引起法律问题,推荐隐去。或者提交相关的平台赚一笔(笑)

解决喵喵机2驱动问题

一行是72个字节
所以是72*8个像素

关于crc32 key
我抓包的结果是只要最开始发送这个指令
0218000400219576351cdf442103
就可以把crc32还原为正常的版本
搞了一个通宵,激动

miaomiaoji-tool-master.zip
这个代码我是通过USB虚拟串口调用esp32-C3的蓝牙进行收发,大家改改就能跑了

关于喵喵机P2的USB协议

原本想研究一下蓝牙的,但是开发起来有点困难,于是开始着手于USB协议的研究。最新版的喵喵机P2配合原版软件安装驱动后已经能够被Windows识别成打印机了,可以在Office等软件中使用。在对原版软件抓包的过程中发现USB BULK的数据包和项目中喵喵机所用的蓝牙协议有类似的地方。详情如下:
喵喵机P2在USB中ID为:4348:5584,写打印的Endpoint地址是0x02。数据Payload如下:

0000   02 00 e0 40 02 ff ff ff ff ff ff ff ff ff ff ff
0010   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0020   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0030   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0040   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0050   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0060   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0070   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0080   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0090   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00a0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00b0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00c0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00d0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00e0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00f0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0100   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0110   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0120   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0130   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0140   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0150   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0160   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0170   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0180   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0190   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
01a0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
01b0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
01c0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
01d0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
01e0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
01f0   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0200   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0210   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0220   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0230   ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0240   ff ff ff ff ff 7a 52 58 6a 03

其中首字节是0x02。随后一个字节的控制命令:打印是0x00,查询设备信息是0x1a,设备响应是0x0a。之后一个字节是包的序列号。
之后两个字节是payload长度,如上例是0x0240,十进制576。接着是4字节CRC32校验码,但是目前上不明确是怎么算得。抓包发现payload序列在变化,而CRC却没有变,由此可以确定起点应该在第三个字节之后,但是通过各种尝试并没有算出与原文相符的值。
最后一个字节就是0x03。

上面的内容与项目中所说的喵喵机蓝牙协议极为相似,几乎是完全相同。

这里想请教一下CRC32的验证是怎么出来的,我感觉应该就是单纯的payload,就是一堆ff,但是算出来不对,加上面前两个字节的长度也不对。

PS:以前没抓过USB包,这算是现学现买,说的可能有错,还请多指教。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.