QQ群①:120292508(满)
QQ群②:93064193
应用程序利用此SDK获取定位依据(一个采用hex编码的二进制字符串,包含了定位所需的无线网络信息,详情请参阅驴博士定位基本原理)。此SDK包含以下文件
WifiLocation.dll 为 C++ 应用程序导出了 CWifiLocation 类,为 C 程序导出了 LBS_GetLocationInfo 等函数, 详情参见SDK中的 WifiLocationAPI.h 文件。
基本步骤如下:
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# 可以通过 P/Invoke 功能调用 WifiLocation.dll 中的 C 函数。大致可分为三个步骤:
以下是一个名为 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();
}
}
}