




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前提: 1. 使用真机测试 2. 测试前请蓝牙配对好手机与PC机蓝牙适配器(所以你需要一个蓝牙适配器插入PC USB口)demo测试效果: 当手机左右摇摆时将数据传递到PC端,打印出来。(android重力感应)PC服务端代码:Java代码 1. importjava.io.IOException; 2. importjava.io.InputStream; 3. 4. importjavax.microedition.io.Connector; 5. importjavax.microedition.io.StreamConnection; 6. importjavax.microedition.io.StreamConnectionNotifier; 7. 8. publicclassBTServerimplementsRunnable 9. 10. /流连接通知用于创建流连接 11. privateStreamConnectionNotifiermyPCConnNotifier=null; 12. /流连接 13. privateStreamConnectionstreamConn=null; 14. /接受数据字节流 15. privatebyteacceptedByteArray=newbyte12; 16. /读取(输入)流 17. privateInputStreaminputStream=null; 18. 19. /* 20. *主线程 21. * 22. *paramargs 23. */24. publicstaticvoidmain(Stringargs) 25. newBTServer(); 26. 27. 28. /* 29. *构造方法 30. */31. publicBTServer() 32. try 33. /得到流连接通知,下面的UUID必须和手机客户端的UUID相一致。 34. myPCConnNotifier=(StreamConnectionNotifier)Connector 35. .open(btspp:/localhost:0000110100001000800000805F9B34FB); 36. catch(IOExceptione) 37. /TODOAuto-generatedcatchblock 38. e.printStackTrace(); 39. 40. /打开连接通道并读取流线程 41. newThread(this).start(); 42. 43. 44. Override45. publicvoidrun() 46. try 47. StringinSTR=null; 48. /持续保持着监听客户端的连接请求 49. while(true) 50. /获取流连接 51. streamConn=myPCConnNotifier.acceptAndOpen(); 52. /获取流通道 53. inputStream=streamConn.openInputStream(); 54. /读取字节流 55. while(inputStream.read(acceptedByteArray)!=-1) 56. inSTR=newString(acceptedByteArray); 57. System.out.println(inSTR); 58. if(inSTR.contains(EXIT) 59. /手机客户端退出则关闭连接通道。 60. inputStream.close(); 61. if(streamConn!=null) 62. streamConn.close(); 63. 64. break; 65. 66. 67. 68. catch(IOExceptione) 69. e.printStackTrace(); 70. 71. 72. import java.io.IOException;import java.io.InputStream;import javax.microedition.io.Connector;import javax.microedition.io.StreamConnection;import javax.microedition.io.StreamConnectionNotifier;public class BTServer implements Runnable / 流连接通知 用于创建流连接private StreamConnectionNotifier myPCConnNotifier = null;/ 流连接private StreamConnection streamConn = null;/ 接受数据字节流private byte acceptedByteArray = new byte12;/ 读取(输入)流private InputStream inputStream = null;/* * 主线程 * * param args */public static void main(String args) new BTServer();/* * 构造方法 */public BTServer() try / 得到流连接通知,下面的UUID必须和手机客户端的UUID相一致。myPCConnNotifier = (StreamConnectionNotifier) Connector.open(btspp:/localhost:0000110100001000800000805F9B34FB); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/ 打开连接通道并读取流线程new Thread(this).start();Overridepublic void run() try String inSTR = null;/ 持续保持着监听客户端的连接请求while (true) / 获取流连接streamConn = myPCConnNotifier.acceptAndOpen();/ 获取流通道inputStream = streamConn.openInputStream();/ 读取字节流while (inputStream.read(acceptedByteArray) != -1) inSTR = new String(acceptedByteArray);System.out.println(inSTR);if (inSTR.contains(EXIT) / 手机客户端退出则关闭连接通道。inputStream.close();if (streamConn != null) streamConn.close(); break; catch (IOException e) e.printStackTrace();服务端请导入bluecove.jar 和 commons-io.jar包android手机客户端代码:BlueTooth.javaJava代码 1. packagecom.royal.bluetooth; 2. 3. importjava.io.IOException; 4. importjava.io.OutputStream; 5. importjava.util.UUID; 6. 7. importandroid.app.Activity; 8. importandroid.app.AlertDialog; 9. importandroid.app.AlertDialog.Builder; 10. importandroid.bluetooth.BluetoothAdapter; 11. importandroid.bluetooth.BluetoothDevice; 12. importandroid.bluetooth.BluetoothSocket; 13. importandroid.content.DialogInterface; 14. importandroid.content.Intent; 15. importandroid.hardware.Sensor; 16. importandroid.hardware.SensorEvent; 17. importandroid.hardware.SensorEventListener; 18. importandroid.hardware.SensorManager; 19. importandroid.os.Bundle; 20. importandroid.view.Gravity; 21. importandroid.view.KeyEvent; 22. importandroid.view.Window; 23. importandroid.view.WindowManager; 24. importandroid.widget.Toast; 25. 26. /* 27. *BlueTooth&Sensor 28. * 29. *authorroyal 30. * 31. */32. 33. publicclassBlueToothextendsActivity 34. 35. privatestaticfinalintREQUEST_DISCOVERY=0x1; 36. /建立蓝牙通信的UUID 37. privatestaticfinalUUIDuuid=UUID.fromString(00001101-0000-1000-8000-00805F9B34FB); 38. /自带的蓝牙适配器 39. privateBluetoothAdapterbluetoothAdapter=null; 40. /扫描得到的蓝牙设备 41. privateBluetoothDevicedevice=null; 42. /蓝牙通信socket 43. privateBluetoothSocketbtSocket=null; 44. /手机输出流 45. privateOutputStreamoutStream=null; 46. privatebytemsgBuffer=null; 47. /传感器管理 48. privateSensorManagersensorMgr=null; 49. /传感器感应 50. privateSensorsensor=null; 51. /手机x、y、z轴方向数据 52. privateintx,y,z; 53. 54. /* 55. *当这个activity第一次被创建的时候呼叫该方法 56. */57. Override58. publicvoidonCreate(BundlesavedInstanceState) 59. super.onCreate(savedInstanceState); 60. 61. /*使程序窗口全屏*/62. /创建一个没有title的全屏主题 63. this.setTheme(android.R.style.Theme_NoTitleBar_Fullscreen); 64. /窗口全屏 65. this.requestWindowFeature(Window.FEATURE_NO_TITLE); 66. /设置全屏标志 67. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 68. WindowManager.LayoutParams.FLAG_FULLSCREEN); 69. 70. /按bluetooth.xml文件布局风格 71. setContentView(R.layout.bluetooth); 72. 73. /Gravitysensing获取传感器 74. sensorMgr=(SensorManager)this.getSystemService(SENSOR_SERVICE); 75. sensor=sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 76. 77. /获取手机默认上的蓝牙适配器 78. bluetoothAdapter=BluetoothAdapter.getDefaultAdapter(); 79. 80. /开启手机蓝牙设备 81. bluetoothAction(); 82. 83. /查询附近所有的蓝牙设备并选择连接 84. connectToDevice(); 85. 86. 87. /* 88. *蓝牙开始查询手机是否支持蓝牙,如果支持的话,进行下一步。查看蓝牙设备是否已打开,如果否则打开。 89. */90. publicvoidbluetoothAction() 91. /查看手机是否有蓝牙设备功能 92. if(hasAdapter(bluetoothAdapter) 93. if(!bluetoothAdapter.isEnabled() 94. /开启蓝牙功能 95. bluetoothAdapter.enable(); 96. 97. else 98. /程序终止 99. this.finish(); 100. 101. 102. 103. /* 104. *查看手机是否有蓝牙设备功能 105. * 106. *paramba 107. *蓝牙设备适配器 108. *returnboolean 109. */110. publicbooleanhasAdapter(BluetoothAdapterba) 111. if(ba!=null) 112. returntrue; 113. 114. displayLongToast(该手机没有蓝牙功能!); 115. returnfalse; 116. 117. 118. /* 119. *创建一个长时间弹出的提示窗口toast 120. * 121. *paramstr 122. *提示字符串 123. */124. publicvoiddisplayLongToast(Stringstr) 125. Toasttoast=Toast.makeText(this,str,Toast.LENGTH_LONG); 126. toast.setGravity(Gravity.TOP,0,220); 127. toast.show(); 128. 129. 130. /* 131. *创建一个短时间弹出的提示窗口toast 132. * 133. *paramstr 134. *提示字符串 135. */136. publicvoiddisplayShortToast(Stringstr) 137. Toasttoast=Toast.makeText(this,str,Toast.LENGTH_SHORT); 138. toast.setGravity(Gravity.TOP,0,220); 139. toast.show(); 140. 141. 142. /* 143. *蓝牙若启动,则查询附近的所有蓝牙设备进行选择连接 144. */145. publicvoidconnectToDevice() 146. if(bluetoothAdapter.isEnabled() 147. /跳到另一个activity-DiscoveryActivity,该类用于查询附近所有的蓝牙设备。 148. Intentintent=newIntent(this,DiscoveryActivity.class); 149. /弹出窗口提示 150. displayLongToast(请选择一个蓝牙设备进行连接!); 151. 152. /手机此时跳进DiscoveryActivity程序界面。 153. /注意:利用startActivityForResult回调数据返回当前的程序。 154. /详细参考:/blog/static/440058201073025132670/ 155. this.startActivityForResult(intent,REQUEST_DISCOVERY); 156. else 157. this.finish(); 158. 159. 160. 161. /* 162. *startActivityForResult触发调用DiscoveryActivity后进行处理 163. *获取到相应的蓝牙地址数据后,开始我们核心的数据交互 164. */165. Override166. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata) 167. /TODOAuto-generatedmethodstub 168. /super.onActivityResult(requestCode,resultCode,data); 169. 170. /这里确保相互回调时数据的准确传输 171. if(requestCode!=REQUEST_DISCOVERY) 172. return; 173. 174. if(resultCode!=RESULT_OK) 175. return; 176. 177. 178. /获取到DiscoveryActivity点击项后传过来的蓝牙设备地址 179. StringaddressStr=data.getStringExtra(address); 180. /根据蓝牙设备地址得到该蓝牙设备对象(这是扫描到的蓝牙设备哦,不是自己的) 181. device=bluetoothAdapter.getRemoteDevice(addressStr); 182. try 183. /根据UUID创建通信套接字 184. btSocket=device.createRfcommSocketToServiceRecord(uuid); 185. catch(Exceptione) 186. displayLongToast(通信通道创建失败!); 187. 188. 189. if(btSocket!=null) 190. try 191. /这一步一定要确保连接上,不然的话程序就卡死在这里了。 192. btSocket.connect(); 193. displayLongToast(通信通道连接成功!); 194. catch(IOExceptionioe) 195. displayLongToast(通信通道连接失败!); 196. try 197. btSocket.close(); 198. displayLongToast(通信通道已关闭!); 199. catch(IOExceptionioe2) 200. displayLongToast(通信通道尚未连接,无法关闭!); 201. 202. 203. try 204. /获取输出流 205. outStream=btSocket.getOutputStream(); 206. /手机发出数据 207. sendSensorData(); 208. catch(IOExceptione) 209. displayLongToast(数据流创建失败!); 210. 211. 212. 213. 214. /* 215. *发送数据发出从手机通过重力感应器获取到的数据 216. */217. publicvoidsendSensorData() 218. /重力感应监听 219. SensorEventListenerlsn=newSensorEventListener() 220. /重写内部方法,当精确度发生变化是触发该方法。 221. Override222. publicvoidonAccuracyChanged(Sensors,intaccuracy) 223. /TODOAuto-generatedmethodstub 224. 225. 226. /重写内部方法,当数据发生变化的时候触发该方法。 227. Override228. publicvoidonSensorChanged(SensorEventse) 229. /TODOAuto-generatedmethodstub 230. /* 231. *当手机横向头部朝左屏幕正对自己时x=10,y=0,z=0;当手机竖向屏幕正对自己时x=0,y=10,z=0; 232. *当手机平放屏幕朝上时x=0,y=0,z=10;由此可知:当手握手机且竖向屏幕正对自己时,有:水平就是X轴 233. *垂直就是Y轴屏幕所对方向便是Z轴具体可参考简单例子-SensorDemo 234. */235. x=(int)se.valuesSensorManager.DATA_X; 236. y=(int)se.valuesSensorManager.DATA_Y; 237. z=(int)se.valuesSensorManager.DATA_Z; 238. if(y5|y5|y-5) 250. /DataModeldataModel=newDataModel(x,y,z); 251. /try 252. /System.out.println(x=+x+y=+y+z=+z); 253. /msgBuffer=dataModel.convertSelfToByteArray(); 254. /System.out.println(-+msgBuffer.length); 255. /outStream.write(msgBuffer); 256. /catch(IOExceptione) 257. /Log.e(BlueTooth,e.getMessage(); 258. /e.printStackTrace(); 259. /displayShortToast(数据发送失败!); 260. / 261. / 262. 263. ; 264. 265. 266. /别忘了注册重力感应器,由于android的一些东东是又很大一部分都要这么干的。 267. /所有要注意。比如蓝牙这块,在对它打开的时候其实你也要注册权限的。看AndroidManifest.xml文件。 268. sensorMgr 269. .registerListener(lsn,sensor,SensorManager.SENSOR_DELAY_GAME); 270. 271. 272. /以下是退出程序的一些操作,不关核心功能的事/ 273. /* 274. *重写方法:点击返回键,确认是否退出程序。 275. */276. Override277. publicbooleanonKeyDown(intkeyCode,KeyEventevent) 278. /TODOAuto-generatedmethodstub 279. if(keyCode=KeyEvent.KEYCODE_BACK) 280. BuilderalertDialog=newAlertDialog.Builder(this); 281. /设置弹出框的图标 282. alertDialog.setIcon(R.drawable.icon); 283. /设置弹出框的title 284. alertDialog.setTitle(R.mpt); 285. /设置弹出框的提示信息 286. alertDialog.setMessage(R.string.quit); 287. /设置弹出框确认键触发事件 288. alertDialog.setPositiveButton(R.string.confirm, 289. newDialogInterface.OnClickListener() 290. Override291. publicvoidonClick(DialogInterfacedialog, 292. intwhichButton) 293. /TODOAuto-generatedmethodstub 294. try 295. outStream.write(QUIT.getBytes(); 296. btSocket.close(); 297. catch(IOExceptione) 298. /TODOAuto-generatedcatchblock 299. e.printStackTrace(); 300. 301. finish(); 302. 303. ); 304. /设置弹出框取消键触发事件(不做任何操作) 305. alertDialog.setNegativeButton(R.string.cancel, 306. newDialogInterface.OnClickListener() 307. Override308. publicvoidonClick(DialogInterfacedialog,intwhich) 309. /TODOAuto-generatedmethodstub 310. 311. ); 312. /显示弹出框 313. alertDialog.show(); 314. returntrue; 315. else 316. /如果点击的不是返回键按钮,那么该做什么操作就做什么操作。 317. returnsuper.onKeyDown(keyCode,event); 318. 319. 320. 321. /* 322. *重写方法:销毁线程,退出系统。 323. */324. Override325. protectedvoidonDestroy() 326. /TODOAuto-generatedmethodstub 327. super.onDestroy(); 328. System.exit(0); 329. 330. 331. package com.royal.bluetooth;import java.io.IOException;import java.io.OutputStream;import java.util.UUID;import android.app.Activity;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothSocket;import android.content.DialogInterface;import android.content.Intent;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城乡居民增收促进行动实施方案
- 《量子力学简介:高中物理高级知识教学教案》
- 英汉名词单复数形式差异教案
- 月光下的村庄写景文(7篇)
- 高一(上)物理阶段检测卷一
- 2021学年上海建平中学高一(下)期中历史试题及答案
- 《长笛初级技巧与演奏练习教案》
- 婚内防协议书范本
- 为人需当孝父母作文900字(8篇)
- 八德之星活动方案
- 基于感性工学
- 丝绸产业品牌建设-洞察分析
- 【机器人】2021年全球外骨骼机器人产业研究报告-CBInsights
- 人工智能导论知到智慧树章节测试课后答案2024年秋天津大学
- 智慧燃气系统建设方案
- 【MOOC】作物育种学-四川农业大学 中国大学慕课MOOC答案
- 博士生经验分享模板
- 2024年浙江绍兴诸暨市交通运输局下属事业单位招聘编外用工6人历年管理单位遴选500模拟题附带答案详解
- 学校保安保洁及宿管服务投标方案(技术方案)
- 临床成人失禁相关性皮炎的预防与护理团体标准解读
- 医疗器械公司组织机构图和部门设置说明
评论
0/150
提交评论