作者ixxogux (坚持阿伏哥连盟 )
看板java
标题[J2ME] [J2SE] 教学:蓝牙程式撰写
时间Thu Dec 11 18:13:27 2008
版权说明:
转载可以,但请不要无断转载(就是要留下我的id啦)
适用范围:
J2SE、J2ME、J2EE(我不知道可不可以,但是似乎也不需要)
前言:
在版上浏览也一阵日子了,发现或者是版面上文章均没有提到
如何撰写一个利用蓝牙来沟通的Java程式。几经摸索後,终於写出个
稍微像样的蓝牙程式。所以我打算留下些纪录,让後来需要使用蓝牙
的人能够少一些摸索的时间。
欢迎看完此篇教学的朋友们,有疑问有质疑请直接在版上回文。讨论
只会激起更多的学习火花!
这是非常粗略的教学,请大家手下留情阿!!
正名:
Bluetooth == 蓝牙 、不是蓝芽喔
本文写作目标:
我不以探讨蓝牙的架构为出发点,而是以一个如何快速上手蓝牙程式
撰写为目标。我将在文末附上一些参考资料,让有兴趣想要研究更深刻
一点的人能够有延伸阅读的机会。
另外,我目前只打算写Client端的部分,Server端的就请各位自己看
参考资料。(看懂Client端在干嘛,Server端就不是问题噜)
简易蓝牙概念说明:
要先告诉程式你本身的蓝牙装置在哪里,叫啥名字
LocalDevice local=LocalDevice.getLocalDevice();
接着请你的local指派出一个探员
DiscoveryAgent agent=local.getDiscoveryAgent();
你告诉探员:去吧,找出在我可触及的范围内有哪些蓝牙装置(RemoteDevice)
agent.startInquiry(DiscoveryAgent.GIAC,this);
一旦探员搜寻到装置,他会帮忙呼叫deviceDiscovered这个method
此时你要想办法把搜寻到的装置丢到一个篮子里记录起来。
当你的探员发现所有能被发现的装置都找到了,他会呼叫inquiryCompleted
可是呢,探员发现一件事情:光有装置好像没啥用处,我得要知道各个装置
有啥技能阿!(ex:会A2DP 、会档案传输...etc)
所以探员就先设定了一个"清单",打算再出门去一个装置一个装置地探访
//清单
int[] attributes = {0x100,0x101,0x102};
UUID[] uuids = new UUID[1];
uuids[0] = new UUID(0x1002); //0x1002表示公开可被搜寻的"技能"
//出门去找服务
agent.searchServices(attributes,uuids,RemoteDevice,this);
针对RemoteDevice找到他所有的技能了,探员很开心地呼叫servicesDiscovered
并把找到的技能丢到另外一个篮子里存起来
当全部的技能都被找到了,探员又呼叫了serviceSearchCompleted
告诉自己:终於把事情都做完了,可以安安心心地回家啦
主要内容:
以程式码片段来说明我想是最合适的方法。GUI介面的程式码将不会出现在
以下的说明中以免混淆视听。
import javax.bluetooth.*;
public class BluetoothConnection implements
DiscoveryListener{}
蓝牙本身的搜寻机制就是Listener的机制,叫做DiscoveryListener。这个Inter-
face 包括了四个abstract的method,分别是
1.
public void deviceDiscovered(RemoteDevice remoteDevice,DeviceClass deviceClass)
{
//如果搜寻中找到一个装置,就由JVM代为呼叫此method,通常在此method中
//我们会把remoteDevice丢到一个Vector内做储存的动作
}
2.
public void inquiryCompleted(int param)
{
//当搜寻结束(在蓝牙可搜寻到的范围内没有新的装置时,称为结束)
//JVM呼叫此Method
}
3.
public void servicesDiscovered(int transID,ServiceRecord[] serviceRecord)
{
//每"一个"装置找到所有services便由JVM呼叫此method
}
4.
public void serviceSearchCompleted(int transID, int responseCode)
{
//所有的装置的service都被找到了,JVM呼叫此method
}
那接下来呢?
是的,其实蓝牙这只是这麽一回事。重点是写程式的人要知道你要搜寻
什麽样的装置:蓝牙耳机、蓝牙键盘、蓝牙滑鼠...等。而这些装置有
什麽样的服务:档案传输、USB模拟..etc
我们就可以针对特定的 1. 装置 2. 服务 进行连线(配对)的动作
嘿嘿,说到连线是不是还少了些什麽呢?没错,就是URL。那URL怎麽来?
URL=serviceRecord.getConnectionURL(ServiceRecord.AUTHENTICATE_ENCRYPT,false);
只要存取搜寻到的serviceRecord就可以利用getConnectionURL来回传连线用
的URL。接着配合
conn = (StreamConnection) Connector.open(URL);
os = conn.openDataOutputStream();
is = conn.openDataInputStream();
想要接收传送资料都不成问题了。
参考资料:
//我写的程式码,大量参考 参考资料2 的内容。
参考资料1:
此程式是针对蓝牙的"名称"来做搜寻依据,而且所搜寻的服务乃是
序列埠服务(俗称RS232),可以依照自己需求看看参考资料二来修改
http://www.badongo.com/file/12430688
参考资料2:
某个外国大学的强者所写的论文。我放到便当狗去
http://www.badongo.com/file/12430554
档名:Masteroppgave.pdf
参考资料3:
Nokia官方教学,里面提到的观念与参考资料二略有不同,参考看看吧
http://www.forum.nokia.com/info/sw.nokia.com/id/125b7ff5-f2dd-4441-
8cfe-59e23c006373/MIDP_Bluetooth_API_Developers_Guide_v2_0_en.pdf.html
==
http://0rz.tw/e65bh
後话:
我省略了很多东西都没有提,因为这个蓝牙的架构实在是太大了。我想先提
供一点入门的讯息及程式码,让各位能够看的懂其他的资料,足矣。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.14.82
1F:推 jack21:用心~不推不行 12/11 23:22
2F:推 KOFXI:还不错~~ 感谢推^^ 12/12 00:08
3F:推 f953024:推~用心教学^^ 12/12 00:56
4F:推 runtime:不过我觉得在J2SE上提供的API有点鸡勒 不是很稳 12/12 04:36
5F:→ runtime:一层包一层 (ex:蓝芽棒附的软体) 用起来真的很麻烦 12/12 04:37
6F:→ ixxogux:runtime你蓝牙棒要买随插即用的就不用软体啦.. @_@ 12/12 06:57
7F:推 AI3767:感谢教学^^ 12/13 00:03
8F:推 cates:大推阿!!!为啥不早点PO 我浪费了很多时间找范例QQ 12/13 02:59
9F:→ ixxogux:因为我还没有搞懂之前不敢乱教阿...现在希望对你有用处 12/13 22:36
10F:推 imphs:专题看不懂弄好久~可惜已经毕业啦QQ~ 12/16 13:39
11F:推 moonjuice:好文推一个 12/17 22:57
12F:推 KanoLoa:太棒了! 02/25 16:44
13F:推 xpecial:超好笑的 11/04 17:08
14F:推 nigelchang:很好的教学 感谢推 03/01 13:53
15F:推 tyantmf:GOOD!!!!!! 01/06 15:00