python 接收藍芽閘道器程式碼(已解決)
阿新 • • 發佈:2019-01-10
這是mqtt的程式碼 可以為後面寫http通訊的資料解析做參考
完全可以測通的(是因為防火牆的問題)
原因:開啟了防火牆在本地是可以測通的 外面的機器是訪問不了我的電腦的
解決辦法:關閉防火牆就可以了
存在問題: 貌似沒有做任何處理的http包 會存在粘包現象 不定時的的報錯 因為用的式非同步框架 所以不影響整體執行,但會丟失一部分資料(現改用mqtt通訊模式)
有用的程式碼
初級版
import tornado.ioloop import tornado.web import msgpack from binascii import * class MainHandler(tornado.web.RequestHandler): def get(self): print('get') self.write("Hello, get") def post(self): #print(payloads); print('post') # package=self.request.files['chunk'][0]['body']; package = self.request.body data = msgpack.unpackb(package,use_list=False, raw=False) brocast_data = data['devices'] outData={'header':"",'payload':[]} for b in brocast_data: record={}; data_bro={}; try: print(b) record=b2a_hex(b) print(int(record[:2],16)) print(hex(int(record[:2],16))) data_bro['type']=hex(int(record[:2],16)) data_bro['mac']=hex(int(record[2:14],16)) data_bro['rssi']=hex(int(record[14:16],16)) data_bro['broadcast_data']=hex(int(record[16:],16)) except: pass; outData['payload'].append(data_bro); print(outData) # # info = str(data['devices'],'utf-8') # print(info) application = tornado.web.Application([ (r"/", MainHandler),]) if __name__ == "__main__": application.listen(1883,'10.33.4.31') tornado.ioloop.IOLoop.instance().start()
初級+ 可以檢視每秒內的藍芽廣播裝置數量(但不是廣播資料量)
import tornado.ioloop import tornado.web import msgpack from binascii import * class MainHandler(tornado.web.RequestHandler): def get(self): print('get') self.write("Hello, get") def post(self): # print('post') package = self.request.body data = msgpack.unpackb(package,use_list=False, raw=False) brocast_data = data['devices'] outData={'header':"",'payload':[]} mac_data = set() for b in brocast_data: record={}; data_bro={}; try: record=b2a_hex(b) data_bro['type']=hex(int(record[:2],16)) data_bro['mac']=hex(int(record[2:14],16)) data_bro['rssi']=hex(int(record[14:16],16)) data_bro['broadcast_data']=hex(int(record[16:],16)) mac_data.add(data_bro['mac']) except: pass; outData['payload'].append(data_bro); print(len(mac_data)) if __name__ == "__main__": application = tornado.web.Application([(r"/", MainHandler),]) application.listen(1883,'10.33.4.31') tornado.ioloop.IOLoop.instance().start()
輸出:
偶爾列印異常
20 20 19 21 21 17 ERROR:tornado.application:Uncaught exception POST / (10.33.4.43) HTTPServerRequest(protocol='http', host='10.33.4.31:1883', method='POST', uri='/', version='HTTP/1.1', remote_ip='10.33.4.43', headers={'Host': '10.33.4.31:1883', 'Content-Length': '2474'}) Traceback (most recent call last): File "D:\F\Anaconda3\lib\site-packages\tornado\web.py", line 1509, in _execute result = method(*self.path_args, **self.path_kwargs) File "D:\F\eclipse-workspace\UDP\src\78.py", line 13, in post data = msgpack.unpackb(package,use_list=False, raw=False) File "msgpack\_unpacker.pyx", line 195, in msgpack._cmsgpack.unpackb msgpack.exceptions.ExtraData: unpack(b) received extra data. ERROR:tornado.access:500 POST / (10.33.4.43) 47.98ms