用户登录
Windows
驴博士 SDK for Android

驴博士 SDK for Windows

概述

应用程序利用此SDK获取定位依据(一个采用hex编码的二进制字符串,包含了定位所需的无线网络信息,详情请参阅驴博士定位基本原理)。此SDK包含以下文件

  • WifiLocation.dll
  • WifiLocationAPI.h
  • WifiLocation.lib

WifiLocation.dll 为 C++ 应用程序导出了 CWifiLocation 类,为 C 程序导出了 LBS_GetLocationInfo 等函数, 详情参见SDK中的 WifiLocationAPI.h 文件。

在 C++ 程序中使用驴博士

基本步骤如下:

1. 定义CWifiLocation类型成员变量

//CUseLocation.h
class CUseLocation
{
    ……
    CWifiLocation m_wifiLocation;
}

2. 设置属性,CWifiLocation有自己的属性默认值,如果第三方不进行设置,则直接使用默认属性值。

m_wifiLocation. SetSensor ( e_sens_mid );            //设置灵敏度为中
m_wifiLocation. SetFrequency ( 60, 300 );            //设置最大最小时间颗粒度

3. 启动采集定位数据

m_wifiLocation.Start();

说明:启动定位插件。应该在主程序启动后即启动。

4. 回调函数中处理数据

m_wifiLocation.GetWaitEvent();
dwRet = m_wifiLocation.GetLocationInfo( ∧pData, nDataLen );

说明:pData所指向的内存空间由定位API负责管理,当创建CWifiLocation类对象的实例时,申请该内存空间,销毁CWifiLocation类对象的实例时,释放该空间。pData所指向的内容,在两次调用之间维持不变。

5. 定位结束

m_wifiLocation.Stop();

说明:停止定位线程。应该在主程序终止前才停止定位线程。

在 C# 程序中使用驴博士

C# 可以通过 P/Invoke 功能调用 WifiLocation.dll 中的 C 函数。大致可分为三个步骤:

  1. 把 WifiLocation.dll 放到此C#工程的输出路径(bin\Release\ 和 bin\Debug\ 中)
  2. 用 DllImport 指令声明 WifiLocation.dll 中的 C 函数
  3. 调用

以下是一个名为 lbs_cs_demo 的C#程序的 Form1.cs 代码,演示了如何调用驴博士客户端API获取定位依据。这 个程序所需的窗体控件都是在运行时生成的,所以你只要在自己的电脑上创建一个同名工程,覆盖其中的 Forms.cs 文件应该就可以运行了。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace lbs_cs_demo
{
    public partial class Form1 : Form
    {
        // 声明 WifiLocation.dll 中的函数。
        // 请把 WifiLocation.dll 放到此C#工程的输出路径(bin\Release\ 和 bin\Debug\ 中)。
        [DllImport("WifiLocation.dll")]
        static extern bool LBS_Start();

        [DllImport("WifiLocation.dll")]
        static extern bool LBS_Stop();

        [DllImport("WifiLocation.dll")]
        static extern int LBS_GetWaitEvent();

        [DllImport("WifiLocation.dll")]
        static extern int LBS_GetLocationInfo(byte[] buffer, int nBufferLen, out int nWrite);

        [DllImport("WifiLocation.dll")]
        static extern bool LBS_SetFrequency(int minFrequency, int maxFrequency);

        TextBox txt_data = null;

        public Form1()
        {
            InitializeComponent();

            Text = "驴博士测试";

            Button btn_refresh_ticket = new Button();
            btn_refresh_ticket.Text = "刷新";
            btn_refresh_ticket.MouseClick += new MouseEventHandler(btn_refresh_ticket_MouseClick);
            Controls.Add(btn_refresh_ticket);

            txt_data = new TextBox();
            txt_data.Multiline = true;
            txt_data.Height = ClientRectangle.Height - btn_refresh_ticket.Height;
            txt_data.Dock |= DockStyle.Bottom;
            Controls.Add(txt_data);
        }

        void btn_refresh_ticket_MouseClick(object sender, MouseEventArgs e)
        {
            int buflen = 4096;
            byte[] buffer = new byte[buflen];
            int nwrite;

            // 获取定位依据
            // 由于实现的限制,一定时间间隔内重复调用此函数可能得到相同的结果,这是一个已知问题。
            int r = LBS_GetLocationInfo(buffer, buflen, out nwrite);

            string ticket = Encoding.ASCII.GetString(buffer); 
            // hex编码的二进制数据,里面包含了无线网络信息,作为定位参数
            Console.WriteLine(string.Format("call status: {0}\n{1}", r, ticket));
            txt_data.Text = string.Format("call status: {0}\r\n{1}", r, ticket);

            // todo: 把 ticket 发送到驴博士服务器可换取经纬度,
            // 具体方法请参考驴博士网站上的定位协议(http://lbs.org.cn/prot_loc.php)

        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            LBS_SetFrequency(5, 30);
            LBS_Start();
            LBS_GetWaitEvent();
        }

        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            LBS_Stop();
        }
    }
}