除了购买专用的蓝牙抓包工具外,还有一个办法就是用 Android 手机。当然,在进行下一步之前,你需要: 1、执行 adb shell 连接到手机,然后执行 cat /etc/bluetooth/bt_stack_log.conf 命令,看其中的内容,你手机将捕获的日志放到什么地方了,如果放到 SD 卡根目录,那么,
月度归档: 2015年12月
[技巧] 使用虚拟串口来仿真测试串口通讯
好吧,现在许多软件仍然是通过串口通讯的方式来与底层的硬件通讯。不论是真串口,还是 USB->COM 出来的串口,总之是串口进行通讯。 我们做软件开发时,要与设备通讯,但是,如果硬件设备没有或者还在研发中怎么办?那就只能通过各种方式来模拟。 这里我知道的有两个选择: 1、使用虚拟机软件,无论是 VirtualBox
[代码] 调用ExitWindows 关闭系统
这个实际上有很多现成的代码了,这个代码是我自己改写的 Delphi 版的代码,可以在 Delphi/C++ Builder 中使用,已测试可以正常工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
type TShutdownAction = (saLogoff, saReboot, saPoweroff); function Shutdown(Action: TShutdownAction; AForce: Boolean): Boolean; function EnableShutdownPrivilege: Boolean; var hProcess, hToken: THandle; priv, lastpriv: TOKEN_PRIVILEGES; lastlen: Cardinal; const SE_SHUTDOWN_NAME: PWideChar = 'SeShutdownPrivilege'; begin FillChar(priv, sizeof(priv), 0); FillChar(lastpriv, sizeof(priv), 0); hProcess := GetCurrentProcess; Result := False; if OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then // 打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零) begin if LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, priv.Privileges[0].LUID) then begin priv.PrivilegeCount := 1; // 欲调整的权限个数 priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; // 权限的属性,SE_PRIVILEGE_ENABLED为使能该权限 if AdjustTokenPrivileges(hToken, False, priv, sizeof(priv), lastpriv, lastlen) then // 调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零) Result := GetLastError = ERROR_SUCCESS; end; CloseHandle(hToken); end; end; var AFlags: Integer; begin Result := EnableShutdownPrivilege; if Result then // 使能关机特权函数 begin if AForce then AFlags := EWX_FORCE else AFlags := 0; case Action of saLogoff: AFlags := AFlags or EWX_LOGOFF; saReboot: AFlags := AFlags or EWX_REBOOT; saPoweroff: AFlags := AFlags or EWX_SHUTDOWN; end; Result := ExitWindowsEx(AFlags, 0) // 强制关机 end; end; |
[FMX] 在 Delphi/C++ Builder 中开发低功耗蓝牙设备
从蓝牙4.0开始定义了不同类型的蓝牙协议,原来的蓝牙协议改称为经典蓝牙(Classic Bluetooth),新的低功耗版本被称为BLE(Bluetooth Low Energy)。 要在 Delphi 或 C++ Builder 中使用低功能蓝牙,需要做以下步骤: 1、在你的工程中放一个 TBlueToothLE 组
[FMX] 低功耗蓝牙开发知识:服务名称及ID
//基础ID 服务名称:Base GUID 服务编码:{00000000-0000-1000-8000-00805F9B34FB} // GATT 配置 服务名称:GAP 服务编码:{00001800-0000-1000-8000-00805F9B34FB} 服务名称:GATT 服务编码:{00001801-0000-
[技巧] 让一个后台 TTabSheet 上的控件切换到前台并获得焦点
实际上,这个函数并不只能完成上面的功能,它是让一个控件获得焦点,当它在后台的 TTabSheet 页面上时,会将所在的 TabSheet 设置为活动页面,然后再切换获得焦点。当然,如果它本身不能获得焦点,那么,会让其父获得焦点,依次类推。 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function ForceFocus(ACtrl: TWinControl): Boolean; var AParent: TWinControl; begin AParent := ACtrl.Parent; if Assigned(AParent) then begin if AParent is TTabSheet then begin (AParent as TTabSheet).PageControl.ActivePage := AParent as TTabSheet; Result := ForceFocus(AParent); end else Result := ForceFocus(AParent); end else Result:=True; if Result then begin Result := ACtrl.CanFocus; if Result then ACtrl.SetFocus; end; end; |
调
[Java] 在JSP中读取POST的JSON数据
jsp是开发bs的利器。在jsp中我们可以很方便的使用JSON来开发一个数据接口。 今天我想实现的例子是: 接收客户端(浏览器、APP)通过POST方式提交的JSON数据。 解析接收到数据,如果存在”username”则返回用户名,否则返回一个错误。 我使用java-ee作为开发环境,项目结构如
密码保护:[译]RAD Studio 移动开发(西雅图版)- 使用 Tab 组件来显示页(iOS 和 Android)
无法提供摘要。这是一篇受保护的文章。
[专题] Delphi/C++ Builder 移动开发教程
本文翻译自 Delphi/C++ Builder 英文帮助,翻译采用中英文混排。如果中文看的有歧义,请参考英文原文理解。 英文原版在线访问 前言 在Mac(iOS)上配置你的开发环境 配置你 Windows PC上的开发环境(iOS) 配置你 Windows PC上的开发环境(Android) 创建一个移动平台应用程序
密码保护:[译]RAD Studio 移动开发(西雅图版)- 使用浏览器组件(iOS 和 Android)
无法提供摘要。这是一篇受保护的文章。
[QMacros] 更新:新增内置的参数化宏定义支持
【更新说明】 新版本的 QMacros 新增宏定义的参数化支持,通过支持参数化,从而让非固定值的宏能够根据参数做出适当的变化,为应用的开发提供更好的支持。 下面是一个参数化宏替换的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
procedure TForm1.Button1Click(Sender: TObject); var AMgr: TQMacroManager; ACompiled: TQMacroComplied; I: Integer; begin AMgr := TQMacroManager.Create; mmResults.Lines.BeginUpdate; try AMgr.Push('Rand', DoRandValue); ACompiled := AMgr.Complie(edtExpr.Text, '%', '%', MRF_PARSE_PARAMS); for I := 0 to 9 do mmResults.Lines.Add(ACompiled.Replace); finally if Assigned(ACompiled) then FreeAndNil(ACompiled); FreeAndNil(AMgr); mmResults.Lines.EndUpdate; end; end; procedure TForm1.DoRandValue(AMacro: TQMacroItem; const AQuoter: QCharW); var AMin: Integer; begin // Rand(),Rand(Max),Rand(Min,Max) if Assigned(AMacro.Params) and (AMacro.Params.Count > 0) then begin if AMacro.Params.Count = 1 then AMacro.Value.Value := IntToStr(Random(AMacro.Params[0].AsInteger)) else AMacro.Value.Value := IntToStr(AMacro.Params[0].AsInteger + Random(AMacro.Params[1].AsInteger - AMacro.Params[0].AsInteger)); end else AMacro.Value.Value := FloatToStr(Random); end; |
注意:使用参数化宏替换时,必需指定 MRF_PARSE_PARAM
[QMacros] 一个参数化宏替换的示例代码
【注】 QMacros 已经内置了参数化的支持,请大家参考 :[QMacros] 更新:新增内置的参数化宏定义支持 下面的代码是给群里的一位朋友写的 QMacros 的一个简单的示例,通过参数控制宏替换时的值的范围。但这个代码只是一个简单的示例,创建的 PRangeMacro 实例未在最后释放,请大家使用时,自行加上相
密码保护:[译]RAD Studio 移动开发(西雅图版)- 使用一个 MultiView 组件来显示信息的备选视图
无法提供摘要。这是一篇受保护的文章。
密码保护:[译]RAD Studio 移动开发(西雅图版)- 配置 Android 应用使用 Google 地图
无法提供摘要。这是一篇受保护的文章。
密码保护:[译]RAD Studio 移动开发(西雅图版)- 使用一个地图控件来操控地图( iOS 和 Android )
无法提供摘要。这是一篇受保护的文章。
[RVMedia] 在捕获视频时画面中叠加自绘内容
RVCamViewer 是 RVMedia 输出视频的对象,它提供了一个 OnPaint 事件,我们可以在其中控制要呈现给用户的内容。 下面的例子,我就在画面的右上角呈现了已经录制的时间,其中用到的 RollupTime 函数,请到 QString.pas 里找。 [crayon-6001df73821d2125302
[FFMPEG] 使用 FFMPEG 将 MJPEG 格式转换为 H.264 格式的 MP4
这几天,用RVMedia的从摄像头抓取视频,但RVMedia 4.0.2 只支持录制成 MJPEG 格式,而 MJPEG 的格式是以JPEG 格式存贮的图片序列,只是在前面加上了一个 MIME 信息,其格式参考 http://blog.chinaunix.net/uid-22670933-id-1771591.html
[教程]枚举指定进程的所有窗口
实际上,这个的核心是用于一个 GetWindowThreadProcess 的 API 函数,通过它可以确定指定的窗口所隶属的进程。然后,结合 EnumWindows 就可以完成这一操作了。假设我们将所有的窗口句柄到一个 TList 中,我们大概的代码逻辑如下: [crayon-6001df73824d07909717
[教程] 获取当前进程的父进程
有时候,我们创建了一个子进程,我们需要知道自己所隶属的父进程的ID。有几个办法,一个是调用微软未公开的 NtQueryInformationProcess 函数,另一个就是下面提供的一个函数,利用了公开的函数,运行需要包含 tlhelp32 单元。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function GetParentProcessId: Cardinal; var hSnapshot: THandle; AEntry: TProcessEntry32; begin Result := 0; hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if hSnapshot <> INVALID_HANDLE_VALUE then begin try AEntry.dwSize := sizeof(TProcessEntry32); if Process32First(hSnapshot, AEntry) then begin repeat if AEntry.th32ProcessID = GetCurrentProcessId then begin Result := AEntry.th32ParentProcessID; break; end; until not Process32Next(hSnapshot, AEntry); end; finally CloseHandle(hSnapshot); end; end; end; |
这个
密码保护:[译]RAD Studio 移动开发(西雅图版)- 使用下拉列表框从列表中选择项目
无法提供摘要。这是一篇受保护的文章。