蓝牙定位用什么单片机_单片机蓝牙定位 - CSDN
  • 总所周知,在室外我们可以GPS或者是北斗进行精确的定位,但是GPS和北斗却对室内定位束手无策。那么有谁能够担当室内定位大任呢?我们今天的室内定位主角是蓝牙4.0BLE模块 beacon定位! 室内定位有7大技术,分别是...

    总所周知,在室外我们可以用GPS或者是北斗进行精确的定位,但是GPS和北斗却对室内定位束手无策。那么有谁能够担当室内定位大任呢?我们今天的室内定位主角是蓝牙4.0BLE模块 beacon定位!
    室内定位有7大技术,分别是哪些呢?
    | 蓝牙室内定位技术
    | Wi-Fi室内定位技术
    | ZigBee室内定位技术
    | 超宽带室内定位技术
    | 红外线技术
    | RFID技术
    | 超声波技术

    什么是蓝牙beacon室内定位
    简单来说,Beacon 就是一个小型的信息基站,可以应用在室内导航、移动支付、店内导购、人流分析、物品跟踪等等所有与人在室内流动相关的活动之中。Beacon 技术做到的是通过 Bluetooth Smart (智能蓝牙)向通信覆盖范围内的移动设备捕捉和推送信息。

    它的应用场景非常的广阔,通过 Beacon 可以进行室内定位并提供相应的服务,如在百货商场及时推送品牌促销信息、在机场为旅客定位登机口和餐饮设施的位置、或在博物馆向游客推送身旁的文物信息等。在这些应用场景中,Beacon 的位置是固定的,用户通过智能手机 app 可以获取这些位置信息。

    Beacon 的首要任务就是允许 app 确认两者之间的相对位置,并借助这一位置信息实现更多功能。例如,而对于商场的 Beacon 应用,根据店铺 ID 规划 Beacon ID 会更合适,这样 app 就能够判断出用户是走进了左边的这家李宁,还是右边的那家耐克,然后就可以很轻松的推送固定的优惠措施了。

    Beacon 还可以通过信号强度就能够很轻松的推算用户的相对距离。比如距离为一米时,信号强度是多少多少,所以我们就可以通过接收器(例如手机)测量到的信号强度推算出相对应的距离。

    针对走进商场或店铺的顾客、机场里走近值机柜台的旅客等。而对于其他一些应用,可能需要用户十分靠近特定的 Beacon 时,才会提示用户。比如占地较小、陈列物密集的博物馆或美术馆的导览系统,就需要在参观者十分靠近特定的展品时才会提示相应的展品信息。

    通过 Beacon 将产品和促销信息发送给顾客;博物馆和美术馆等也可以开发专门的应用,向走进展厅的参观者发送展厅主题介绍、或对在展品前驻足的参观者发送详细的展品信息等;机场还可以用 Beacon 追踪所有旅客的动向。

    虽然 Beacon 的功耗很低,但现在研究人员们也正在考虑其他「能量获取」技术,例如从杂散 RF 信号吸收能量,目前看来最有希望的解决方案很可能是无线充电技术,届时能够让蓝牙设备将能吸收来自附近(通常在 5 米左右范围内)的能量。以后必需支持类似于 Wi-Fi 的模式,使咖啡馆、机场、酒店和办公室全都具有「充电热点」,以便我们能够随时为可穿戴设备充电。

    Skylab的蓝牙室内beacon定位

    SKYLAB蓝牙4.0ble模块室内定位是一种短距离低功耗的无线传输技术,在室内安装适当的蓝牙局域网接入点后,将网络配置成基于多用户的基础网络连接模式,并保证蓝牙局域网接入点始终是这个微网络的主设备。这样通过检测信号强度就可以获得用户的位置信息。

    http://www.skylab.com.cn/newsview-42.html

    用户身上也要有个探针吗?否则怎么判断witch person?
    机场 beacon 追踪所有人员的动向如何做?

    展开全文
  • 定位原理 蓝牙和WiFi信号都有信号衰减快的特性,在通信方面是一大弊端,但凡事都是有弊必有利。同样我们以可以利用他的这个特性,比如用作根据RSSI(信号强度)的定位。 之前苹果公司 就有一个可以粗略的计算距离...

    定位原理

    1. 蓝牙和WiFi信号都有信号衰减快的特性,在通信方面是一大弊端,但凡事都是有弊必有利。同样我们以可以利用他的这个特性,比如用作根据RSSI(信号强度)的定位。
    2. 之前苹果公司 就有一个可以粗略的计算距离的Ibeacon模块。但是他的局限性就是只能
      手机端通过对ibeacon的检测,算出ibeacon的大概距离。这样以来,如果我们做一个基于ibeacon的定位,那么每个标签就是一个ibeacon,按照市场价格一个ibeacon大约要33美元。很明显,它的优势不足以为高昂的价格买单。
    3. 蓝牙模块HC-05提供了丰富的AT指令,其中就有我们需要的用于查询RSSI的指令,可谓是:天助我也。/笑哭

    所需材料

    分类 所需材料
    硬件部分 STC89C51单片机(带基本外围电路),ESP8266WiFi模块,HC-05蓝牙模块,USB-TTL模块,面包板,公对公 公对母 母对母杜邦线,(最好再有一个22.1184MHZ的晶振,如果你会改变ESP8266模块的波特率的话你也可以没有)。
    软件部分 串口助手,网络串口助手,Keil编译器,单片机烧录软件。

    前期准备

    相关准备 参考意见
    单片机串口通信 这个是必须的,大部分速度较快的模块都是通过串口方式通信的。所以学会了单片机的串口通信,可以做很多东西。不过话说回来其实每次写程序没必要每次都去写那些例如串口初始化啊这些函数,可以做一次,然后建立一个自己的代码库每次使用岂不方便。

    实物图

    单片机接线
    这里需要注意的是面包板上我用的全部都是3.3V的电源,因为ESP8266要
    求的是3.3V电源。而HC-05要求的是3.3V-5.0V的电源为了保证通信的正常
    全部使用的是3.3V电源。
    !!!!单片机仍用5V电源,因为我试了一下单片机在3.3V的时候有时候
    会出现异常。
    模块
    这两个模块没什么好说的,唯一需要注意的是蓝牙模块按键的顺序,因为是提
    前配置好的,所以每次长按KEY的时候,都会返回数据。
    面包板
    面包板上的线看似很乱,我也是为了方便检查错误,为了调试错误花了我两天
    的时间。真的很烦!!将每个传送数据的端口都接在面包板上面,这样我们就
    可以用USB-TTL很方便的检查每条线上的数据。这样有利于调试。

    关键代码

    基础代码:

    //********************send message***********************
    void UsartInit()
    {
        SCON=0X50;      
        TMOD=0X20;          
        PCON=0X80;          
        TH1=0XFF;           
        TL1=0XFF;//Set baud rate to 115200bps.
        ES=1;                   
        EA=1;                   
        TR1=1;                  
    }
    void sendByte(uchar byte)
    {
        SBUF=byte;
        while(!TI);
        TI=0;
    }
    void sendString(uchar *s)
    {
        while(*s!='\0')
        {
            sendByte(*s);
            s++;
        }
    }
    void sendMsg(char* msg[]){
        ES=0;
        delayms(100);
        sendString(msg);
        delayus(100);
        ES=1;
    }

    核心代码:

    void receiver() interrupt 4
    {
    
        static char i=0;
        static char flag=0;
        char ch=0;
        static ch2=0;//ch2:How times get ',' to judge the end.
    
        ch=SBUF;
        if('+'==ch || flag==1){
            flag++;
    
            if('I'==ch){
                flag++;//flag=3
            }
            else if(flag==2) {
                flag=0;
            }
        }
        if(flag>=3){
            flag++;
            //this time get ':'.
            if(flag>7){
                if(ch==',')
                {
                    ch2++;
                }
                if(ch2!=1){
                   recMsg[i++]=ch;
                }
                if(ch2==2){
                    end++;
                    if(end==5){                 
                        recMsg[i++]='\r';
                        recMsg[i++]='\n';
                        recMsg[i++]='\0';
                        i=0;
                        flag=0;
                        ch2=0;
    
                    }
                }           
            }
        }
        RI=0;
    }

    核心代码分析:

    此代码用于对蓝牙模块返回的数据进行净化,过滤掉我用信息,然后将我们所需要的蓝牙地址、
    RSSI值返回。以下是蓝牙返回的数据:
    
    +INQ:1234:46:0,1F1F,FFC2
    +INQ:C486:E9:1084A1,5A020C,FFC2
    +INQ:21:13:18B45,0,FFC4
    +INQ:B881:98:AEAF69,2A010C,FFD4
    我们根据这个算法可以将这些数据`+INQ:`和两个逗号之间的设备类型给去掉。并在recMsg这个
    全局数组结尾加上字符串结束符。
    

    服务器程序编写

    我用Java写了一个监听端口信息的程序,将获取到的有用数据保存到文本文件中。这个只是最初
    的版本。详细请参考另一篇博客:
    

    +Java端口监听

    运行结果展示

    运行结果

    后续工作

    现在基本上完成了硬件上的设计到数据的获取。后面我会利用获取到的数据进行函数拟合,得出
    RSSI值到距离的映射关系。并将此套程序进行完善。
    

    最后完整的代码我会在完全完成之后供上,各位莫急。有什么不妥的地方还请各位大侠不吝指教。

    展开全文
  • 基于STM32F103单片机智能手表GSM短信GPS定位设计,硬件软件均有,外加论文。
  • 前面两篇讲的是布局,连接设备,这一节我们来说一说如何通过蓝牙来发送接收数据吧、 大概步骤就是,我们先定义两个线程,分别是客户端的接收线程,还有服务端接收线程,这两个线程我们主要来接收数据,那个发送数据...

    前面两篇讲的是布局,连接设备,这一节我们来说一说如何通过蓝牙来发送接收数据吧、

    大概步骤就是,我们先定义两个线程,分别是客户端的接收线程,还有服务端接收线程,这两个线程我们主要来接收数据,那个发送数据,我们定义了一个send()方法,分别在oncread(),onItemClick()两个方法中调用(第一个是用给服务端发送数据,第二个是用来给客户端发送数据)。

    首先,我们涉及到聊天界面,肯定要用到消息处理,类似微信的聊天界面,我们在程序中就得自定义一下聊天界面。

    ①:新建消息类Msg,功能是将发送的消息显示在右边,接收的消息放在左边。

    public class Msg {
        public static final int TYPE_RECEIVED = 0;
        public static final int TYPE_SENT = 1;
        private String content;
        private int type;
        public Msg(String content, int type){
            this.content = content;
            this.type = type;
        }
        public String getContent(){
            return content;
        }
        public int getType(){
            return type;
        }
    
    }

    ②:新建MyAdapter适配器

    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
        private List<Msg> mMsgList;
        static class ViewHolder extends RecyclerView.ViewHolder{
            LinearLayout leftLayout;
            LinearLayout rightLayout;
            TextView leftMsg;
            TextView rightMsg;
            public ViewHolder(View view){
                super(view);
                leftLayout = (LinearLayout) view.findViewById(R.id.left_layout);
                rightLayout = (LinearLayout) view.findViewById(R.id.right_layout);
                leftMsg = view.findViewById(R.id.left_msg);
                rightMsg = view.findViewById(R.id.right_msg);
            }
        }
        public MyAdapter(List<Msg> msgList){
            this.mMsgList = msgList;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item,parent,false);
            ViewHolder holder =  new ViewHolder(view);
            return  holder;
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            Msg msg = mMsgList.get(position);
            if(msg.getType()==Msg.TYPE_RECEIVED){
                //如果收到消息,则在左边显示,右边隐藏
                holder.leftLayout.setVisibility(View.VISIBLE);
                holder.rightLayout.setVisibility(View.GONE);
                holder.leftMsg.setText(msg.getContent());
            }else if(msg.getType() == Msg.TYPE_SENT){
                holder.rightLayout.setVisibility(View.VISIBLE);
                holder.leftLayout.setVisibility(View.GONE);
                holder.rightMsg.setText(msg.getContent());
            }
        }
        @Override
        public int getItemCount() {
            return mMsgList.size();
        }
    }
    

    ③:回到我们的MainActivity,先定义线程,分别有服务端和客户端的,用来时刻接收数据。

     

    private RecyclerView msgRecyclerView;
    private List<Msg> msgList  = new ArrayList<>();
    private IntentFilter filter;
    private OutputStream os;
    private InputStream in;
    private SeverAcceptThread thread;
    private AcceptThread Thread1;
    private String content1;
    /**************************************客户端IO线程**********************************************/
        private class AcceptThread extends Thread{
            public void run() {
                try {
                        os = bluetoothSocket.getOutputStream();
                        in = bluetoothSocket.getInputStream();
                    while (true) {
                        // 创建一个128字节的缓冲
                        byte[] buffer = new byte[128];
                        // 每次读取128字节,并保存其读取的角标
                        int count = in.read(buffer);
                        // 创建Message类,向handler发送数据
                        Message msg = new Message();
                        // 发送一个String的数据,让他向上转型为obj类型
                        msg.obj = new String(buffer, 0, count);
                        // 发送数据
                        handler.sendMessage(msg);
                    }
                } catch (IOException e) {
                    Log.d("CZK","线程有问题");
                }
    
    
            }
        }
    
    /*************************************服务端IO线程**********************************/
    private class SeverAcceptThread extends Thread{
        private BluetoothServerSocket serverSocket;// 获取服务端接口
        private BluetoothSocket socket;// 获取到客户端的接口
        private InputStream is;// 获取到输入流
        private SeverAcceptThread(){
            try {
                // 通过UUID监听请求,然后获取到对应的服务端接口
                serverSocket = bluetoothAdapter
                        .listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        public void run(){
            try {
                Log.d("CZK","thread start");
                // 接收其客户端的接口
                socket = serverSocket.accept();
                // 获取到输入流
                is = socket.getInputStream();
                // 获取到输出流
                os = socket.getOutputStream();
                // 无线循环来接收数据
                while (true) {
                    // 创建一个128字节的缓冲
                    byte[] buffer = new byte[128];
                    // 每次读取128字节,并保存其读取的角标
                    int count = is.read(buffer);
                    // 创建Message类,向handler发送数据
                    Message msg = new Message();
                    // 发送一个String的数据,让他向上转型为obj类型
                    msg.obj = new String(buffer, 0, count);
                    // 发送数据
                    handler.sendMessage(msg);
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
    
    
    
    
        }
    }

     

    ④:定义send()方法,主要来发送数据

    /*****************************************send*****************************************/
    private void send(){
        msgRecyclerView = findViewById(R.id.recycler_view);
        editText = findViewById(R.id.input_text);
        send = findViewById(R.id.send1);
        LinearLayoutManager LayoutManager = new LinearLayoutManager(this);
        msgRecyclerView.setLayoutManager(LayoutManager);
        Myadapter = new MyAdapter(msgList);
        msgRecyclerView.setAdapter(Myadapter);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("CZK","click");
                content1 = editText.getText().toString();
                if(!"".equals(content1)) {
                    Msg msg1 = new Msg(content1, Msg.TYPE_SENT);
                    msgList.add(msg1);
                    Myadapter.notifyItemInserted(msgList.size()); //刷新
                    msgRecyclerView.scrollToPosition(msgList.size() - 1);       //定位
                    try {
                        os.write(content1.getBytes());
                        Log.d("CZK","向客户端发送消息成功");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    editText.setText("");
                }
            }
        });
    }

     

    ⑤:在之前的OnitemClick()中添加客户端线程并加入send()方法。

    //启动线程
    // 实例接收客户端传过来的数据线程
    Thread1 = new AcceptThread();
    // 线程开始
    Thread1.start();
    setContentView(R.layout.activity_main);
    setTitle("与"+ bluetoothDevice.getName()+"连接中");
    send();

    ⑥:重定义Handle类,用来处理接收的数据。

    /****************************************Handler****************************/
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Msg msg2 = new Msg(msg.obj.toString(),Msg.TYPE_RECEIVED);
            msgList.add(msg2);
            Myadapter.notifyItemInserted(msgList.size()); //刷新
            msgRecyclerView.scrollToPosition(msgList.size()-1);       //定位
        }
    };
    

     

    ⑦:onCreat()

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("蓝牙助手");
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // 用Set集合保持已绑定的设备
        Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
        if (devices.size() > 0) {
            for (BluetoothDevice bluetoothDevice : devices) {
                // 保存到arrayList集合中
                list.add(bluetoothDevice.getName() + ":"
                        + bluetoothDevice.getAddress() + "\n");
                adapter = new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,android.R.id.text1,list);
                listView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
    
            }
        }
        send();
        thread = new SeverAcceptThread();
        // 线程开始
        thread.start();
    
    }
    展开全文
  • (1)单片机可以32也可以51,如果想按照我的思路去做设计的话可以51。我的是51单片机的最小系统。51单片机最小系统如下图所示: (2) GPS指的是GPS模块,大家可以自行购买,一般几十块,我买的是...

    在做完这个毕业设计之后,一直想着抽时间写一下这个毕业设计的博客!!!
    先说一下基本设计思路吧!!希望对个位博友有用处。哈哈
    首先,从题目分析,即基于单片机&GPS的导航系统设计。
    (1)单片机可以用32也可以用51,如果想按照我的思路去做设计的话可以用51。我用的是51单片机的最小系统。51单片机最小系统如下图所示:
    在这里插入图片描述
    (2) GPS指的是GPS模块,大家可以自行购买,一般几十块,我买的是NEO-6M型号的GPS定位模块(GPSmini版)。如果大家不是专门搞研究的话,买mini版的即可,自带SMA接口用于连接天线,便于定位。GPS模块效果图如下图所示:
    在这里插入图片描述
    (3)导航系统指的是,手机程序APP的设计,具有导航的功能。
    其次,说一下大致设计思路。
    GPS定位模块接收位置信息,51单片机负责接收GPS模块接收的位置信息并解析(解析出时间,经纬度等),并通过蓝牙透传模块发送给手机APP(当然在此之前,手机APP里面要有接收蓝牙数据的相关程序),之后根据当前定到的位置(起点)以及终点搜索并规划行驶路线,从而实现定位+导航的功能。
    最后,讲一下硬件电路的设计。
    (1)51单片机我使用的是单片机最小系统。本页上图有效果图,还挺好用的,但是需要注意的是买一个好一点的最小系统,最好不要买我上图所示的那一种,里面的CH340(烧录代码需要的芯片)用了几次就烧坏了,导致我后面调试代码烧录进去的时候特别麻烦。
    对于51单片机的使用,需要注意:
    1,单片机串口通信问题:也就是SBUF的问题,他们是两个东西,一个是发送缓冲区,一个是接收缓冲区,只不过名字一样。对于SBUF(这里指接收)里面的数据如何到单片机,大家无须细究。只需知道,放在SBUF里面,单片机就会自动接收。对于单片机的发送(单片机是发送方,蓝牙或者其他传输模块是接收方)就是往单片机的SBUF(这里指发送)放入数据。这里不是很懂的可以自行百度,很重要。如果这个都不会,那么是无法进行下一步的。
    2,51单片机的主控芯片:大家可以使用STC89或者90系列的芯片,最好不要使用AT系列的,因为GPS数据很多,使用AT有可能不够用。我使用的是STC90C516RD+,现在市面上一般多用这个系列。
    3,51单片机一般都只有一个串口,即TXD和RXD引脚。不过对于该设计一个串口就够用了,亲测。网上很多帖子说不够用,他们没有考虑到具体情况。他们认为,需要单片机和GPS模块通信,需要单片机和蓝牙模块通信,通信串口就会出现不够用的问题。其实这个问题的解决有两个方法。第一,使用不只有一个串口的51单片机,如stc15系列,不过这样一来,需要了解关于双串口通信的知识。第二(推荐使用),这个设计无须实现双向通信。即对于GPS模块,只需发送即可,对于蓝牙模块只需接收即可。即实现单片机和GPS模块的单向通信(GPS的TXD连接单片机的RXD),单片机和蓝牙模块的单向通信。(单片机的TXD连接蓝牙模块的RXD),我使用的就是这个方法。
    4,对于串口出现乱码的问题,一般都是波特率的问题。对于蓝牙模块以及51单片机一般使用9600的波特率,一定要一致,否则会出现乱码的问题。
    好了,对于单片机的问题,就说这么多就够用啦 。
    (2)GPS定位模块,这个需要注意的就一个问题,就是需室外或者窗户旁边定位,不然不易定位,信号不好。
    (3)蓝牙模块大家可以自行购买。我使用的是HC-05模块,使用之前提前对其进行AT指令的配置,直接连接在51单片机上,即可实现透传功能(单片机给蓝牙模块法搜是那个什么内容,蓝牙模块就会原封不动地传送什么内容给手机APP)。大家无须了解蓝牙与手机通信的协议主机发送,从机响应什么的,便于上手。只需要知道其透传功能即可。
    (4)对于APP的设计,分为两个部分,一个是接收蓝牙模块发送的信息。另一个是对接收的定位信息进行定位以及导航。这部分可以使用E4A(一个中文编程工具,很好用),里面自带很多例程,可以直接使用。
    基本上,设计思路已经说得很清楚啦,需要注意的问题以及描述清楚。进一步的实施需要下一篇博客啦。

    展开全文
  • 笔者手机上装了很多App store上的蓝牙4.0 BLE的软件, 其中 AirLocate 是苹果公司推出iBeacon的测试软件, Locate iBeacons 是一款第三方的软件, 能实现iBeacon的距离定位和校准, 下面我们来看看 Locate...

             笔者手机上装了很多App store上的蓝牙4.0 BLE的软件, 其中 AirLocate 是苹果公司推出iBeacon的测试软件,  Locate iBeacons 是一款第三方的软件, 能实现iBeacon的距离定位和校准, 下面我们来看看 Locate iBeacons  实现的距离显示和室内定位。

     

    1】, 手机上安装 Locate iBeacons, 你的iphone至少是4s或以上, 系统必须是ios7.0以上, iphone4s ios7.0 以后的系统才支持蓝牙4.0BLE

      


    2】, 点击Locate iB  进去后如下图,


     

    3】, 点击 Locate iBeacons  进入如下界面,如果你的基站已经打开, 即可看到如图所示的设备, 下图中  就直接显示了你的手机与iBeacon基站间的距离, 这个距离可能随着不同的硬件设备而有所差异, 所以需要校准, 请看下一步如何校准。 这里为什么一打开这个软件就实现了距离显示了呢, 主要是 该软件内默认添加了苹果公司发布的UUID, 我们亦可以修改基站的uuid, 然后在该软件中添加该uuid, 同样也能实现该功能的,这个做起来就要深入开发了。

     


    4】,校准,  点击第一行 , 进入下一步。

     

      

    5】, 校准提示, 把你的iphone放到距离iBeacon基站约1米处, 按下Calibrate  , 并且保持30秒到1分钟, 过程如下面图。

     

     

    6】, 校准完毕, 下面图显示聚焦校准完毕了, 你可以随意拿你的iphone到处走, 神奇的iBeacon就告诉你你所处的距离, 如果有3个以上的iBeacon基站信号能够被收到, 那么就可以实现比较真正的室内定位了。

     


    7】, 显示距离如下。

      


    请观看视频

    http://v.youku.com/v_show/id_XNzc5MTUwMjM2.html

     

    8】, 结束, iBeaconios上的简单应用就是这样, 实际上里边包含了很多新颖的技术, 苹果公司现在正在大力推广iBeacon , 也即蓝牙4.0 BLE 室内定位技术, 这个东西可用的地方实在太多, 车位定位、图书馆定位、超市、游乐场、机场座位、入口、足球世界杯球场等你能想到的都可以用到, 你没想到的苹果公司也想到了, 还能用于移动支付, 这也是苹果公司的手机为什么一直都不使用NFC的原因, 目前美国已经在苹果商店以及不少游乐场里安装了iBeacon基站以及不少app开发商已经瞄准了这块大得难以想像的蛋糕, 我们拭目以待吧。

            

    【9】, 话外, 我们知道 苹果的 AirLocate是开源的,苹果在WWDC2013上放出的示例代码就有, 但是本文所 用的  Locate iBeacons 不是开源的, 但是可以从App store上免费下载免费使用, 笔者手头也有修改好的源码, 但是没有发布上App store上去, 毕竟要发布上去是件麻烦事, 我们还是把iBeacon基站做到性能最好优先。 后面我会发出更多的iBeacon相关的教程, 关注的朋友注意我csdn博客的更新吧。让我们一起见证iBeacon的成长。

       如果需要iBeacon基站开发, 请看这里  http://amomcu.taobao.com/ , 这里能提供基于cc2540cc2541的蓝牙4.0BLE开发的详细硬件和软件资料, QQ群257318688, 阿莫单片机论坛  www.AmoMcu.com  提供技术。

     

    展开全文
  • 今天到了第一批制作四旋翼飞行器的开发板和传感器,实现了最简单的Arduino UNO和Android手机间的蓝牙串口通讯和超声测距传感器的试用。 UNO连接蓝牙模块与安卓手机通讯教程" TITLE="Arduino UNO连接蓝牙模块与...
  • MicroPython以微控制器作为目标,从而使得Python可以用来控制硬件。说到MicroPython,也许有人会感到陌生。...MicroPython顾名思义就是运行在MCU的Python,换句话说Python可以让单片机行动起来了。MicroP...
  • stm32采集经纬度通过蓝牙模块发送给手机,手机解析经纬度,通过webview进行加载到地图,进行位置标记。
  • Android 蓝牙调试心得

    2020-05-15 19:21:02
    废话不多说,因为工作关系,这次接触到蓝牙功能开发,下面是我第一次蓝牙开发的经验总结,对于将要从事蓝牙开发的人,或许有些帮助。 Android蓝牙分为传统蓝牙开发和ble蓝牙开发。下面就有小伙伴疑问了,我该学习...
  • 连线方式是51单片机的rxd连接GPS模块的txd,GPS的vcc和gnd也带连接(具体都知道吧)51单片机的txd连接蓝牙模块的rxd,蓝牙模块的vcc和gnd也带连接(具体都知道吧),GPS和蓝牙模块的vcc连接单片机5v。APP的资源会上...
  • 本设计的宠物智能项圈应该可以实现的功能是追踪定位、电子宠物证、温度检测、检测异常叫声并音乐(主人声音)安抚、以及唤回(语音)宠物。明确了本设计的需求后,就可以选用适当的设备模块来满足我的设计需求。定位...
  • 作者:嵌入式老鸟火哥 授权转载于公众号嵌入式...尽管火哥目前从事Linux/Android方面的嵌入式开发工作,但是读书的时候也有5年左右单片机裸机和RTOS经验,之前面试也拿过一些做单片机stm32开发的offer, 所以今天分...
  • 蓝牙开发者基础知识

    2016-01-19 11:12:10
    一、 关于蓝牙芯片公司: ...学生蓝牙芯片基本都是CSR的,就像学生开发zigbee都TI的CC2531一样,CSR的芯片就像CC2531一样,是集成了RF收发模块的MCU,只不过CC2531是8051内核的,还有AD,串口
  • 南 阳 理 工 学 院 本科生毕业设计(论文) 学院(系):计算机与信息工程学院 专 业: 物联网工程 学 生: 乔蒙蒙 ...基于单片机&GPS的导航系统设计 Design of Navigation System Based on Sing...
  • 在嵌入式项目中,ADC作为信号采集的途径,使用频率极高。基本上哪里有信号采集哪里就有ADC。 但是ADC直接采集的信号值并不完全可靠。受具体环境的影响,信号值中掺有...而单片机过的朋友都了解,频率以Mh...
  • 关于8051的bootloader实现方式 一, 基本硬件需求要实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求 二, 空间划分一般...
  • 基于单片机和GPS定位农田面积测量仪设计(原理图+源程序+bom表+演示视频) 通过串口1连接ATK-NEO-6M GPS模块,然后通过液晶显示GPS信息,包括精度、纬度、高 度、速度、用于定位的卫星数、可见卫星数、UTC时间等信息。...
  • 使用STM32F103单片机+MC20 无线通信模块,MC20集成GPS、蓝牙、LBS基站定位、GPRS等功能是一款非常强的模块。使用它做一个GPS定位及基站定位,在室内或者隧道等没有GPS信号的情况下,自动切换成基站定位。将数据发送...
  • 前段时间买了个ATK的HC05蓝牙模块。HC05模块是一款高性能主从一体蓝牙串口模块,可以不用知道太多蓝牙相关知识就可以很好的上手。说白了,只是个蓝牙转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了...
1 2 3 4 5 ... 20
收藏数 623
精华内容 249
热门标签
关键字:

蓝牙定位用什么单片机