From efd220b52ad27fb85672558c09258ff950149167 Mon Sep 17 00:00:00 2001 From: AceVest Date: Mon, 4 Jul 2016 23:01:41 +0800 Subject: [PATCH] ... --- diying/a.py | 20 +++++ diying/b.py | 55 ++++++++++++ diying/mi/Test.class | Bin 0 -> 1539 bytes diying/mi/Test.java | 34 +++++++ diying/mi/UserInfo.class | Bin 0 -> 2999 bytes diying/mi/UserInfo.java | 185 +++++++++++++++++++++++++++++++++++++++ learn/doc/install | 6 ++ tools/hack/mi/mi.py | 41 +++++++++ 8 files changed, 341 insertions(+) create mode 100755 diying/a.py create mode 100755 diying/b.py create mode 100644 diying/mi/Test.class create mode 100644 diying/mi/Test.java create mode 100644 diying/mi/UserInfo.class create mode 100644 diying/mi/UserInfo.java create mode 100755 tools/hack/mi/mi.py diff --git a/diying/a.py b/diying/a.py new file mode 100755 index 0000000..d64fa41 --- /dev/null +++ b/diying/a.py @@ -0,0 +1,20 @@ +#!/usr/bin/python +from bluepy.btle import Scanner, DefaultDelegate + +class ScanDelegate(DefaultDelegate): + def __init__(self): + DefaultDelegate.__init__(self) + + def handleDiscovery(self, dev, isNewDev, isNewData): + if isNewDev: + print "Discovered device", dev.addr + elif isNewData: + print "Received new data from", dev.addr + +scanner = Scanner().withDelegate(ScanDelegate()) +devices = scanner.scan(10.0) + +for dev in devices: + print "Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi) + for (adtype, desc, value) in dev.getScanData(): + print " %s = %s" % (desc, value) diff --git a/diying/b.py b/diying/b.py new file mode 100755 index 0000000..cf3fa67 --- /dev/null +++ b/diying/b.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------ +# File Name: ble.py +# Author: Zhao Yanbai +# 2016-07-04 22:42:30 Monday CST +# Description: none +# ------------------------------------------------------------------------ +import struct +import time +import binascii +import bluepy.btle as btle + +class MyDelegate(btle.DefaultDelegate): + def __init__(self): + btle.DefaultDelegate.__init__(self) + + def handleNotification(self, cHandle, data): + print("cHandle:", hex(cHandle), " Data:", data) + +def uuid2str(uuid) : + s = binascii.b2a_hex(uuid) + return "-".join([s[0:8], s[8:12], s[12:16], s[16:20], s[20:32]]) + +def barline(title) : + s = title + s += "-"*(80-len(title)) + print(s) + +p = btle.Peripheral("C8:0F:10:6A:B1:F0", btle.ADDR_TYPE_PUBLIC, 0) +p.withDelegate( MyDelegate() ) + + +Services = p.getServices() +Characteristics = p.getCharacteristics() + + +barline("Services") +for s in Services : + print("{0} {1}".format(uuid2str(s.uuid.binVal), s.uuid.getCommonName())) + +barline("Characteristics") +ch = None +och = None +for c in Characteristics : + print("{0} {1:4} {2:>5} {3:18} {4}".format(uuid2str(c.uuid.binVal), hex(c.getHandle()), str(c.supportsRead()), c.propertiesToString(), c.uuid.getCommonName())) + if c.uuid.getCommonName() == "ff04" : + ch = c + + if c.uuid.getCommonName() == 'Alert Level' : + print binascii.b2a_hex(c.read()) + och = c + +p.disconnect() + diff --git a/diying/mi/Test.class b/diying/mi/Test.class new file mode 100644 index 0000000000000000000000000000000000000000..db769fed65452c6cfdb97e2ce2e0b089b38ba7c7 GIT binary patch literal 1539 zcmZvcTT>fl7{`AP8?u}2mV|IFr7g6j35NpZP#}mBS}ZmcYygW`bxD@67!oE~s_0Cw zobg+D;f3DTWF~a%OfS9gWB3WY_M$p(2r>wJ@qgaK|2h4iclM8Wzr6*<*fqJvRDdp~ z6~s(BnK9|&y#TYkZ}I_i261&aZ}NbL3Kn!eG_jac@JPX;CO`iEr(%7i;IV>)f+Yn{ z43?E$QSh-#dv##@rpdGkrK^6sn#>u6ff}q(MNAT}BZf3_5{9o4=^>)^^ zi$XZDYrn9EvUV;rl=KR2E)x@c-r>F@1mdf6>2$#<7ON4yNqPk#u(wup3X8ezykI6y z)-l09|;pUtt2YXviVb$KsI)ZP{c5^~&Wb=G#<=7Z^b9Uiy zHUFrZ(amM5A>}N%DsN!bDSCHRw-y5o zTJ+Ix5uw*&gHJ8)F{-m^@fpu`KDYRSF9j^3^y)mbu-URmkrvwiFIoJ+&8D4#g~PT* zh8>IR+_30Y(4*j{f?M1Ww7HaHaa*OmqxOySlheZs(<8&v6LZt?k?DnDAv8R4Z***Y z;{N2+Tzvk)!v(=OQCb!63O?115IQYod2826ojp1ps9ZFQ`Jt79oAZ)h!Lj#ZLQ^&M*<(T9SEOuCXt^lUy5LXk*o8Sy@I@A* z^Md}u&K@|++sb49!Xf+Z{e35w76va0d9I(@G-86`$Ppp&(^mUCk^4ClK+Y07uE-k&m+Bo9!K!t|m+feZ3@l}O}3c(XX ze}x7`st`@CMv2A} z;Sx~Dp((8bujhR6TnXcI!zd~qkgz1-CUv> 4)); + hex +=String.valueOf(hexStr.charAt((bytes[i]&0x0F))); + result += hex; + } + + return result; + } + +} diff --git a/diying/mi/UserInfo.class b/diying/mi/UserInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..e3174c6c12ead3d10974aed806249565a6fd0192 GIT binary patch literal 2999 zcmZ{l+jA4w9mhXMtJSWQH7vpc8{;%I36WP829!8N1_uPTQLwp$ivg!eWowZIMpEQ; zFxOB@lU`^$?n{TsOw&mp{L)Fu43aa2`nl8RKJ~G0{R`UZ5Zw8#WGKe$!}om8IltdI zzw6n*J^u3|@Fu^E5a*c5`(Yv+7dRnsQs9)psK9A~GX`fPL^x(JX7WJVFW`#8IT0xcOhzbj-rz!nO>*m$j28t;CS{X~$;YBmHJO&tGnp~@L`;Yh-c+{{-ms^ zS?8+diyRnXciJ({43eI#=#fv>f+x6BkBu75_AY%LZo+#tc4Gm<87p z)oI0s`19v?jb#k3D2#&Z?SFs&E`=_qXBDPbZg`_;jdwk-=|{;sDIwG1q7W{)-cU1c zTD&XM5ZEWdldXfzun8Y+axrdSBZ^|c2|s3$y^ggaQ2z_cv8xlMv>k>X7S7Teij z(S>7?pxYuTuuY&xU?<%Qb6Hhkugs7_KY3y>xl0bbs(8)cFP3{wmZoPam2%Z{^8=-c za=ut949rfr6|Yz>S-i_$gDV!-xNdQSPX%rY{K(=KKeouQ-{Lky7C+%LgU>B~%Fh%V zS6-i)DNgzI6`U#N(-uGH7Xo(_W_P3X(h9vhS8&s^)F{2Q#UX}d-l)K|#jwncZod%I zicq&yUE1OR1J5{pWc<84;VA-R8O3_vno_acBXyCPId@Jfy*)mbS*-x2{>0f7*0%|t6@6r zp&FVKGv;c9pI+n;0bv_8N(^9glV9*~z$wSi&(ANYBfzq7&XwjBB_Q*WuVeO$gVz++Fy2DB5K8+;R ziH`a++q~ju?dgKOa-r?n1$|jGv`ma;VlI=gPa5l*@a{$1`~z*t?mFv7leXEtn15&r zpT|meYqnXZb<|$}&`bxlUOlF_2N%C0)*g)M$vUx^o;q<`SMy8%a@vCnY)B;PY}E60 z+HCt<+Hd(D^y>PV`M}R)C!rC8 z{zn82`X2Fx!9MdlOoKl4U)l-CKcLxR|7>>HrNrVMtzYX6ZoVB@`W^X1=WR`;dUf0E z4aGutIojy5m@Yown(H-UhOpobp?+?I*XDYIG25c;G4X2>(p&srdd#yC0?n7FK^z(yu{h4XCZ0)0#|$VCoO<}@EO!6X-%rh@1D z9YcSNsg(MTs8WyEt^Px+JUs^(X!`qU^C|l10h`V&&=K8Sr&G$a&dbs7HMlPPl?D$9 z-y*!u_l3XO;I9dPy&5Oh|@Nk`%>%4Jq#q)NV9b97%*HH{I)HJ3O<=2ZY21qCx zFQRl8e2(HE*;PdKm7>2!@!qPUp_QV)Madt!dFqyCG{Vk({Cuty{}LrX@KwZ3N&iam ic@!g0V*UT_X-^~4aPLnj4zFr+c;%@JD317ra`b<0GFwXk literal 0 HcmV?d00001 diff --git a/diying/mi/UserInfo.java b/diying/mi/UserInfo.java new file mode 100644 index 0000000..9998f66 --- /dev/null +++ b/diying/mi/UserInfo.java @@ -0,0 +1,185 @@ +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; + +public class UserInfo +{ + + private int uid; + private byte gender; + private byte age; + private byte height; // cm + private byte weight; // kg + private String alias = ""; + private byte type; + + private UserInfo() + { + + } + + public UserInfo(int uid, int gender, int age, int height, int weight, String alias, int type) + { + this.uid = uid; + this.gender = (byte) gender; + this.age = (byte) age; + this.height = (byte) (height & 0xFF); + this.weight = (byte) weight; + this.alias = alias; + this.type = (byte) type; + } + + public static UserInfo fromByteData(byte[] data) + { + if (data.length < 9) + { + return null; + } + UserInfo info = new UserInfo(); + + info.uid = data[3] << 24 | (data[2] & 0xFF) << 16 | (data[1] & 0xFF) << 8 | (data[0] & 0xFF); + info.gender = data[4]; + info.age = data[5]; + info.height = data[6]; + info.weight = data[7]; + try + { + info.alias = data.length == 9 ? "" : new String(data, 8, data.length - 9, "UTF-8"); + } catch (UnsupportedEncodingException e) + { + info.alias = ""; + } + info.type = data[data.length - 1]; + + return info; + } + + public byte[] getBytes(String mBTAddress) + { + byte[] aliasBytes; + try + { + aliasBytes = this.alias.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) + { + aliasBytes = new byte[0]; + } + ByteBuffer bf = ByteBuffer.allocate(20); + bf.put((byte) (uid & 0xff)); + bf.put((byte) (uid >> 8 & 0xff)); + bf.put((byte) (uid >> 16 & 0xff)); + bf.put((byte) (uid >> 24 & 0xff)); + bf.put(this.gender); + bf.put(this.age); + bf.put(this.height); + bf.put(this.weight); + bf.put(this.type); + bf.put((byte)0x04); + bf.put((byte)0x00); + if(aliasBytes.length<=8) + { + bf.put(aliasBytes); + bf.put(new byte[8-aliasBytes.length]); + }else{ + bf.put(aliasBytes,0,8); + } + + byte[] crcSequence = new byte[19]; + for (int u = 0; u < crcSequence.length; u++) + crcSequence[u] = bf.array()[u]; + + byte crcb = (byte) ((getCRC8(crcSequence) ^ Integer.parseInt(mBTAddress.substring(mBTAddress.length()-2), 16)) & 0xff); + bf.put(crcb); + return bf.array(); + } + + private int getCRC8(byte[] seq) + { + int len = seq.length; + int i = 0; + byte crc = 0x00; + + while (len-- > 0) + { + byte extract = seq[i++]; + for (byte tempI = 8; tempI != 0; tempI--) + { + byte sum = (byte) ((crc & 0xff) ^ (extract & 0xff)); + sum = (byte) ((sum & 0xff) & 0x01); + crc = (byte) ((crc & 0xff) >>> 1); + if (sum != 0) + { + crc = (byte) ((crc & 0xff) ^ 0x8c); + } + extract = (byte) ((extract & 0xff) >>> 1); + } + } + return (crc & 0xff); + } + + public String toString() + { + return "uid:" + this.uid + + ",gender:" + this.gender + + ",age:" + this.age + + ",height:" + this.getHeight() + + ",weight:" + this.getWeight() + + ",alias:" + this.alias + + ",type:" + this.type; + } + + /** + * @return the uid + */ + public int getUid() + { + return uid; + } + + /** + * @return the gender + */ + public byte getGender() + { + return gender; + } + + /** + * @return the age + */ + public byte getAge() + { + return age; + } + + /** + * @return the height + */ + public int getHeight() + { + return (height & 0xFF); + } + + /** + * @return the weight + */ + public int getWeight() + { + return weight & 0xFF; + } + + /** + * @return the alias + */ + public String getAlias() + { + return alias; + } + + /** + * @return the type + */ + public byte getType() + { + return type; + } +} diff --git a/learn/doc/install b/learn/doc/install index 580430d..5b46589 100644 --- a/learn/doc/install +++ b/learn/doc/install @@ -21,3 +21,9 @@ gnugo rhythmbox ffmpeg +apt-get install bluez +apt-get install libboost-python-dev +apt-get install libbluetooth-dev +apt-get install libboost-all-dev +pip install gatterlib + diff --git a/tools/hack/mi/mi.py b/tools/hack/mi/mi.py new file mode 100755 index 0000000..1aac4ae --- /dev/null +++ b/tools/hack/mi/mi.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------ +# File Name: mi.py +# Author: Zhao Yanbai +# 2016-07-04 22:36:34 Monday CST +# Description: none +# ------------------------------------------------------------------------ + +import datetime +import time +import mibanda +import sys + +def main() : + if len(sys.argv) != 2 : + print("{0} ".format(sys.argv[0])) + sys.exit() + + macAddr = sys.argv[1] + + device = mibanda.BandDevice(macAddr, "MI") + device.connect() + print "Address:", device.getAddress() + print "Name:", device.getName() + bi = device.getBatteryInfo() + print "BatteryInfo. Status:", bi.status, " Level:", bi.level, " Charge Counter:", bi.charge_counter, " Last Charge:", bi.last_charged + + print "Steps:", device.getSteps() + di = device.getDeviceInfo() + print "DeviceInfo:", di.firmware_version + + print "SetUserInfo" + device.setUserInfo(27182818, True, 25, 123, 45, 0, "Ace") + print "Finished" + t= datetime.datetime.now() + datetime.timedelta(seconds=100) + device.setAlarm(enable=1, number=0, when=t, smart=0, repeat=0) + + +if __name__ == "__main__" : + main() -- 2.47.0