1. 程式人生 > >python 接收藍芽閘道器程式碼(已解決)

python 接收藍芽閘道器程式碼(已解決)

這是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