Context

蓝牙的传输距离实在是不够长,对于我这种调试人员来说,如果可以有一种方法,远程的调试蓝牙外设,那岂不是超级爽歪歪嘛?

所以某一天洗澡的时候,我就打算使用网络来传输蓝牙数据~

借鉴OSI分层或者网络分层的结构,我觉得只要对BLE传输的数据做一层封装,再通过tcp来传输就可以解决这个问题。

Let’s do it

所以这个系统需要至少三个东西,一台作为central的硬件,一台作为peripheral的硬件,以及一个将他们连在一起的服务器。

由于我手上恰恰恰恰好有两台Linkit One物联网开发平台,而且它本身就拥有蓝牙,Wi-Fi的功能,所以central和peripheral肯定就用这两个硬件来试验了~

服务器的话,测试阶段也可以很简单,只要简简单单的将两方的数据做一个交换就好了。再这个阶段并不需要安全认证,多用户绑定,数据正确性检查,数据缓存等等功能,
只要交换就好!

因为python写的贼熟悉了,所以当然还是搞一个简单的python socket服务器比较好。

这个项目开个源吧

Coding.Net : https://git.coding.net/vikingwarlock/BLEoE.git

Github: https://github.com/VikingWarlock/BLEoE.git

两个进度会不一样,因为github上面还是不要留太多的草稿吧

TCP or UDP

嗯,这个问题可能会比较有争议。一开始我是打算使用udp的,因为会比较快,我担心未来网络延迟或者服务器性能不佳会导致数据包在网络上耽误较长的时间,导致蓝牙操作超时。
可是udp很不可靠,万一出事情了,反而得不偿失。所以先使用tcp来测试测试。

先贴一下我简简单单搞得2用户数据交换的tcp服务器代码吧

import asyncore
import socket

handler_list = {}


class EchoHandler(asyncore.dispatcher_with_send):

    def configure_local_address(self, address):
        self.address = address

    def configure_target_address(self, address):
        self.target_address = address

    def handle_read(self):
        data = self.recv(8192)
        if data and self.target_address:
            hd = handler_list.get(self.target_address)
            if hd:
                hd.send(data)
            else:
                self.target_address = None
                self.send("fail to send, target is down")
        else:
            self.send("no target")

    def handle_close(self):
        handler_list[self.address] = None
        self.close()
        print 'connection from %s lost' % repr(self.addr)


class EchoServer(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        pair = self.accept()
        if pair is not None:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = EchoHandler(sock)
            handler.configure_local_address(addr)
            handler_list[addr] = handler
            if len(handler_list) > 1:
                it1 = handler_list.values()[0]
                it2 = handler_list.values()[1]
                it1.configure_target_address(it2.address)
                it2.configure_target_address(it1.address)

    def handle_close(self):
        self.close()


server = EchoServer('0.0.0.0', 3344)
asyncore.loop()